以太坊智能合约“Beauty Chain”的漏洞分析

一、Beauty Chain是什么

美链(Beauty Chain)是一个部署在以太坊上的智能合约,有自己的代币BEC。

美链没有自己的区块链,发行代币的智能合约对应的是以太坊状态树中的一个节点,有自己的账户余额(总的以太币数额),代币都可以自己定义发行规则,合约里每个账户上有多少个代币保存在智能合约的状态变量里,维护在存储树里, 存储在智能合约的账户里,代币的发行、转账、销毁都是通过调用智能合约中的函数来完成的。

以太坊为各个代币的发行提供了很大的方便,ERC 20(Ethereum Request for Comments)是以太坊上发行代币的一个标准,规范了所有发行代币的合约应该实现的功能和遵循的接口。

二、内存溢出漏洞分析

代码漏洞分析
美链中有一个叫batchTransfer的函数,它的功能是向多个接收者发送代币,然后把这些代币从调用者的帐户上扣除。代码如下所示:
在这里插入图片描述
batchTransfer的参数为接受转账的地址数组、金额,然后计算总的转账金额,然后检查接收者的数目在20以内,检查转账金额是否足够,从发送者的账户中减去对应金额,在接收者的账户中增加对应金额。

攻击细节
“uint256 amount = uint256(cnt) * _value”这行代码中,_value如果非常大,乘法可能会溢出。所以后面在发送者的账户中只会减去很小的金额,而在接收者的账户中将会收到很大的金额,造成系统中凭空多发行了很多代币。

攻击时调用函数如下所示:
在这里插入图片描述
第0号参数是_receivers数组在参数列表中的位置,即从第64个byte开始,也就是第2号参数;
第2号参数先指明数组长度为2,然后第3号参数和第4号参数表明两个接受者的地址;
第1号参数是给每个接受者转账的金额;
通过这样的参数计算出来的amount恰好溢出为0。

三、预防措施

SafeMath库
只要通过SafeMath提供的乘法计算amount,就可以很容易地检测到溢出来。mul乘法函数中使用“assert(c / a == b)”语句,如果溢出就会抛出异常,如下所示:
在这里插入图片描述

发布了23 篇原创文章 · 获赞 2 · 访问量 4560

猜你喜欢

转载自blog.csdn.net/ice_fire_x/article/details/104285970