点击上方“程序员共读”,选择“置顶公众号”
关键时刻,第一时间送达!
近日,OKEx 发布公告,暂停 BEC 交易和提现。
而在此公告之前的一个多小时,一篇名为“一行代码蒸发了 6,447,277,680 人民币!”的文章已经在币圈和链圈流传,文中分析了漏洞产生的原因。
据分析,BEC 智能合约(https://etherscan.io/address/0xc5d105e63711398af9bbff092d4b6769c82f793d)中的 batchTransfer 批量转账函数存在漏洞,攻击者可传入很大的 value 数值,使 cnt * value 后超过 unit256 的最大值使其溢出导致 amount 变为 0。
你传几个地址给我(receivers),然后再传给我你要给每个人多少代币(value),发送的总金额 = 发送的人数*发送的金额,所以这会要求你当前的余额大于发送的总金额。
当其设置的值超过了取值范围时,就会出现“溢出”漏洞,黑客利用这个漏洞就可无限生成新的代币。
就一个简单的溢出漏洞,导致 BEC 代币的市值接近归 0。但事实上开发者也考虑到溢出问题了,如下:
除了 amount 的计算外, 其他的给用户转钱都用了 safeMath 的方法(sub,add),safeMath 是为了计算安全而写的一个 library。
那么,为啥就偏偏这一句没有用 safeMath 的方法呢。这就只能问写代码的人了。还好,目前 BEC 已暂停交易,但究竟生成了多少代币,还未公布。
来自:程序员头条
链接:https://www.jianshu.com/p/de8c991a14d1
程序员共读整理发布,转载请联系作者获得授权
【点击成为Java大神】
领取专属 10元无门槛券
私享最新 技术干货