ERC2771和Multicall任意地址欺騙漏洞原理分析

2023-12-11 19:12:20

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版本和已更新版本的對比圖。

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播信息之目的,不構成任何投資建議,如有侵權行為,請第一時間聯絡我們修改或刪除,多謝。

推薦文章

Layer2 格局劇變:Base 生態有哪些關鍵亮點?

在激烈競爭的 L2 賽道中,原本穩坐釣魚臺的 Arbitrum 和 Optimism 似乎面臨着前...

加密泡泡啊
135 4個月前

XRP 漲至 7.5 美元?分析師告訴 XRP 大軍為純粹的煙火做好准備!

加密貨幣分析師 EGRAG 表示,XRP 即將迎來關鍵時刻,價格可能大幅上漲,這取決於能否突破關鍵...

加密泡泡啊
142 4個月前

以太坊ETF通過後 將推動山寨幣和整個加密生態大爆發

比特幣ETF通過後市場動蕩,以太坊ETF交易前景分析 比特幣ETF通過後,市場出現了先跌後漲的走勢...

加密泡泡啊
164 4個月前

ZRO為啥這么能漲?

ZRO概述 ZRO代幣,全稱為LayerZero,是LayerZero協議的本地代幣,旨在作為治理...

加密泡泡啊
122 4個月前

今晚ETH迎來暴漲時代 op、arb、metis等以太坊二層項目能否跑出百倍幣?

北京時間7月23日晚上美股开盤後 ETH 的ETF开始交易。ETH的裏程碑啊,新的時代开啓。突破前...

BNBCCC
142 4個月前

Mt Gox 轉移 28 億美元比特幣 加密貨幣下跌 ETH ETF 提前發行

2014 年倒閉的臭名昭著的比特幣交易所 Mt Gox 已向債權人轉移了大量比特幣 (BTC),作...

加密圈探長
129 4個月前