昨日中午,黑客利用以太坊ERC-20智能合约中BatchOverFlow漏洞中数据溢出的漏洞攻击与美图合作的公司美链BEC的智能合约,成功地向两个地址转出了天量级别的BEC代币,导致市场上海量BEC被抛售,该数字货币价值几近归零,给BEC市场交易带来了毁灭性打击。

区块链安全公司PeckShield目前已经发现除了BECToken之外,还有超过 12 多个项目Token的智能合约中存在BatchOverFlow整数溢出漏洞,黑客可以利用这一漏洞转账生成“不存在”的虚拟货币并进行交易获利。
被黑客攻击的BEC交易量数小时内形成价格“瀑布”,币值归零。目前BEC官方团队已经暂停一切交易和转账,将对Okex交易所的交易回滚到黑客充币之前。
黑客绕过验证后生成“李鬼”币
PeckShield团队今日凌晨发布安全报告,提到黑客利用 in-the-wild 手段抓取以太坊ERC-20智能合约中的“BatchOverFlow”这个整数溢出漏洞来进行攻击。
利用这个漏洞,黑客可以通过转账的手段生成合约中不存在的、巨量的Token并将其转入正常账户,账户中收到的Token可以正常地转入交易所进行交易,与真的Token无差别。
PeckShield的安全预警报告中提到了该漏洞的具体细节,这个漏洞出现在BEC智能合约的batchTransfer函数当中,代码如下图所示。

大家请注意第257行,cnt和 _value的计算结果生成了局部变量。第二个参数,即 _value,,可以是一个任意的256字节整数,就比如是:0x8000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000(63个 0)。
通过将两个_receivers注入到batchTranser(),再加上这个极其大的 _value,我们就能使得量溢出,将其amount的量变成0。通过将量回归到0,攻击者就可以绕过258行到259行的合理性检测,使得261行的差值变得不再相关。
最后,出现了一个非常有趣的结果:你们可以看262行到265行,两个 receriver 的余额上增加了超级大的 _value,而这一切都不会花费攻击者钱包里哪怕一毛钱。
随后PeckShield团队利用自动化系统扫遍了以太坊智能合约并对它们进行分析。结果发现,有超过12个ERC-20智能合约都存在BatchOverFlow安全隐患。
为了验证该漏洞存在的真实性,PeckShield团队对其中一个智能协议进行了相似的攻击(该合约中的代币并不在任何交易所交易,所以不会出现BEC的惨剧)。

PeckShield团队还对一个未在交易所上线的以太坊宠物游戏 CryptoBots 进行了 BatchOverFlow 安全性攻击,并成功地在该协议上“生成”了 57,896,044,618,658,100,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 枚代币 CBTB(你没看错,就是这么多 0 )。
总币数已经超过合约规定的2万枚CBTB。

CryptoBots这款游戏目前正在以太坊上进行交易,但通过数据查看后发现该游戏的实际游玩人数并不高,只有寥寥几十人在玩。
PeckShield创始人蒋旭宪教授表示称,理论上可以把这个游戏中所有的道具都买下来。
除了BEC和CryptoBots(CBTB)两个智能合约之外,还有十余个智能合约存在同样的漏洞,其中也包括已经在交易所上进行交易币种。
出于安全考虑,目前PeckShield已经与相关项目团队进行了联系,暂时不能曝光这批项目的名称。
区块链安全难道只靠回滚?
BEC智能合约出现这个漏洞之后,黑客在2小时后开始往OKEx的地址充币进行交易,因为市场上出现大量未知来源的Token,市场上出现恐慌心理。OKEx交易所上的持币者开始抛售BEC Token,导致BEC价格持续下跌,币值几乎归零。

下图中我们可以看到黑客先是试探性地往OKEx中转入100万的BEC Token,黑客发现成功转入卖出后,又分2次转入了1000万的BEC Token,发现两次都成功,便转入了1亿枚BEC Token。
但这1亿枚BECToken转入后,OKEx已经发现问题并停止了BEC的交易。

按照转入记录,预计黑客已经卖出了最少1100万枚BEC,折合昨日售价约1887万人民币。

下午4点12分,OKEx发布声明中止了相关交易。BEC团队也公告表示将与OKEx交易所合作回滚到黑客转入Token之前的数据以保护投资者的权益。
PeckShield团队认为,因为以太坊区块链上所谓“代码即一切”的原则精神的存在,导致目前没有有效的安全防护手段来修复这些问题,而且因为Token交易背后牵扯着巨大的利益,是无法在多个交易所进行同步防护的。
因为中心化交易所只是对Token进行记账式的交易,项目团队与交易所配合之后回滚是可以一定程度上保护投资者利益的,但是如果在去中心化交易所进行交易那么投资者的损失将无法挽回。同时,利用交易所反应的时间差,黑客也可以实现在多个交易所套利。
知乎作者爬虫认为,该漏洞很容易解决,只需要对计算结果进行safeMath的安全验证就可以。同时,区块链智能合约代码需要测试、需要review,必要时可以请专门做代码审计的公司来进行测试。
前有OKEx回滚期货交易,后有OKEx回滚BEC交易,为什么区块链上的安全问题总是要靠回滚来解决?如果没法从根本上解决漏洞,那么受害的不仅仅是投资者,虚拟货币生态中的所有参与者都将遭受巨量损失。
|