1. 每日区块链首页
  2. 独家专栏
  3. 独家观点

震撼市场的以太系整型溢出漏洞到底是个啥?——只是忙着割韭菜忘记防割摆了

随着这两天利用空余时间对ERC20智能合约的uint256整数溢出事故追踪,有了进一步了解,下面将会慢慢讲解,为了让没有编程基础的币友也能看明白,所以此文会非常啰嗦,不耐烦的朋友可以跳着看,如果这次你被  ‘霉’链(bec)或水蜜桃(smt)坑了,希望你能静下心来好好看看,起码可以知道自己的钱亏哪了不是?

先来弄明白几个概念。

一,什么是整数溢出?

计算机语言中整数类型都有一个宽度,也就是说,一个整数类型它有一个最大值和一个最小值。

当2个整数计算时,结果大于最大值或小于值就是溢出。

这就好比你有一个容量100ml的水杯,这水杯最多可以装100ml水,最少可以装0ml水,没错水杯等价于整数       类型,100ml是水杯的最大值,0ml为水杯最小值,当你往水杯装100ml + 1滴水 就会发生溢出。

下面用java语言举例演示:

震撼市场的以太系整型溢出漏洞到底是个啥?——只是忙着割韭菜忘记防割摆了

从上面结果可以看出,当整数num为最大值127加上1时,其结果变成了num的最小值-128,对于溢出,使用物极必反来形容再合适不过了。

有了上面的认识,就可以看bec的源码了

震撼市场的以太系整型溢出漏洞到底是个啥?——只是忙着割韭菜忘记防割摆了

在上图红色方框内,unit256就是整数类型,相当于上面例子的byte类型,不过unit256的取值范围为

0~

115792089237316195423570

985008687907853269984665

640564039457584007913129639935

上面代码中,cnt和_value是2个可以由黑客控制输入的参数,cnt代表地址数量,_value代表需要转账的金额

根据黑客的交易记录:0xad89ff16fd1ebe3a0a7

cf4ed282302c06626c1af33221ebe0d3a470aba4a660f

我们在以太坊浏览器可以查到下图信息

震撼市场的以太系整型溢出漏洞到底是个啥?——只是忙着割韭菜忘记防割摆了

第一个红色方框代表需要转账的金额_value(16进制表示),第二个方框有2个转账地址,地址数量cnt为2

转账金额为_value(转换为10进制):

5789604461865809771178549

2504343953926634992332820

282019728792003956564819968

再看bec的代码:unit256 amount = unit256(cnt) * _value

就相当于amount = 2 *

5789604461865809771178549

2504343953926634992332820

282019728792003956564819968

amount 结果应该为:

115792089237316195423570

985008687907853269984665

640564039457584007913129639936

但是上面说过unit256的取值范围为

0~

115792089237316195423570

985008687907853269984665

640564039457584007913129639935

结果明显刚刚大于unit256的最大值,所以发生溢出。发生溢出会怎么样?和上面一样,物极必反,此时amount = 0;

震撼市场的以太系整型溢出漏洞到底是个啥?——只是忙着割韭菜忘记防割摆了

当amount = 0时,balances[msg.sender] >= amount 非常容易就通过,balances[msg.sender]代表发送者账户余额,只有有1个币就可以通过验证,而后面 balances[_receivers[i]].add(_value),接收者账户金额balances[_receivers[i]]增加_value个币,我们都知道_value是个非常大的数,就这样凭空为接收者账户增加了巨额。

如何解决?

其实只要在红色方框代码的判断条件再加上  && _value < unit256(cnt) * _value 就可以防止利用整数上溢通过验证进行转账。

smt的合约问题类似,只不过使用的是加法导致溢出摆了。

结论:整数溢出很容易避免,但是在整数发送溢出之前,我们不容易发现它是否会发生溢出。这是一个很小的bug,但是涉及金钱计算的代码本来要求很严谨。

整数溢出本身是编程基础课,这次引发的安全问题,除了疏忽大意之外,我怀疑更多是代码之间的抄袭,按去年代币上交易所的火爆程度,很多项目一天搞定白皮,一天完成智能合约发行token,然后募集资金砸向交易所上市收割,整个收割流程简单快捷。几百行智能合约代码承载着几十亿的价值,割韭菜能不能认真点?不然真的是偷鸡不成蚀把米。这些问题在我看来,只是项目方忙着割韭菜忘记防止被割摆了!

真是好一个物极必反,项目方在享受收割韭菜乐趣巅峰时,发现自己也被割了!

根据PeckShield 团队的报告,以下附上已经被黑客利用整数溢出漏洞成功产生巨额资金的币,小心掉坑!

震撼市场的以太系整型溢出漏洞到底是个啥?——只是忙着割韭菜忘记防割摆了

原创文章,作者:穿越牛熊持币客,如若转载,请注明出处:http://www.dayqkl.com/22155.html

发表评论

登录后才能评论
QR code