重磅 | EOS智能合约被爆整型溢出等漏洞,可致交易归零!

编者按:这段时间EOS真不消停,一波未平一波又起,先是被大佬说传销币,接着是价格大幅跳水,猛如虎的安全公司也没闲着,接连爆出安全漏洞。 这不,刚缓了几天,又被发现了合约上的漏洞——EOS代币合约存在整型溢出等问题,部分合约实现不够严谨。这一问题严重时可能会引发交易所市值归零,给项目方、Token持有者带来惨痛且不可挽回的损失。 今天,我们邀请了成都链安科技CEO杨霞,就EOS的这一安全漏洞从技术上进行解析。同时,给开发者一些切实的指引,以免承受巨额损失。

最近,我们在审计客户合约时发现:EOS代币合约存在整型溢出等问题,部分合约实现不够严谨。

具体包括

  • 整型溢出错误;
  • 权限检查不严谨;
  • API函数的不规范使用;
  • 常规代码错误。

为了使开发者在合约开发中不掉进坑里,我们接下来就一一对上述问题进行分析。并且给出合理的解决办法,让开发者不至被黑客利用。

让我们直奔主题。

问题出在EOS的代币合约

这次漏洞的主要原因,在于EOS的代币合约有不严谨之处,主要体现在以下4个方面:

1. 整型溢出错误

使用自己的数据结构描述代币,对代币数值进行算数运算时未进行安全检查。在误操作时容易产生整型溢出错误,可能导致代币量归零甚至变成负数的严重后果!

2. 权限检查不严谨

权限检查不严谨,造成逻辑漏洞。部分代币合约设置了「冻结账户和代币」的功能,然而用户们却将检查 「冻结」 的代码放在transfer(转账)函数中,从而导致执行issue(发行代币)的时候不受「冻结」状态影响,可以任意增发代币。参考以下代码。

3. API函数的不规范使用

这里指的是开发者要注意EOS API函数的参数类型。

例如:string_to_symbol(uint8_t , const char *),

第一个参数传入的整型变量需要小于256,若使用该API前未对输入进行检查,则可能导致整型溢出,从而导致操作了错误类型的代币,带来严重后果

4. 常见代码错误

数据库API使用不严谨,如multi_index中提供的getfind。其中get会检查数据是否查询成功,数据未找到则断言退出,而find不会检查数据查询情况,需要用户自行判断,如果缺少判断直接使用将会导致指针使用问题。

不要慌!关键时刻拿走这三根救命稻草

既然EOS代币合约存在不严谨之处,那么作为项目方应该如何去防范后期可能造成的风险呢?我们给出下面三种建议方法。

第一,合约中使用官方提供的asset数据结构描述代币,对代币的算数运算同样利用asset完成。参考以下代码:

第二,在使用multi_indexfind函数时,一定要进行返回值的检查。

第三,对所有输入都通过断言检查有效性,调用API函数前,检查参数类型和大小。

最后,建议代币合约参照EOS官方给出的eosio.token示例进行实现,避免疏忽而导致的安全检查不完备。

此漏洞应引起开发者重视

虽然目前EOS代币合约还没有上线,但是项目方一定不能掉以轻心,反而应该时刻记住BEC这类事件的惨痛教训,避免重蹈覆辙,以及整型溢出问题引发的代币被盗事件的发生。

总体而言,我认为从目前审计EOS代币合约所遇到的问题来看,开发者在合约敏感代码(如操作代币数额)前后,一定要做好参数限制和权限检查使用EOS API时一定要搞清楚该函数的输入限制和返回值形式,同时多多参考官方的示例实现

另一方面,智能合约安全是整个区块链行业的基础设施最底层的保障,项目方合约开发完成后进行安全审计也是很有必要的,从多角度分析合约代码,找出那些容易忽略的问题,并且做到防患于未然。

关于作者:

杨霞,成都链安科技CEO,创始人。电子科技大学副教授,最早研究区块链形式化验证的专家。一直为航空航天、军事领域提供形式化验证服务。主持国家核高基、装发重大软件课题等近10项国家课题。CC国际安全标准成员、CCF区块链专委会委员。发表学术论文30多篇,申请20多项专利。

原文发布于微信公众号 - 区块链大本营(blockchain_camp)

原文发表时间:2018-06-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏华仔的技术笔记

Photon network无网安全性分析

链接支付基于hash时间锁(HTLC),依赖于一个简单的hash h=H(x)。

7020
来自专栏木子昭的博客

Javascript是个好东西(广大人民的智慧是无穷的):

图片发自简书App 1,面向对象? 其他编程语言对于面向对象要么支持,要么不支持,而js支持原型链,具体的实现要自己动手,实现的方式也是各种流派(相当于别人家的...

29080
来自专栏前端达人

何为GraphQL?

GraphQL是一种新型的,令人兴奋的,用于特定查询和操作的API。它非常灵活并且有很多好处。 它特别适合以图形和树型为组织的数据。Facebook在2012年...

12660
来自专栏余林丰

命令模式

当学了这个命令模式后,又一次体会到编程的艺术,明明一个看似很简单的事,却要用“复杂”的方法来实现,就像在之前我多次说到的,其实并不是“复杂”,并不是“难”,而是...

18190
来自专栏Charlie's Road

<Solidity学习系列一>根据例子学习Solidity

声明:本系列文章是自己在http://solidity-cn.readthedoc... 学习solidity时,因为英语水平不够,被迫用谷歌粗略翻译的。仅为了...

12740
来自专栏区块链入门

第二十四课 基于以太坊的交易所BANCOR算法实现-转换算法框架

EOS带火了Bancor算法。其实BANCOR算法是解决长尾通证流通的最好方式之一。鉴于目前通证大部分是基于ERC20的,辉哥正在尝试实现一个使用SOLIDIT...

18030
来自专栏小狼的世界

Python数据分析笔记

本书中推荐了edm和ipython作为数据分析的环境,我还是刚开始使用这种集成的环境,觉得交互方面,比传统的命令行方式提高了不少。

16030
来自专栏区块链入门

如何做智能合约审计?

你可以自己学习,或者你可以使用这份便利的一步步的指南来准确地知道在什么时候该做什么,并对合约进行审计。

35920
来自专栏区块链入门

【链安科技】EOS智能合约存在溢出漏洞可能

2018年4月28日,成都链安科技向巴比特透露,其研发的面向区块链形式化验证平台VaaS(Verification as a Service)检测发现,基于EO...

11240
来自专栏深入浅出区块链技术

美链BEC合约漏洞技术分析

这两天币圈链圈被美链BEC智能合约的漏洞导致代币价值几乎归零的事件刷遍朋友圈。这篇文章就来分析下BEC智能合约的漏洞

11730

扫码关注云+社区

领取腾讯云代金券