SharkTeam:十大智能合约安全威胁之回退攻击
问:我们常提到的智能合约漏洞真的是实际中威胁最大、发生最频繁的安全漏洞吗?
答:完全不是那样。例如“溢出”、“外部调用”等常提到的智能合约安全漏洞并不是最常发生,威胁最大的。
到底哪些安全威胁从发生频率和危害性上能称为Top10的呢?SharkTeam合约安全系列课程之【十大智能合约安全威胁】和您一起讨论和深入。第八课【详解回退攻击】。
回退是区块链上的一种机制。回退操作是为了恢复到之前的状态,无论是简单的交易转移,还是处理一些更复杂的逻辑合约调用。在这异常的交易操作中,gas成本费是不会被退还的。
回退攻击是根据操作结果来决定的,如果操作结果没有达到攻击者预期的效果,攻击者会让交易回退。
以太坊在拜占庭升级后,EVM中实现了EIP-140:REVERT 指令。REVERT 指令在执行中发送异常,将撤消所有状态更改,但其处理方式与无效操作码(0xfe)有两种不同的处理方式:
Solidity中提供了revert()、require()两种方法,这两种方法使用0xfd操作码触发错误条件。0xfd操作码在EIP-140中被映射到REVERT指令,即两种方法可以在执行中发送异常,将撤消所有状态更改,返还剩余gas。
我们在开发中定义了require(condition, “description”),如果有定义error Error(string),那么require(condition, “description”)等效于if (!condition) revert Error(“description”))。
目前针对GameFi市场智能合约的攻击类型主要是回退攻击,因此接下来我们回顾下相关的攻击事件。
CryptoZoan在币安智能链 (BSC)上以NFT游戏的玩法和体验为重点,旨在创建一个与区块链和游戏相结合的新金融系统,使用户在进行游戏的同事,赚取收益。该游戏通过加入随机性的机制来增强用户体验,用户可以将游戏中的“蛋”进行孵化,ZOAN随机拥有一个稀有度等级,ZOAN终生依附于这个稀有度等级,总共有6个等级,等级越高,价值越高。攻击者利用随机性与回退的结合,使得攻击者的孵化请求得到想要的结果(Level 6),破坏游戏的公平性,使得攻击者获得最高收益。
攻击流程:
攻击脚本如下:
加入require判断,要求稀有度等级必须大于等于6才可以正常执行,否则将交易回滚。
CryptoZoons的任务是与怪兽战斗。玩家首先选择要在战斗中使用的生物,并通过在 MarketPlace 购买这些物品来为它们装备武器。玩家将支付一点 BNB gas 价格与选定的敌人进行战斗,同时获胜的一方会获得一定数量的代币。正是由于合约中回退机制,使得攻击者在战斗结束后可通过余额判断是否获胜。取得胜利时,则发送交易正常执行;失败时进行回滚。
攻击流程:
攻击脚本如下:
加入require判断,要求余额必须大于交易前(战斗胜利)才可以正常执行,否则将交易回滚。
我们回顾了相关事件后,我们在开发过程中应当采取哪些适当的措施来降低回退攻击风险呢?