一行Python代码蒸发了¥6,447,277,680 人民币!凭空消失?恐怖!
现在进入你还是先行者,最后观望者进场才是韭菜。
背景
下面我来带大家看看,黑客是如何实现的!
我们可以看到执行的方法是 batchTransfer
那这个方法是干嘛的呢?(给指定的几个地址,发送相同数量的代币)
uint256
首先 uint256(cnt) 是把cnt 转成了 uint256类型
那么,什么是uint256类型?或者说uint256类型的取值范围是多少…
uintx 类型的取值范围是 0 到 2的x次方 -1
也就是 假如是 uint8的话
则 uint8的取值范围是 0 到 2的8次方 -1
也就是 0 到255
那么uint256 的取值范围是
那么当我 255 + 2 的时候,结果是啥呢?结果会变成1
那么当我 0 – 1 的时候,结果是啥呢?结果会变成255
那么当我 0 – 2 的时候,结果是啥呢?结果会变成254
那么 我们回到上面的代码中,
但是此时 _value 是16进制的,我们把他转成 10进制
(python 16进制转10进制)
可以看到 _value = 57896044618658097711785492504343953926634992332820282019728792003956564819968
这句是当前用户的余额 – amount
当前amount 是0,所以当前用户代币的余额没有变动
总结
就一个简单的溢出漏洞,导致BEC代币的市值接近归0
那么,开发者有没有考虑到溢出问题呢?
其实他考虑了,
可以看如上截图
除了amount的计算外, 其他的给用户转钱 都用了safeMath 的方法(sub,add)
那么 为啥就偏偏这一句没有用safeMath的方法呢。。。
这就要用写代码的人了。。。
啥是safeMath
safeMath 是为了计算安全 而写的一个library
总结
那么 我们如何避免这种问题呢?
我个人看法是
- 只要涉及到计算,一定要用safeMath
- 代码一定要测试!
- 代码一定要review!
- 必要时,要请专门做代码审计的公司来 测试代码
这件事后需要如何处理呢?
目前,该方法已经暂停了(还好可以暂停)所以看过文章的朋友 不要去测试了…
不过已经发生了的事情咋办呢?
我能想到的是,快照在漏洞之前,所有用户的余额情况
然后发行新的token,给之前的用户 发送等额的代币…
进群:125240963 即可获取数十套PDF书籍