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)