记录黑客技术中优秀的内容, 传播黑客文化,分享黑客技术精华

转账不用付款:BEC和SMT代币智能合约存在整型溢出漏洞

2018-04-28 01:15

作者:{XJ}@ArkTeam

最近”币圈”新闻不断,尤为严重的是BEC和SMT在4月22日、4月25日先后被爆出智能合约中存在整型溢出漏洞,其中黑客利用该类漏洞向两个地址转出了57,896,044,618,658,100,000,000,000,000,000,000,000,000,000,000,000,000,000,000.792003956564819968 个 BEC Token货币(美蜜币),导致BEC急剧贬值,价值几近归零,目前BEC已暂停交易。


SMT和BEC都是基于以太坊ERC-20标准的普通代币,其转账流通都是通过以太坊的智能合约进行实现。智能合约在以太坊虚拟机EVM中运行,使用Solidity语言编写,因此,一旦编写的智能合约程序存在漏洞,则会严重影响到其发行的代币。Solidity语言支持从int/uint 8到int/uint256的有符号或无符号整型。其中,uint256支持的取值范围是0到2^256-1,如果定义的uint256 参数超过了最大整数值则会发生溢出,如果刚好取值是2^256则返回值为0, 2^256+1则返回值为1,以此类推。这就是solidity中整数溢出场景的常规情况。以BEC合约为例(BEC合约查看地址https://etherscan.io/address/0xc5d105e63711398af9bbff092d4b6769c82f793d#code),该漏发生在batchTransfer函数中第257行代码上。uint256 amount = uint256(cnt) * _value直接使用乘法运算符,其中变量cnt为转账的地址数量,由用户输入_receivers进行控制,_value为单地址转账数额。紧接着balances[msg.sender] >= amount 对amount进行了条件检查,意思是当前用户的余额必须大于要转出的总币数。攻击者通过调大_value的数值,可以使得最终amount的数值超过uint256支持的最大值,从而让amount溢出后成为一个很小的数字甚至0,轻松绕过这段检查代码。这样攻击者的账户可以不转出任何 BEC,但是接收方却能收到大量 BEC。


这种整数溢出类漏洞可追溯到2010年的比特币大整数溢出的CVE-2010-5139漏洞,黑客通过整数溢出构造了大概92233720368.54277039 个比特币[1]。黑客们利用各种虚拟货币的漏洞进行各种各样的”盗窃”行为,对区块链生态安全造成了巨大威胁,区块链安全也受到了更多人的关注,Arkteam提示:涉及钱款,兹事体大,稍有不慎则一夜回到进化前,在编写合约时应该使用SafeMath库中的方法来保证计算安全,部署合约一定要做好测试。

参考:

[1] https://www.anquanke.com/post/id/106382

知识来源: www.arkteam.net/?p=3543

阅读:127276 | 评论:0 | 标签:ArkView 溢出 漏洞

想收藏或者和大家分享这篇好文章→复制链接地址

“转账不用付款:BEC和SMT代币智能合约存在整型溢出漏洞”共有0条留言

发表评论

姓名:

邮箱:

网址:

验证码:

公告

关注公众号hackdig,学习最新黑客技术

推广

工具

标签云