30萬美元鏈上攻擊事件:瞬態存儲漏洞導致槓杆交易項目遭殃

robot
摘要生成中

致命殘留:一場源於瞬態存儲的30萬美元鏈上攻擊事件

2025年3月30日,某安全監控系統檢測到Ethereum鏈上的槓杆交易項目遭受攻擊,損失超過30萬美元的資產。安全團隊對此事件進行了深入分析,現將結果分享如下:

背景

Solidity 0.8.24版本(2024年1月發布)引入了基於EIP-1153的瞬態存儲特性。這是一種新的數據存儲位置,旨在爲開發者提供低成本、交易期間有效的臨時存儲方式。

瞬態存儲的主要特點包括:

  1. 低gas成本:TSTORE和TLOAD操作的gas成本固定爲100。
  2. 交易內持久性:數據在整個交易期間保持有效。
  3. 自動清除:交易結束後,瞬態存儲自動重置爲零。

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

攻擊根源

本次事件的根本原因是,函數中使用tstore進行瞬態存儲的值在函數調用結束後並未被清空。這使得攻擊者能夠利用此特性構造特定的惡意地址,繞過權限檢查轉出代幣。

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

攻擊過程

  1. 攻擊者創建兩個惡意代幣A和B,在某DEX上爲這兩個代幣創建池子並注入流動性,其中A代幣爲攻擊合約。

  2. 攻擊者調用Vault合約的initialize函數,以A代幣爲抵押品代幣,B代幣爲債務代幣創建槓杆交易市場APE-21。

  3. 攻擊者調用Vault合約的mint函數,存入債務代幣B鑄造槓杆代幣APE。在此過程中,涉及兩次瞬態存儲操作:首先存儲某DEX池子地址,然後存儲鑄造的代幣數量。

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

  1. 攻擊者通過特殊方法創建一個惡意合約,其地址與第二次瞬態存儲的值相同。

  2. 攻擊者通過該惡意合約直接調用Vault合約的回調函數轉出代幣。由於瞬態存儲中的值未被清空,導致對調用者的身分檢查被錯誤地通過。

  3. 最後,攻擊者通過攻擊合約(A代幣)調用Vault合約的回調函數,將Vault合約中的其他代幣(如WBTC、WETH)轉出獲利。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

資金流向分析

據鏈上分析工具的分析,攻擊者盜取了約30萬美元的資產,包括17,814.8626 USDC、1.4085 WBTC和119.871 WETH。這些資產隨後被整合並轉換爲WETH,最終轉入某隱私交易協議。

攻擊者的初始資金來源於該隱私交易協議轉入的0.3 ETH。

總結與建議

本次攻擊的核心在於攻擊者利用了瞬態存儲在整個交易期間保持值不變的特性,從而繞過了回調函數的權限驗證來獲利。爲防止類似情況發生,建議項目方:

  1. 根據業務邏輯在函數調用結束後立即使用tstore(key, 0)清除瞬態存儲中的值。
  2. 加強合約代碼審計與安全測試。
  3. 謹慎使用新引入的特性,充分了解其潛在風險。
查看原文
此頁面可能包含第三方內容,僅供參考(非陳述或保證),不應被視為 Gate 認可其觀點表述,也不得被視為財務或專業建議。詳見聲明
  • 讚賞
  • 6
  • 分享
留言
0/400
Layer_ZeroHerovip
· 08-02 23:27
攻击必有后门
回復0
Web3产品经理vip
· 08-01 12:37
经典用户体验摩擦点攻击
查看原文回復0
链上福尔摩克vip
· 08-01 04:23
代码一错满盘皆输
回復0
薛定谔的FOMOvip
· 08-01 04:18
未测先上好危险
回復0
ProbablyNothingvip
· 08-01 04:18
迟早出漏洞的
回復0
rug_connoisseurvip
· 08-01 04:11
新漏洞搞钱快
回復0
交易,隨時隨地
qrCode
掃碼下載 Gate APP
社群列表
繁體中文
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)