查看原文
其他

智能合约屡现漏洞,该如何选择安全的币种?

Allen 白话区块链 2018-10-28

白话区块链

从入门到精通,看我就够了!

大白导读:区块链,无疑是近两年最火热的头条词语。随着这项分布式存储技术的崛起,寄托于区块链技术的数字货币也成为了投资热门。除了比特币是基于自身的底层架构而来,现在市面上大多数数字货币,都是通过以太坊智能合约发出。这种方式,虽然让人们可以更为便利地进行融资,但是智能合约安全问题却成了重大的隐患。

发展了这么多年的互联网,都常遇到各类的黑客袭击事件。作为“新生宠儿”的区块链,又怎么会没人觊觎呢?有人会说,如果我们的数字货币在以太坊区块链上,除非发生51%攻击,不然被盗的可能性很低。没错,这对以太坊主网来说确实如此,但是不代表智能合约不会有问题。

比如7月8日,AMR项目被爆出智能合约中的漏洞可以让黑客无限生成代币,而由于该项目当时已经上线交易所,黑客可以通过这些“假币”进行砸盘获利,这也就意味着黑客可以“无限印钞”,最终导致的是普通投资者的巨大损失。

一、导致代币增发的“整数溢出”漏洞是什么?

该项目的智能合约中,整数溢出的重大漏洞,使得黑客可以凭空打造出无限的AMR代币。

所谓的整数溢出,就是说如果两个8位变量A和B按位相乘,结果超出8位,超出位将被丢弃,只保留后8位长度。该漏洞中产生溢出的变量名为totalTokensToTransfer,该变量类型为uint,在Solidity中,uint长度为256位,所以只要累加超过2^256-1大小的数,将会导致整数溢出。

例如以下的公式,在发生整数溢出的时候,最前面的“1”就会被丢弃,那么整个totalTokensToTransfer的值就会被置零。而totalTokensToTransfer表示转出代币的总量,并且为了保证转出的代币不能超过自己的余额,合约中也进行了校验。

整数溢出原理


如果发生了整数溢出,就会造成以下代码第198行的情况,totalTokensToTransfer=0。换句话说,这时候程序会认为你的转出代币总量为零,只要你的余额中有少量代币,就可以绕过代码第203和205行的验证,从而完成转账。然而事实上,totalTokensToTransfer是个非常大的数值,只不过这时候代码无法检验出来而已,从而黑客就可以“凭空”造出无数代币。

整数溢出攻击后的代码

这类智能合约的漏洞,其他项目方也曾出现过。例如SMT和BEC的漏洞,就和AMR的漏洞非常类似。它们都是由于没有进行大数保护,从而造成整数溢出,形成了“无限印钞”的现象。

针对智能合约中,没有大数保护的漏洞,其解决方法其实很简单。很多代码是因为直接使用普通的加减乘除符号,但缺少了整数溢出判断,从而造成数据溢出的隐患,而使用library SafeMath可以彻底解决数据溢出的问题。因此,只需要彻查智能合约代码,把其中的“+” “-” “*” “/”换成library SafeMath,就可以彻底解决数据溢出的问题。

二、整数溢出攻击的受害者都有谁?

其实不用说,代币被溢出漏洞攻击导致增发,所有持币者将遭受损失,这其中就包括,项目方和投资者。

黑客为啥会攻击项目呢?道理很简单,项目代币已经上线交易所,且有不错的交易深度。如果黑客能够无限获得代币,也就意味着可以无限砸盘,从交易所直接获利。

比如SMT项目,在4月25日发生了智能合约漏洞事件后,SMT币价大幅降低,因此暴跌近20%,而且从此一蹶不振,币价持续走弱。所以这类漏洞事件,不仅会对投资者造成影响,也会对项目方造成信任危机,甚至直接导致代币归零。

好在SMT在被攻击之后,作出了积极的回应。首先是相关交易所停止了交易,并冻结了“假币”及大额砸盘者的账户,从而防止黑客将资产转移;其次是SMT基金会冻结同等数量的SMT“真币”,以保证外面流通的代币总量不变;最后暂停SMT交易直到智能合约重新校验完成。

SMT价格趋势

BEC(美链)同样在被“溢出”漏洞攻击后,遭遇黑客抛售“假币”砸盘的悲惨命运。BEC市场瞬间蒸发64亿人民币的市值,使得BEC价格接近归零。最后交易所中止了交易,并且选择了交易数据回滚,尽可能地降低因此造成的损失。

BEC价格趋势


三、如何应对合约漏洞?

智能合约漏洞不断,除了这类整数溢出的漏洞,还有重入攻击,当年大名鼎鼎的THE DAO就被黑客利用这种漏洞攻击而导致大量的以太币被盗走的。重入攻击原理其实也不复杂:以太坊网络可以调用外部合约,但是外部调用存在被攻击者劫持的风险,并在被攻击的合约上进行恶意操作,从而导致资产被盗。所谓“重入”,就是黑客在外部合约的任意位置“重新输入”了其他代码执行,代码被黑客篡改了。除此之外,还有重放攻击、重排攻击、短地址攻击等等。

面对如此多的被黑客攻击的事件,我们是否能从中吸取教训,尽量减少这种攻击事件及减少投资的损失呢?

对于项目方而言,毫无疑问需要去审核项目的代码,不仅是项目团队自身审核,更需要专业的第三方安全机构来审核,并且给出专业的检验报告。同时,项目方最好能设立专门的“保险资金”,来应对此类由于安全问题而造成的损失。

对于交易所而言,应该在代币上线交易所之前,就对其代码的安全性进行审核。对于上线的代币,应该实时监控各类代币是否有大额链上转入的情况。如有异常,应该立刻锁定对应账户进行排查。如果已经发生砸盘现象,需要做到快速冻结对应账户,防止其将资产转移,必要时进行数据回滚,最大化降低损失。

对于投资者而言,在投资之前,如果没有相应的判断能力,建议选择那些已经经历过长时间检验的市值靠前的币种,相对来说它们存在重大漏洞的风险比较小。如果选择投资“新币”,代码的安全问题是一个不可忽视的问题,投资者最好是具备相应的识别能力,同时需要项目方给出相应的智能合约检测报告,以及确保项目方设立了专门的“保险资金”,从而减少投资风险。

如果遇到“整数溢出”这类攻击,项目方应拿出对应数量“真币”来锁定,确保整体流通量不变;同时联系交易所暂停交易并冻结嫌疑账户;之后代码的修复以及代码全面的审核,避免重蹈覆辙。如果是有担当的项目发,还应该在二级市场进行回购,保证代币价格的稳定。这些方法虽是“亡羊补牢”,这样能尽可能减小投资者损失以及重建投资者的信心。

对于整个行业而言,代码审计应该形成行业规范,面对不进行代码审查的项目方,交易所就不应该给予上线机会。不提供第三方代码审计报告的项目,投资者也应该敬而远之!

区块链技术发展时间不长,但是速度却很快。然而跑得太快,很多时候就意味着风险如果项目方在想着追赶风口时,却忽视了最重要的“基本功”,连关键的代码安全都无法保障,最后的结局可能是“欲速则不达”!


『声明:文章为作者独立观点,不代表白话区块链立场,亦不构成任何投资意见或建议。』

相关阅读:

喜欢请给我们点赞哦,谢谢 

(●—●)

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存