本部分主要总结公链中智能合约常见的安全漏洞,部分安全问题普遍存在且基本得到解决。
5.1 交易顺序依赖合约
交易顺序依赖就是智能合约的执行随着当前交易处理的顺序不同而产生差异。例如,有两个交易T[i]和T[j],两个
区块链状态S[1]和S[2],并且S[1]状态处理完交易T[j]后才能转化为状态S[2]。
那么,如果矿工先处理交易T[i],交易T[i]调用的就是S[1]状态下的智能合约;如果矿工先处理交易T[j]再处理交易T[i],那么由于先执行的是T[j],合约状态就转化为S[2],最终交易T[i]执行的就是状态S[2]时的智能合约。
攻击方法举例:
攻击者提交高奖励的需求(与数字及信息相关),让用户解决此需求。攻击者提交完合约后就持续监听网络,如果有人提交了解决此需求的方案,此时提交答案的交易还未确认,那么攻击者就马上发起一个交易降低奖金的数额使之无限接近0。
当矿工处理这两个交易时,当前交易池就有两个待确认交易:一个交易提交解决方案,一个交易更改奖金数额。如果矿工先处理的是攻击者更改奖金的交易,那么等到矿工处理提交解决方案的交易时,方案提交者所获得的奖励将变得极低,攻击者就能几乎免费获得解决方案。(注:攻击者可以通过增加交易费用让矿工先处理自己的交易。)
5.2 误操作异常
在
以太坊中,一个合约调用另一个合约可以通过send指令或直接调用另一个合约的函数。然而在调用过程中可能会出现错误,调用的合约就会退回到之前的状态。
那么这个异常就可能无法很好地被调用者获知,这取决于调用方式。例如,通过send指令调用的合约应该通过检查返回值来验证合约是否被正确执行。
攻击方法举例:
在一些数字收藏类游戏中:用户可以通过一定数量的代币获得虚拟物品,下一任收藏者支付的数额由现任收藏者决定,当前收藏者可以通过买卖藏品获得利润。
当一个用户声称为新藏家后,合约就发送赔偿金给现任藏家,并指定这个用户为新的藏家。然而,这个合约并没有检查支付赔偿金的交易的结果。这样一旦合约在执行过程中产生了异常,现任藏家就有可能同时失去藏品和赔偿金。
可能的攻击方式就是敌手故意超出调用栈的大小限制。以太坊虚拟机规定调用栈的深度为1024。攻击者在攻击之前,首先调用自身1023次,然后发送交易给数字收藏游戏合约,这样就造成了合约的调用栈超出了限制,从而出现了错误。
合约出错后,因为这个合约没有检查合约的返回值,那么如果合约在发送赔偿金给现任藏家的过程中出现了异常,那么现任藏家极有可能失去藏品和赔偿金。
5.3 可重入攻击
在以太坊中,当一个合约调用另一个合约的时候,当前的操作就要等到调用结束之后才会继续。这时,如果被调用者需要使用调用者当前所处的状态,就会产生重入问题。
著名的DAO攻击事件就是因为这个漏洞而发生的以太坊也因此进行硬分叉,分为ETH和ETC。
版权申明:本内容来自于互联网,属第三方汇集推荐平台。本文的版权归原作者所有,文章言论不代表链门户的观点,链门户不承担任何法律责任。如有侵权请联系QQ:3341927519进行反馈。