返回论坛

合约存储攻击:隐蔽的Rug Pull手法深度分析

查找币 学术研究 安全研究 Web3安全 区块链安全

查找币安全研究院

钱包恢复评估 | 链上取证分析 | Web3 事件响应
以合法授权、证据保全、隐私保护和可复核流程为前提,不要求用户在线提交完整私钥或助记词。

查看研究院 研究报告中心
## 背景 自DeFi Summer以来,加密社区经历了无数安全事件的洗礼——漏洞利用、后门植入、Rug Pull跑路等层出不穷的攻击手段,促使参与者形成了基本的安全检查习惯:在DEX上参与新项目前,通常会检查代币合约权限、持仓分布及合约代码。然而,攻击者的作恶手法也在同步进化,变得更加隐蔽和高明。 近期,查找币安全团队收到PancakeSwap社区用户的紧急求助。用户在参与一个看似正常的项目时发现,尽管代币合约没有任何增发记录,恶意用户却利用未被记录的大量增发代币,瞬间卷走了流动性池中的全部资金。本团队立即跟进分析,现将技术细节与安全启示分享如下。 ## 攻击细节分析 ### 事件核心 恶意代币IEGT在BSC上的部署地址为:`0x8D07f605926837Ea0F9E1e24DbA0Fb348cb3E97D`。通过区块浏览器观察其Holders分布,我们发现了异常现象:dead地址与pair地址持有大量IEGT代币,但合约记录的`totalSupply`却仍为5,000,000。 进一步追踪这些异常代币的来源,发现它们来自地址`0x00002b9b0748d575CB21De3caE868Ed19a7B5B56`,且该地址只有转出记录,没有任何转入记录。 ### 技术原理剖析 根据EIP-20标准规定,代币转移必须实现`Transfer`事件,包括铸造操作(从0x0地址转移)。区块浏览器依赖这些标准事件进行数据统计。当浏览器显示的总供应量与链上实际余额不匹配时,表明代币增发操作未触发事件记录。这意味着合约中必然存在绕过标准事件机制的恶意增发代码。 有趣的是,该代币合约是开源的——这显然是项目方为增加可信度而设置的障眼法。我们对源码进行了深度审计。 ## 隐蔽的增发机制 ### 常规增发与存储攻击 通常,代币增发最直接的方式是实现一个修改`_balances`映射的方法。但在IEGT合约中,我们并未发现直接修改`_balances`的常规代码。那么,攻击者如何实现增发? 回顾智能合约基础:用户代币余额的变化本质上是修改合约在链上的存储状态。只要直接修改特定地址的`_balances`在合约中对应存储插槽的数据,即可实现余额篡改。 ### EVM存储布局计算 对于映射类型`_balances`,其存储位置计算规则为: - 键值k与位置p通过`keccak256(k, p)`计算偏移量 - IEGT合约中`_balances`位于slot0 - 用户余额存储位置 = `keccak256(address, 0)` 我们针对恶意地址`0x00002b9b0748d575CB21De3caE868Ed19a7B5B56`进行计算: - 存储位置 = `0x9d1f25384689385576b577f0f3bf1fa04b6829457a3e65965ad8e59bd165a716` - 查询该插槽数据变化,发现合约部署时已被写入一个巨大数值 ### 内联汇编实现存储篡改 深入分析初始化函数,我们发现攻击者在`_pathSet`操作中,通过内联汇编直接修改合约存储,并刻意未对代码进行格式化以降低可读性。 关键代码逻辑如下: 1. 通过两次`mstore`操作,将内存0~64字节填充为特定地址数据 2. 计算得到的y值恰好为恶意地址的低位部分 3. 通过`keccak256`对内存数据进行哈希,得到目标存储插槽位置 4. 使用`sstore`将该位置的值修改为当前时间的6次方(一个巨大数值) 值得注意的是,攻击者将`_balances`置于slot0位置,正是为了方便在内联汇编中直接计算存储位置。这种设计绝非偶然,而是精心策划的作恶方案。 ## 攻击链还原 1. **合约部署阶段**:项目方部署IEGT合约,通过内联汇编在初始化时直接修改指定地址的余额存储插槽 2. **隐蔽增发**:恶意地址获得巨额代币,但由于未触发`Transfer`事件,区块浏览器无法统计到增发行为 3. **流动性注入**:项目方将部分正常代币注入PancakeSwap池,营造正常交易假象 4. **收割时刻**:当池中积累足够流动性后,恶意地址利用隐蔽增发的代币一次性抛售,卷走池中全部资金 ## 安全启示与防范建议 本次事件展示了Rug Pull手法的进化方向: - **开源陷阱**:开源代码反而成为降低用户警惕性的工具 - **代码混淆**:通过未格式化代码和内联汇编提高分析门槛 - **存储攻击**:绕过标准事件机制,直接修改存储状态 根据查找币Hacked统计,截至目前Rug Pull导致的累计损失已接近5亿美元。面对日益隐蔽的攻击手段,我们建议: 1. **深度审计**:参与新项目前,务必对合约进行专业审计,重点关注存储操作和初始化函数 2. **存储分析**:使用工具检查合约存储布局,识别异常的存储写入模式 3. **事件监控**:关注代币的`Transfer`事件完整性,异常余额变化往往是危险信号 4. **开源验证**:开源不等于安全,需验证代码与部署字节码是否一致 5. **避免盲从**:不参与合约未开源、未经审计的项目,尤其警惕流动性集中池 查找币安全团队将持续追踪此类攻击手法,并通过查找币追踪系统实时监控链上异常行为。我们呼吁社区成员保持警惕,共同构建更安全的Web3生态。 --- *本文由查找币安全团队整理发布*
在论坛中查看和回复