W3
安全实战与案例库进阶347 次阅读

Curve 被盗约 7000 万美元:编译器漏洞与重入锁失效

问题不在 Curve 的代码,而在它依赖的 Vyper 编译器某个版本的防重入机制失效——提醒我们信任链上还有"工具链"这一层。

#安全#案例#Vyper#编译器#重入攻击#Curve

一句话结论

Curve 事件把风险来源推进了一层:即使业务代码写对了,编译器生成错字节码同样会造成资金损失。

事件经过

2023 年 7 月,Curve Finance 上多个稳定币池被攻击,合计损失约 7000 万美元。事后定位到根因是 Vyper 编译器 0.2.15(以及 0.2.16 的早期发行版) 在生成防重入锁时存在缺陷,导致依赖该锁的池子实际上处于无保护状态。

根本原因:防重入锁没有真正生效

Curve 的池子用重入锁(reentrancy guard)防止在转账回调中再次进入关键函数。而在有缺陷的编译器版本下:

  • 编译器对重入锁状态变量的读写顺序产生了错误优化
  • 锁的写入没有按预期在回调发生前落盘
  • 于是攻击者可以在回调中重新进入函数,完成重入攻击

也就是说,开发者在源码层面写了正确的防护,但编译后在链上执行的字节码并不具备该防护。

为什么影响面这么大

  • Curve 是以太坊稳定币交易的核心基础设施,多个池子共享同一编译器版本
  • 攻击发生后引发了市场对相关资产与借贷协议连锁清算的担忧(因为大量 LP 代币被用于抵押)
  • 攻击者还在链上遭到 MEV 抢跑,实际部分资金被第三方截走

给你的教训

  • 「经过审计的源码」不等于「经过审计的字节码」:严格的项目会对已部署字节码再做校验。
  • 依赖第三方库与编译工具时,版本锁定与升级评估是安全流程的一部分,不是运维小事。
  • 对普通用户:协议使用的编译器/框架出现高危漏洞公告时,应及时撤出资金观望,而不是等官方说明。
  • 再一次印证:重入攻击仍是 Web3 的第一大漏洞类型,跨越十余年仍在造成损失。

延伸阅读