仰臥起坐真的可以健身嗎?歡迎來參加我的直播節目!

《深入解析ERC2771和Multicall合约中的任意地址欺骗漏洞》

2023年12月8日,重要安全警报:你可不想让鲨鱼进你的钱包!

鲨鱼进攻

大家好,据OpenZeppelin官方发布的安全警报显示,使用ERC-2771标准与类Multicall方式集成的项目可能存在任意地址欺骗攻击的风险。别要被鲨鱼吃了脑袋啊!

🦈SharkTeam第一时间进行了技术分析,总结了一些防范措施,并希望这次事件能给后续项目敲响警钟,让我们共同筑起区块链行业的安全防线。

一、分析攻击交易:让鲨鱼的流程一览无余

首先,我们选择了一笔攻击交易进行分析。下面是攻击者地址和攻击交易的详细流程:

🐋攻击者地址:0xFDe0d1575Ed8E06FBf36256bcdfA1F359281455A

🐋攻击交易:0xecdd111a60debfadc6533de30fb7f55dc5ceed01dfadd30e4a7ebdb416d2f6b6

攻击流程如下:

  1. 首先,攻击者0xFDe0d157先用5枚WETH兑换了约3,455,399,346枚TIME,宛如鲨鱼喂饱了自己。

    喂饱自己
  2. 随后,攻击者构建了一个恶意的calldata参数,并调用了[Forwarder].execute函数,就像鲨鱼吞噬猎物一样。

  3. 在调用[Forwarder].execute函数时,恶意的calldata触发了TIME合约的multicall函数。紧接着,使用剩余的calldata触发了TIME合约的burn函数,这样就销毁了池中的TIME代币。

    猎物被吞噬

二、解析漏洞:鲨鱼的多重威胁

这次攻击事件涉及了一些关键技术:ERC2771、Multicall以及经过精心构造的calldata。我们从TIME代币合约中找到了相关的继承关系,让我们一起揭开鲨鱼的真面目吧!

  1. ERC2771提供了一种虚拟的msg.sender能力,允许用户委托第三方[Forwarder]执行交易,以降低gas成本。提交交易时,msg.sender地址会被添加到calldata中,好像鲨鱼设计了一套猎物迷惑术。

  2. TIME代币合约继承了ERC2771Context。当[Forwarder]调用合约时,_msgSender()会检查calldata数据,并截取最后的20个字节作为预期的msg.sender。这个操作就像鲨鱼一样嘴巴张开,准确捕获猎物。

    鲨鱼张开大嘴
  3. Multicall是一种将单个函数调用变成在同一个合约中顺序调用多个函数的方法。它接受一个用户编码的调用数组,并在自身合约中执行这个函数组合。这个函数的作用是节省gas,就像鲨鱼一口气吞下多个猎物。

  4. 鲨鱼使用经过精心构造的calldata,通过调用[Forwarder].execute函数传入相关参数。

    精心构造的calldata

经过相应的格式化,我们发现攻击者通过对当前calldata的偏移操作获得了新的data值,并将该值传递给multicall(bytes[])函数。新data的前4个字节是burn(uint256)函数的选择器,amount参数为62227259510000000000000000000。

  1. 在multicall(bytes[])函数中,通过delegatecall调用了burn(uint256)函数。而0x760dc1e043d99394a10605b2fa08f123d60faf84这个地址则出现在构造calldata时一开始添加在末尾。这个地址对应的是Uniswapv2上的TIME-ETH流动性池,也就是之前提到的预期的msg.sender。

    鲨鱼换装成了流动性池
  2. 为什么之前的msg.sender会变成TIME-ETH流动性池的地址?因为最初的msg.sender是[Forwarder]合约地址。为了判断是否是可信的[Forwarder],如果是可信的[Forwarder],则将msg.sender设置为calldata的末尾20个字节。

三、安全建议:击退鲨鱼的防线

这次攻击事件的根本原因在于,在ERC-2771中,[Forwarder]并不是专为multicall设计的。攻击者将_msgSender()函数中的相关参数添加到multicall的外部调用中,也就是本次事件中的[Forwarder].execute函数。在multicall函数中,其他一些函数也会附加_msgSender()中的相关参数,为鲨鱼欺骗提供了机会。因此,攻击者通过使用multicall调用相关函数,就可以模仿任意地址的调用,最终偷走了池子里的TIME代币。

为了预防类似事件的发生,我们提出以下缓解和防范措施:

  1. 使用修复bug后的新版本。OpenZeppelin发布的新版本Multicall带有ERC2771context数据的context后缀长度,用于识别和适应可信任[Forwarder]的每个子函数call。

    新版本修复图

    下图对比展示了bug版本和已更新版本的变化:

    版本对比图
  2. 禁止使用任何合约调用multicall,以防止[Forwarder]滥用multicall。以ThirdWeb为例,他们的修复方法与OpenZeppelin的解决方案不同,OpenZeppelin仍然允许通过合约进行multicall。

    ThirdWeb版本对比图

🌊鲨鱼来袭,让我们一起保护资产的安全,共同建设安全的区块链世界!如果你对这次事件有什么看法或者想分享一些防范措施,欢迎在下方评论区与我们互动!

We will continue to update 算娘; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

区块链

韩国Hana Bank和BitGo将共同推出加密货币托管合作计划

韩国交易所银行(KEB)汉拿银行和BitGo Trust Company已经达成合作伙伴关系,以使KEB汉拿银行能够提供数字资产托管服务

资讯

韩国加密货币交易所Bitsonic案件:法官判给‘宽大’的7年徒刑

一群领先的韩国加密货币交易所Bitsonic的高管被首尔法院判处操纵加密货币价格,获利750万美元这一裁决充分展示了政府打击非法...

市场行情

加密货币借贷平台 Delio 暂停提款

由于市场波动加剧,韩国加密货币借贷和储蓄公司Delio已暂停资金提取

政策

【韩国官员将于2024年公开宣布其加密货币持有情况】

到2024年6月,韩国五家著名的加密货币交易所,包括Upbit、Bithumb、Coinone、Korbit和Gopax,将推出个人信息提供系统,以简化...

资讯

南韩加密货币成功故事 K Bank 瞄准 IPO

韩国成功的新型银行K银行以其创新的加密业务而闻名,宣布了首次公开募股(IPO)计划,进一步巩固其在银行业的领先地位,为社...

观点

南朝鲜 N-Po 一代崛起:蓬勃发展的 Web3 市场

韩国年轻人被称为N-Po一代,这可能意味着被抛弃的感觉然而,他们通过加密货币找到了重新振作的乐观情绪,这是一种宝贵的发现