安全实战与案例库进阶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 的第一大漏洞类型,跨越十余年仍在造成损失。