区块信仰
资讯 | 科普 | 解析 | 交流
今年的7月6号,国内外多家安全机构披露,基于以太坊ERC20发行的代币AMR存在溢出漏洞。
而这个存在于转账函数中的漏洞,会导致转账数额极大时,产生的结果为0。也就是说,用0个代币的代价,就能实现巨额转账,从而从中牟利。
其实,这已经不是第一次出现代币的“溢出漏洞”了,从今年的4月份开始,一些数字币开始陆陆续续出现溢出问题:在极短的时间内,供应量便冲破上限,甚至变成原定数额的千亿倍。
虽然发行方及时出手修复了漏洞,并没有造成持币者的直接损失。但这种能被人为操纵的不靠谱行为,却引来了大家的恐慌,从而币价大跌。
这种情况的始作俑者,便是利用各种漏洞搞事情的黑客。那么问题来了,黑客是如何利用溢出漏洞的呢?
溢出漏洞的全名是“缓冲区溢出漏洞”。缓冲区,就是内存中用来储存变量的空间。当计算过程变化时,缓冲区中的变量也会随之变化。
但是,不管变量如何变化,程序给变量设定好的边界永远不变。
也就是说,如果运算中的变量特别大(比如交易量),超出了预先设定好的边界。那么,计算机就会把超出边界的部分,写到边界外面。
当程序想要调用这个变量时,读取到的数据只是边界内的部分,不正确,也不完整。
而且,溢出边界的部分,还有可能覆盖到其他变量的值。最终导致程序运算的结果出错。而这个错误,就叫做“溢出漏洞”。
比如,转账金额是一种变量。在发行方编写程序时,只要设置转账金额小于代币总量就行了。如果只是处理单笔转账,也不会出现溢出情况。
不过,为了提高运算效率,很多项目都有批量转账的功能。也就是说:项目方会批量处理转账请求,把所有人的转账金额叠加在一起,转账总金额 = 转账人数X 转账金额。同时,程序判断能否转账的条件就变成了:转账金额是否小于账户余额。
到这里,黑客可以利用的漏洞就出现了:黑客们把每笔交易的金额改成无限大的天文数字。由于溢出漏洞的存在,交易金额就会溢出到了边界以外。
所以,系统读取到的数额很小,以至于系统判定:该笔转账有效。然后执行转账,最后导致数字币的大量流失。
如果没有看懂,那再举一个更加形象的例子:比如,一个账户的余额是10个数字币,而系统设定的缓冲区边界是4位数。如果该账户想转9999个数字币,系统就会驳回交易请求:钱都不够,转个毛线!
但如果该账户要转100000001个数字币,该交易金额已经溢出,系统所能读到的交易金额便是0001。然后,系统做出判断:1小于账户余额,转账请求没毛病。然后执行转账操作。这就悲剧了。
其实,溢出漏洞并不是不可避免的。只要加一个溢出判断的代码就行了。但是,溢出漏洞却很难彻底消除。
一方面,以太坊采用的是账户余额系统,即用最新数据覆盖原有数据,然后利用最新的账户余额,判断交易的可行性。这种模式具有很高的风险性,一旦代码中出现致命漏洞,就会造成非常可怕的损失。
也就是说,随着以太坊的底层公链越来越长,新代码就有可能出现漏洞。如果漏洞被黑客利用,所有基于以太坊发行的数字币都会受到影响。
另一方面,就是发行方自己造成的漏洞。有些项目方因为疏忽,而忽略了溢出判断。然后溢出漏洞被黑客利用,最后造成损失。不过,这种损失仅限于该币种,对其他币种影响不大。
所以,对于缺乏监管、尚不成熟的ICO项目来说,所有人都要戒浮戒躁。不要因为一时的急功近利,而造成不必要的损失。
领取专属 10元无门槛券
私享最新 技术干货