一行代码的漏洞,就蒸发了280亿美金!

  • powervip
  • 更新于 2024-09-03 11:26
  • 阅读 668

2018年2月24日消息,有媒体报道称美图的首个区块链项目美链(BEC,全称Beauty Chain)在全球数字货币交易平台OKEX上市交易,BEC币发行量为70亿。BEC币单价曾超过4美金,BEC市值一度突破280亿美金。然而在4月22日,由于BEC爆出严重漏洞,项目市值趋于归零。

1. 漏洞分析

2018年2月24日消息,有媒体报道称美图的首个区块链项目美链(BEC,全称Beauty Chain)在全球数字货币交易平台OKEX上市交易,BEC币发行量为70亿。BEC币单价曾超过4美金,BEC市值一度突破280亿美金。该项目宣称打造“全球第一个基于区块链技术打造的美丽生态链平台”。然而在4月22日,由于BEC爆出严重漏洞,OKEx发布公告暂停BEC交易和提现,之后BEC的市值受到了严重影响,项目市值趋于归零。

这个漏洞出现在BEC的智能合约的批量转账合约函数batchTransfer()里,该合约函数具体实现如下:


function batchTransfer(address[] _receivers, uint256 _value) public whenNotPaused returns (bool) 
{ 
   uint cnt = _receivers.length;    
   uint256 amount = uint256(cnt) * _value; 
   require(cnt > 0 && cnt <= 20); 
   require(_value > 0 && balances[msg.sender] >= amount);
   balances[msg.sender] = balances[msg.sender].sub(amount); 
   for (uint i = 0; i < cnt; i++) 
   {        
      balances[_receivers[i]] = balances[_receivers[i]].add(_value); 
      Transfer(msg.sender, _receivers[i], _value); 
   } 
   return true; 
}

漏洞出现在这行代码:uint256 amount = uint256(cnt) * _value; 由于uint256的类型问题,其能存储最大取值是0到2^256减1,即115792089237316195423570985008687907853269984665640564039457584007913129639935。

所以我们可以传入_value=57896044618658097711785492504343953926634992332820282019728792003956564819968 并且cnt=2。此时参数amount会溢出为0 。即相当于转账不用扣转出方的钱,而转入方无故收到转出方转入的钱,BEC币的总量被错误地增加了。就这一行代码,就造成美链这个价值280亿美金的项目的失败。

2. 解决方法

解决方法1

针对上面的漏洞,最简单的方法是采用 SafeMath 数学计算库来避免。即把代码改为:

uint256 amount = _value.mul(uint256(cnt));

这样就可以防止溢出问题

解决方法2

增加一行判断代码:

uint256 amount = uint256(cnt) * _value; 
assert(amount / _value== cnt);  // 判断防止溢出代码

也可以防止溢出问题

更多区块链方面的文章,可以看我的学习笔记 :www.0101.vip


我是powervip,区块链程序员 我的公 众 号:区块链战斗机 我的知乎:https://www.zhihu.com/people/powervip 我的学习笔记:www.0101.vip

原创作品,版权所有,侵权必究!商业转载请联系作者获得授权;非商业转载需保留作者署名信息,注明出处并保留原文链接。

写作不易,喜欢我写作内容的朋友,请帮忙点 “ 赞同 ” 按钮,谢谢! 你的鼓励,我的动力!

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
powervip
powervip
区块链程序猿,追求有深度的文章 我的qq:80081643 我的知乎:https://www.zhihu.com/people/powervip 我的csdn:https://blog.csdn.net/powervip 我的github:https://github.com/powervip 我的学习笔记:www.study.win 我的公众号:区块链战斗机 我的网盘:https://pan.baidu.com/s/1frOZuMxdp5IVaY94ZdoN-A