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

《深入解析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

区块链

加密货币收益平台 Haru 在调查后暂停转账

该公司最近一次估值是在2022年9月,估值达到2.84亿美元

资讯

争夺 Do Kwon:引渡的法律对决

Do Kwon,Terra的创始人,目前正处于一场美国和韩国之间的法律纠纷中,以确定哪个国家将负责他的引渡这种情况凸显出Terra及其...

区块链

OpenAI首席执行官强调韩国芯片领域对于人工智能增长和投资的重要性

OpenAI首席执行官Sam Altman鼓励韩国在人工智能芯片生产领域发挥领导作用,并表示有兴趣投资于韩国的初创企业

市场行情

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

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

区块链

韩国法院将决定LUNC是否为证券 - Terraform的Shin的审判即将开始

Terraform Labs的Daniel Shin的审判即将在韩国开始,检察官希望证明Terra Classic(LUNC)是一种证券

区块链

韩国法院判处70多岁的比特币诈骗犯有期徒刑

一家韩国法院判处一名70岁男子监禁,因其被判犯有比特币(BTC)诈骗罪了解更多!