2026年2月15日,DeFi 借贷协议 Moonwell 执行了一次常规治理升级。升级的目的是启用 Chainlink OEV 预言机包装器,覆盖 Base 和 Optimism 上的核心市场。
这是一次被所有人认为"低风险"的基础设施升级。GitHub Copilot 审查通过。人类审核通过。治理投票 99.1% 赞成。
4分钟后,协议产生了 $1,779,044 的坏账。
更引人注目的是,出问题的 commit 记录中赫然写着:Co-Authored-By: Claude Opus 4.6。
这不是一篇关于"AI 写错代码"的猎奇文章。作为有合约审计经验(Slither/Mythril/Foundry Fuzz)的开发者,我想从审计方法论的角度,分析这次事件中每一层防御为什么失效,以及我们能从中汲取什么教训。
一、技术细节:到底发生了什么?
1.1 cbETH 定价机制
cbETH 是 Coinbase 的流动性质押代币。1 cbETH ≈ 1.12 ETH(额外的 0.12 来自质押收益累积)。
要将 cbETH 定价为美元,需要两步:
// 正确的定价逻辑
uint256 cbethPerEth = cbEthEthOracle.latestAnswer(); // ≈ 1.12e18
uint256 ethUsdPrice = ethUsdOracle.latestAnswer(); // ≈ $2,200e18
uint256 cbethUsdPrice = (cbethPerEth * ethUsdPrice) / 1e18; // ≈ $2,464
实际部署的代码跳过了第二步:
// 错误的定价逻辑(已简化)
uint256 cbethUsdPrice = cbEthEthOracle.latestAnswer(); // ≈ 1.12e18
// 直接把汇率比率当作美元价格返回
结果:一个价值 ~1.12。
1.2 攻击时间线
- T+0:00 — MIP-X43 执行。预言机返回 cbETH = $1.12。
- T+0:01 — 清算机器人检测到异常价格差,开始清算所有 cbETH 抵押仓位。
- T+0:04 — Anthias Labs(风控团队)检测到异常,将 cbETH 借款上限降至 0.01。但此时 1,096.317 cbETH 已被清算。
- T+1~5d — 修正预言机需要治理投票 + 5天 timelock,无法即时修复。
清算逻辑本身没有问题。清算机器人做的事情完全合法——预言机说 cbETH = 1.12 的债务就能获得一个价值 $2,200 的 cbETH。
二、五层防御的系统性失效
2.1 第一层:Claude Opus 4.6(代码编写)
PR #578 的 commit 中,Claude 的具体贡献:int256 验证修复、chainlinkOracle() 的 try/catch 处理、移除未使用的 ProxyAdmin import、assertTrue(answer > 0) 捕获负价格。
这些改动本身是高质量的防御性编程。但最关键的问题——cbETH 预言机配置中缺少 ETH/USD 价格转换——Claude 没有发现。
2.2 第二层:GitHub Copilot(代码审查)—— ❌ 未发现
2.3 第三层:人类审核 —— ❌ 未发现
2.4 第四层:DAO 治理投票 —— ❌ 99.1% 赞成
2.5 第五层:测试 —— ❌ 没有价格合理性测试用例
三、为什么 AI 让这个问题更危险?
3.1 "正确的幻觉"
传统的人类编码错误通常带有"错误感"。一个经验丰富的开发者看到 price = 1.12 作为 cbETH 的美元价格,可能会本能地觉得"这个数字不对"。
AI 生成代码的特点是:错误代码看起来非常正确。命名规范、注释完善、边界处理、类型安全——但核心逻辑可能是错的。
Patrick Collins(Cyfrin 创始人):"AI 特别擅长让你相信你的代码没问题。就像一个非常聪明、效率极高的应届硕士毕业生——看起来什么都懂,但其实还是个白痴。"
3.2 审计工具的盲区
- Slither:无法理解业务逻辑层面的语义错误
- Mythril:oracle 配置错误不是执行路径问题,而是数据输入问题
- Foundry Fuzz:如果 fuzz range 设置不当,测试仍然会通过
结论:传统审计工具链在这个问题上全部失灵,因为这是语义层面的错误。
四、防御建议
4.1 价格合理性检查(不可妥协)
// 基础版:固定范围检查
require(price >= MIN_PRICE && price <= MAX_PRICE, "Price out of range");
// 进阶版:动态偏差检查
uint256 deviation = _abs(currentPrice - lastKnownPrice) * 1e18 / lastKnownPrice;
require(deviation <= MAX_DEVIATION_BPS, "Price deviation exceeds threshold");
4.2 部署前验证脚本
治理提案执行前,调用预言机获取价格 → 与可信数据源对比 → 偏差超阈值则中止部署。
4.3 分层 Timelock 机制
- 紧急操作层(0-1小时):预言机暂停、借款上限调整
- 标准操作层(1-3天):参数微调、费率变更
- 治理操作层(5天+):协议升级、新增市场
4.4 AI 辅助开发的安全实践
- AI 写 ≠ AI 审:用独立工具/人审查
- 明确 AI 的边界:AI 缺乏"数字直觉"
- 业务逻辑必须人工验证:特别是价格、数量、权限等核心参数
五、行业趋势:预言机攻击正在爆发
| 时间 | 协议 | 损失 | 根因 |
|---|---|---|---|
| 2025年12月 | Ribbon Finance | $2.7M | 预言机小数位不匹配 |
| 2026年1月 | Makina Finance | $4M | 闪电贷预言机操纵 |
| 2026年2月 | Moonwell | $1.78M | 预言机配置遗漏乘法 |
| 2026年3月 | Aave | $27.78M | 预言机参数上限误配 |
每一层防御都说"没问题",并不意味着真的没问题。它可能只是意味着每一层防御都在用同样的方式漏看同一个错误。
数据来源:Moonwell 官方事故报告、GitHub PR #578、Decrypt 报道、社区研究者公开报告