致命殘留:瞬態存儲引發的30萬美元鏈上盜竊案件解析


2025年3月30日,以太坊鏈上的槓桿交易項目遭受黑客攻擊,損失約30萬美元。攻擊者利用瞬態存儲的特點,導致在函數調用結束後存儲的值未被清除,從而繞過權限檢查,轉移代幣。攻擊步驟包括創建惡意代幣、調用合約函數等。攻擊者最終成功提取代幣,並通過鏈上分析工具追踪了其資金流向。為了防範此類攻擊,建議項目方在函數調用後清除瞬態存儲的值,確保安全性。

作者:九九&麗莎

編輯:雪利酒

背景

2025年33 30日,根據慢霧,crifeye安全監控系統監測,以太坊鏈上的槓桿交易項目先生。

(https://x.com/slowmist_team/status/19062459807746449)

相關信息

攻擊者地址:

https://etherscan.io/address/0x27defcfa6498f957918f407ed8a58eba2884768c

存在漏洞的合約地址:

https://etherscan.io/address/0xb91AE2C8365FD45030ABA84A4666C4DB074E53E7#CODE

攻擊交易:

https://etherscan.io/tx/0xa047dddfdad9126624c4496b5d4a59f961EE7C091E7B4E38CEE86F135736F

前置知識

固體0.8.24 版本(2024年1月發布)

瞬態存儲是一種與存儲(存儲)、內存(內存)和調用數據(calldata)並列的新數據位置。其核心特點是數據僅在當前交易執行期間有效

tstore(鍵,值):將256位的值值存儲到瞬態存儲的指定鍵鍵對應的內存中。 tload(鍵):從瞬態存儲的指定鍵鍵256位的值。

該特性主要有以下特點:

低氣:TSTORE和tload的氣成本固定為100,相當於熱存儲訪問(暖存儲訪問)。相比之下,常規存儲操作,常規存儲操作(sstore)在首次寫入(從0 在首次寫入(從0(0到非0)時可能高達20,000氣體,5,000氣。 交易內持久性:瞬態存儲的數據在整個交易期間保持有效,包括所有函數調用和子調用,適合需要跨調用共享臨時狀態的場景。 自動清除:交易結束後,瞬態存儲自動重置為零,無需手動清理,減少了開發者維護成本。,減少了開發者維護成本。

根本原因

本次被黑事件的根本原因是,在函數中調用tstore進行瞬態存儲的值在函數調用結束後並沒有被清空,導致攻擊者可以利用這個特性構造特定的惡意地址來繞過權限檢查轉出代幣。 ,導致攻擊者可以利用這個特性構造特定的惡意地址來繞過權限檢查轉出代幣。

攻擊步驟

1。攻擊者首先創建兩個惡意代幣aab,之後在uniswapv3上為這兩個代幣創建礦池子並註入流動性,其中a代幣為攻擊合約。

致命殘留:一場由瞬態存儲引發的30萬美元鏈上劫案

2。接著攻擊者調用庫初始化函數,以

致命殘留:一場由瞬態存儲引發的30萬美元鏈上劫案

3。緊跟著攻擊者調用拱頂合約的薄荷函數,存入債務代幣b鑄造槓桿代幣ape。

致命殘留:一場由瞬態存儲引發的30萬美元鏈上劫案

跟進到薄荷函數中,我們發現當需要存入債務代幣b去鑄造槓桿代幣時,需要傳入的colteraltododepositmin參數的值不能等於0,之後會通過uniswapv3 baba aa並轉入拱頂中,其中會將攻擊者先前創建的uniswapv3礦池子的地址進行第一次瞬態存儲。

致命殘留:一場由瞬態存儲引發的30萬美元鏈上劫案

當uniswapv3礦池子進行兌換操作時,會回調vault合約的uniswapv3swapCallback:該函數首先會用tload從先前瞬態存儲的指定鍵tload從先前瞬態存儲的指定鍵,來驗證調用者是否是uniswapv3礦池子95759995883742311247042417521410689。

致命殘留:一場由瞬態存儲引發的30萬美元鏈上劫案

致命殘留:一場由瞬態存儲引發的30萬美元鏈上劫案

4。攻擊者之後調用無鑰匙create2工廠合約的safecreate2函數來創建一個惡意的合約,其合約地址0x0000000000001271551295307ACC16BAC16BA1E7E7E0D4281,與第二次瞬態存儲的值相同。

致命殘留:一場由瞬態存儲引發的30萬美元鏈上劫案

5。接著攻擊者通過該惡意合約去直接調用拱頂合約的UNISWAPV3SWAPCALLBACK函數轉出代幣。

致命殘留:一場由瞬態存儲引發的30萬美元鏈上劫案

因為UNISWAPV3SWAPCALLBACK函數是通過t load(1)來獲取驗證調用者是否是UNISWAPV3礦池子,然而在先前的鑄造操作中,指定鍵1對應內存中的值被保存為鑄造的數量95759999995837423112470424242417521410689 0x00000000001271551295307ACC16BA1E7E7E0D4281,導致對調用者的身份檢查被錯誤地通過。

致命殘留:一場由瞬態存儲引發的30萬美元鏈上劫案

並且攻擊者提前計算好了需要轉出的代幣數量,將最終鑄造的數量:133782170271800000870870664309296775677568476847623606640。同樣的0XEA55FFFAE1937E47EBA2D854AB7BD29A9CC29170相同,才能讓之後對調用者的檢查通過。 ,才能讓之後對調用者的檢查通過。

致命殘留:一場由瞬態存儲引發的30萬美元鏈上劫案

6。最後最後,a代幣)去調用vault合約的uniswapv3swapcallback函數

致命殘留:一場由瞬態存儲引發的30萬美元鏈上劫案

MISTTRACK分析

據鏈上反洗錢與追踪工具misttrack的分析

致命殘留:一場由瞬態存儲引發的30萬美元鏈上劫案

WBTC被兌換為63.5596WETH,USDC被兌換為9.7122WETH:

致命殘留:一場由瞬態存儲引發的30萬美元鏈上劫案

致命殘留:一場由瞬態存儲引發的30萬美元鏈上劫案

接著,共有193.1428 WETH被轉入軌道:

致命殘留:一場由瞬態存儲引發的30萬美元鏈上劫案

此外,攻擊者的初始資金來源於軌道g轉入的0.3 eth::

致命殘留:一場由瞬態存儲引發的30萬美元鏈上劫案

總結

本次攻擊的核心在於攻擊者利用項目中瞬態存儲不會在函數調用後將保存的值立即清空,而是會在整個交易期間中一直保存的特性,從而繞過了回調函數的權限驗證來獲利。慢霧安全團隊建議項目方應該根據相應的業務邏輯在函數調用結束後立即使用tstore(key,0)將瞬態存儲中的值進行清除。此外

資訊來源:由0x資訊編譯自互聯網。版權歸作者所有,未經許可,不得轉載

Total
0
Shares
Related Posts