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

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

区块链

“生活水平和金融教育推动加密货币采用度指标:报告”

一项新的调查显示,将近50%的数字资产用户认为增加金融流动性是投资加密货币的主要原因

区块链

现在最好的加密货币买入选择- ImmutableX, Algorand, Aave

“X在其客户委员会活动中暗示了加密货币支付随着主流采用的增加,现在最好买什么加密货币呢?”

财务

金融监督部门负责人将与SEC主席讨论比特币实物ETF

Lee Bok-hyun, the Director of the Financial Supervisory Service, will have fruitful and beneficial dialogues with the...

资讯

韩国警方关闭了一个“涉及170个受害者的机器人主题加密货币诈骗”

韩国警方逮捕了一群涉嫌冒充加密资产发行机器人开发商,欺骗了170名“加密投资者”的人

资讯

【南韩女子窃取前夫130万美元加密货币】

一名韩国女子因盗取前夫价值130万美元的加密货币,被判处缓刑监禁

市场行情

币安考虑减少在韩国数字资产交易所 GOPAX 的股份

币安(Binance)作为一家加密货币交易所,正在寻求减少他们在韩国的数字资产交易所GOPAX的持股,以加强他们的数字资产市场这...