{"author":{"address":null,"user":"https://learnblockchain.cn/people/5018"},"content":{"body":"# 1. 漏洞分析\r\n2018年2月24日消息，有媒体报道称美图的首个区块链项目美链（BEC，全称Beauty Chain）在全球数字货币交易平台OKEX上市交易，BEC币发行量为70亿。BEC币单价曾超过4美金，BEC市值一度突破280亿美金。该项目宣称打造“全球第一个基于区块链技术打造的美丽生态链平台”。然而在4月22日，由于BEC爆出严重漏洞，OKEx发布公告暂停BEC交易和提现，之后BEC的市值受到了严重影响，项目市值趋于归零。\r\n\r\n这个漏洞出现在BEC的智能合约的批量转账合约函数batchTransfer()里，该合约函数具体实现如下：\r\n\r\n```js\r\n\r\nfunction batchTransfer(address[] _receivers, uint256 _value) public whenNotPaused returns (bool) \r\n{ \r\n   uint cnt = _receivers.length;    \r\n   uint256 amount = uint256(cnt) * _value; \r\n   require(cnt \u003e 0 \u0026\u0026 cnt \u003c= 20); \r\n   require(_value \u003e 0 \u0026\u0026 balances[msg.sender] \u003e= amount);\r\n   balances[msg.sender] = balances[msg.sender].sub(amount); \r\n   for (uint i = 0; i \u003c cnt; i++) \r\n   {        \r\n      balances[_receivers[i]] = balances[_receivers[i]].add(_value); \r\n      Transfer(msg.sender, _receivers[i], _value); \r\n   } \r\n   return true; \r\n}\r\n```\r\n\r\n漏洞出现在这行代码：uint256 amount = uint256(cnt) * _value;\r\n由于uint256的类型问题，其能存储最大取值是0到2^256减1，即115792089237316195423570985008687907853269984665640564039457584007913129639935。\r\n\r\n所以我们可以传入_value=57896044618658097711785492504343953926634992332820282019728792003956564819968\r\n并且cnt=2。此时参数amount会溢出为0 。即相当于转账不用扣转出方的钱，而转入方无故收到转出方转入的钱，BEC币的总量被错误地增加了。就这一行代码，就造成美链这个价值280亿美金的项目的失败。\r\n\r\n# 2. 解决方法\r\n## 解决方法1\r\n针对上面的漏洞，最简单的方法是采用 SafeMath 数学计算库来避免。即把代码改为：\r\n```js\r\nuint256 amount = _value.mul(uint256(cnt));\r\n```\r\n这样就可以防止溢出问题\r\n\r\n\r\n\r\n## 解决方法2\r\n增加一行判断代码：\r\n```js\r\nuint256 amount = uint256(cnt) * _value; \r\nassert(amount / _value== cnt);  // 判断防止溢出代码\r\n```\r\n也可以防止溢出问题\r\n\r\n\r\n更多区块链方面的文章，可以看我的学习笔记 ：www.0101.vip\r\n\r\n----------------------------------------------------------------------------------\r\n我是powervip，区块链程序员\r\n我的公 众 号：区块链战斗机\r\n我的知乎：https://www.zhihu.com/people/powervip\r\n我的学习笔记：www.0101.vip\r\n\r\n原创作品，版权所有，侵权必究！商业转载请联系作者获得授权；非商业转载需保留作者署名信息，注明出处并保留原文链接。\r\n\r\n写作不易，喜欢我写作内容的朋友，请帮忙点 “ 赞同 ” 按钮，谢谢！\r\n***你的鼓励，我的动力！***","title":"一行代码的漏洞，就蒸发了280亿美金！"},"history":null,"timestamp":1725334004,"version":1}