SharkTeam:十大智能合约安全威胁之回退攻击
作者: 日期:2022年11月04日 阅:1,739

问:我们常提到的智能合约漏洞真的是实际中威胁最大、发生最频繁的安全漏洞吗?

答:完全不是那样。例如“溢出”、“外部调用”等常提到的智能合约安全漏洞并不是最常发生,威胁最大的。

到底哪些安全威胁从发生频率和危害性上能称为Top10的呢?SharkTeam合约安全系列课程之【十大智能合约安全威胁】和您一起讨论和深入。第八课【详解回退攻击】。

一、什么是回退攻击

回退是区块链上的一种机制。回退操作是为了恢复到之前的状态,无论是简单的交易转移,还是处理一些更复杂的逻辑合约调用。在这异常的交易操作中,gas成本费是不会被退还的。

回退攻击是根据操作结果来决定的,如果操作结果没有达到攻击者预期的效果,攻击者会让交易回退。

以太坊在拜占庭升级后,EVM中实现了EIP-140:REVERT 指令。REVERT 指令在执行中发送异常,将撤消所有状态更改,但其处理方式与无效操作码(0xfe)有两种不同的处理方式:

  • 它将允许你返回一个值。
  • 它将把剩余的gas退还给调用者。

Solidity中提供了revert()、require()两种方法,这两种方法使用0xfd操作码触发错误条件。0xfd操作码在EIP-140中被映射到REVERT指令,即两种方法可以在执行中发送异常,将撤消所有状态更改,返还剩余gas。

我们在开发中定义了require(condition, “description”),如果有定义error Error(string),那么require(condition, “description”)等效于if (!condition) revert Error(“description”))。

目前针对GameFi市场智能合约的攻击类型主要是回退攻击,因此接下来我们回顾下相关的攻击事件。

二、攻击事件分析

2.1 CryptoZoan

CryptoZoan在币安智能链 (BSC)上以NFT游戏的玩法和体验为重点,旨在创建一个与区块链和游戏相结合的新金融系统,使用户在进行游戏的同事,赚取收益。该游戏通过加入随机性的机制来增强用户体验,用户可以将游戏中的“蛋”进行孵化,ZOAN随机拥有一个稀有度等级,ZOAN终生依附于这个稀有度等级,总共有6个等级,等级越高,价值越高。攻击者利用随机性与回退的结合,使得攻击者的孵化请求得到想要的结果(Level 6),破坏游戏的公平性,使得攻击者获得最高收益。

攻击流程:

  • 将待孵化的蛋部署在攻击合约;
  • evolveEgg(uint256)函数;
  • 检查稀有度,如果等级太低则进行回滚;(可能会消耗Gas费用,需要去权衡选择是否继续。)
  • 取出高等级的宠物。

攻击脚本如下:

加入require判断,要求稀有度等级必须大于等于6才可以正常执行,否则将交易回滚。

2.2 CryptoZoons

CryptoZoons的任务是与怪兽战斗。玩家首先选择要在战斗中使用的生物,并通过在 MarketPlace 购买这些物品来为它们装备武器。玩家将支付一点 BNB gas 价格与选定的敌人进行战斗,同时获胜的一方会获得一定数量的代币。正是由于合约中回退机制,使得攻击者在战斗结束后可通过余额判断是否获胜。取得胜利时,则发送交易正常执行;失败时进行回滚。

攻击流程:

  • 将宠物部署在攻击合约;
  • 让合约触发战斗;
  • 检查代币是否增加(战斗是否胜利);
  • 战斗失败,将交易回滚,发送交易;
  • 战斗胜利,发送交易。

攻击脚本如下:

加入require判断,要求余额必须大于交易前(战斗胜利)才可以正常执行,否则将交易回滚。

三、预防措施

我们回顾了相关事件后,我们在开发过程中应当采取哪些适当的措施来降低回退攻击风险呢?

  • OpenZeppelin安全库中isContract()方法判断调用地址是否合约地址。
  • EOA调用。
  • 项目上线前,需联系专业的第三方专业审计团队进行审计。

申明:本文系厂商投稿收录,所涉观点不代表安全牛立场!


相关文章