首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

小心,这个漏洞可能让你的财富一夜归零

区块信仰

资讯 | 科普 | 解析 | 交流

今年的7月6号,国内外多家安全机构披露,基于以太坊ERC20发行的代币AMR存在溢出漏洞。

而这个存在于转账函数中的漏洞,会导致转账数额极大时,产生的结果为0。也就是说,用0个代币的代价,就能实现巨额转账,从而从中牟利。

其实,这已经不是第一次出现代币的“溢出漏洞”了,从今年的4月份开始,一些数字币开始陆陆续续出现溢出问题:在极短的时间内,供应量便冲破上限,甚至变成原定数额的千亿倍。

虽然发行方及时出手修复了漏洞,并没有造成持币者的直接损失。但这种能被人为操纵的不靠谱行为,却引来了大家的恐慌,从而币价大跌。

这种情况的始作俑者,便是利用各种漏洞搞事情的黑客。那么问题来了,黑客是如何利用溢出漏洞的呢?

溢出漏洞的全名是“缓冲区溢出漏洞”。缓冲区,就是内存中用来储存变量的空间。当计算过程变化时,缓冲区中的变量也会随之变化。

但是,不管变量如何变化,程序给变量设定好的边界永远不变。

也就是说,如果运算中的变量特别大(比如交易量),超出了预先设定好的边界。那么,计算机就会把超出边界的部分,写到边界外面。

当程序想要调用这个变量时,读取到的数据只是边界内的部分,不正确,也不完整。

而且,溢出边界的部分,还有可能覆盖到其他变量的值。最终导致程序运算的结果出错。而这个错误,就叫做“溢出漏洞”。

比如,转账金额是一种变量。在发行方编写程序时,只要设置转账金额小于代币总量就行了。如果只是处理单笔转账,也不会出现溢出情况。

不过,为了提高运算效率,很多项目都有批量转账的功能。也就是说:项目方会批量处理转账请求,把所有人的转账金额叠加在一起,转账总金额 = 转账人数X 转账金额。同时,程序判断能否转账的条件就变成了:转账金额是否小于账户余额。

到这里,黑客可以利用的漏洞就出现了:黑客们把每笔交易的金额改成无限大的天文数字。由于溢出漏洞的存在,交易金额就会溢出到了边界以外。

所以,系统读取到的数额很小,以至于系统判定:该笔转账有效。然后执行转账,最后导致数字币的大量流失。

如果没有看懂,那再举一个更加形象的例子:比如,一个账户的余额是10个数字币,而系统设定的缓冲区边界是4位数。如果该账户想转9999个数字币,系统就会驳回交易请求:钱都不够,转个毛线!

但如果该账户要转100000001个数字币,该交易金额已经溢出,系统所能读到的交易金额便是0001。然后,系统做出判断:1小于账户余额,转账请求没毛病。然后执行转账操作。这就悲剧了。

其实,溢出漏洞并不是不可避免的。只要加一个溢出判断的代码就行了。但是,溢出漏洞却很难彻底消除。

一方面,以太坊采用的是账户余额系统,即用最新数据覆盖原有数据,然后利用最新的账户余额,判断交易的可行性。这种模式具有很高的风险性,一旦代码中出现致命漏洞,就会造成非常可怕的损失。

也就是说,随着以太坊的底层公链越来越长,新代码就有可能出现漏洞。如果漏洞被黑客利用,所有基于以太坊发行的数字币都会受到影响。

另一方面,就是发行方自己造成的漏洞。有些项目方因为疏忽,而忽略了溢出判断。然后溢出漏洞被黑客利用,最后造成损失。不过,这种损失仅限于该币种,对其他币种影响不大。

所以,对于缺乏监管、尚不成熟的ICO项目来说,所有人都要戒浮戒躁。不要因为一时的急功近利,而造成不必要的损失。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180728G17KGW00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券