风险提示:理性看待区块链,提高风险意识!
ERC2771和Multicall任意地址欺骗漏洞原理分析
首页 > 业界 > 区块链 2023-12-11 18:22:23
币界网报道:

2023年12月8日,OpenZeppelin官方向社区发布了一则重要的安全警报。警报指出,在项目集成中使用ERC-2771标准与类Multicall方式时,可能存在任意地址欺骗攻击的风险。

SharkTeam对此事件第一时间进行了技术分析,并总结了安全防范手段,希望后续项目可以引以为戒,共筑区块链行业的安全防线。

一、攻击交易分析

由于存在一系列与该漏洞相关的攻击交易,我们选择其中一笔攻击交易进行分析。

攻击者地址:0xFDe0d1575Ed8E06FBf36256bcdfA1F359281455A

攻击交易:0xecdd111a60debfadc6533de30fb7f55dc5ceed01dfadd30e4a7ebdb416d2f6b6

攻击流程:

1.首先。攻击者(0xFDe0d157)先利用5枚WETH兑换了约3,455,399,346枚 TIME。

2.随后,攻击者(0xFDe0d157)构建了恶意的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是一种将单个函数调用转变为在同一个合约中按顺序调用多个函数的方法。它接受一个用户编码调用的数组并对其自身合约执行。这个函数遍历调用数组,并对每一个操作执行 delegatecall()。这允许用户组合自己的一系列操作,并在同一笔交易中顺序执行,而无需在协议中预先定义好某些操作组合。它主要目的也是为了节省gas。

4.对于经过精心构造的 calldata,攻击者调用了 [Forwarder].execute 函数,并传入相关参数。

我们对data值进行相应的可读格式化后得出:

攻击者(0xFDe0d157)通过对当前 calldata 的偏移操作获得新的 data 值,并将该值传递给 multicall(bytes[]) 函数。新 data 的前 4 个字节是 burn(uint256) 函数的选择器,amount 参数为 62227259510000000000000000000。

5.在multicall(bytes[])函数中,通过delegatecall调用burn(uint256)函数。在0x20这一行,0x760dc1e043d99394a10605b2fa08f123d60faf84地址是在构造calldata时一开始添加在末尾的。该地址对应Uniswapv2上的TIME-ETH流动性池,即前文提到的预期的msg.sender。

6.刚才提到的msg.sender为何变成TIME-ETH流动性池地址?原因是一开始msg.sender是[Forwarder]合约地址。为了判断是否是可信的[Forwarder],如果是可信的[Forwarder],则将msg.sender设置为calldata的最后20个字节。

三、安全建议

此次攻击事件的根本原因:在ERC-2771中,[Forwarder]并不是专为multicall设计。攻击者将_msgSender()函数中的相关参数添加到multicall的外部调用中,即本次事件的[Forwarder].execute函数。在multicall函数中,一些函数也会附加_msgSender()中的相关参数,从而允许攻击者欺骗_msgSender()。因此,攻击者通过使用multicall调用相关函数,可以模仿任意地址的调用。最终,通过授权销毁池子里的TIME代币。

针对此事件,可采取以下缓解和防范措施:

1.使用修复bug后的新版本,OpenZeppelin新版本的 Multicall 带有 ERC2771context 数据的context后缀长度,用于标识 ERC-2771 预期的context后缀长度。因此,来自可信任[Forwarder]的任何call都将被识别并适应每个子函数call。

以下是bug版本和已更新版本的对比图:

2.禁止任何合约调用multicall来防止[Forwarder]使用它,以ThirdWeb为例,该方法与OpenZeppelin的解决方案相比,OpenZeppelin仍然允许通过合约进行multicall。以下是ThirdWeb的相关bug版本和已更新版本的对比图。

上一篇: Starknet发币,会是ZK-Rollup自我救赎行动的开始吗?
下一篇: ETHIndia 13个胜选项目速览
推荐专栏
Boss Wallet Web3 Econom Pass
专注币圈最新资讯
通俗浅显地聊透Web3大事小情
读懂区块链生态与未来,尽在币界网!
热门币种
更多
币种
美元价格
24H涨跌幅
BTC比特币
67,119.02 USDT
¥479,035.15
+0.13%
ETH以太坊
3,121.17 USDT
¥22,276.10
+0.72%
BNB币安币
579.65 USDT
¥4,137.02
-0.24%
USDT泰达币
1.01 USDT
¥7.20
-0.24%
SOL
176.22 USDT
¥1,257.69
+1.67%
XRP瑞波币
0.52230 USDT
¥3.73
-0.95%
USDC
1.00 USDT
¥7.14
+0.01%
TON
6.42 USDT
¥45.79
-0.68%
DOGE狗狗币
0.15560 USDT
¥1.11
+0.32%
ADA艾达币
0.48000 USDT
¥3.43
-0.74%
热搜币种
更多
币种
美元价格
24H涨跌幅
比特币
67103.97 USDT
¥484,705.40
+0.37%
Arweave
47.1864 USDT
¥340.84
-2.07%
Filecoin
5.8726 USDT
¥42.42
-0.42%
Solana
174.9 USDT
¥1,263.34
+1.37%
Livepeer Token
18.9907 USDT
¥137.17
-1.89%
ChainLink
16.5063 USDT
¥119.23
+1.45%
Fantom
0.8929 USDT
¥6.45
+6.81%
以太经典
28.6004 USDT
¥206.59
-0.24%
Gala
0.045954 USDT
¥0.33
+0.07%
Shiba Inu
2.49E-5 USDT
¥0.00
+0.2%
Yield Guild Games
0.9071 USDT
¥6.55
-0.92%
狗狗币
0.1552 USDT
¥1.12
-0.13%
最新快讯
更多
Aevo宣布推出AevoAirdrops计划,首批项目为Swell和Zerolend
2024-05-19 13:12:16
短期持有者在波动性加剧的情况下推动比特币近期价格飙升
2024-05-19 13:10:04
Pump.fun袭击者被英国执法部门逮捕,目前正在保释中
2024-05-19 13:07:31
比特币价格稳定在67000美元以上
2024-05-19 13:06:43
比特币价格突破67000美元
2024-05-19 13:05:56
探索2024年加密货币市场趋势:BlockDAG2770万美元的预售成功和新星NEAR和Helium
2024-05-19 13:05:02
这些Altcoins今天只需投资1万美元就能让你在2024年成为百万富翁
2024-05-19 13:03:45
下载币界网APP