黄金加密学
菜单

Yearn yETH 池攻击复盘:不安全运算如何放大 LP 供应量误差

2025 年 12 月 1 日,Yearn 的 yETH 池遭到攻击。据慢雾安全团队分析,此次事件损失约 900 万美元,核心问题出在 yETH Weighted Stableswap Pool 合约的供应量计算:未受检查的数学运算与向下舍入相互作用,使攻击者能够操控池内状态,铸造超出预期数量的 LP 代币并获利。

本文依据慢雾原文整理。原文作者为九九、Lisa,编辑为 77,发布时间为 2025 年 12 月 4 日 15:31:04(UTC+8)。以下事件进展及资金追踪结果均以原文披露时点为准。

漏洞位于 LP 供应量的计算边界

yETH 是由多种以太坊流动性质押衍生品(LST)组成的自动做市商池。用户存入 LST 提供流动性,获得 yETH 代币。

按照原文说明,池中每种资产都有对应的汇率提供商,资产余额乘以相应汇率后得到“虚拟余额”。合约同时跟踪虚拟余额总和 vb_sum、虚拟余额乘积 vb_prod,以及代表池子完全平衡状态下总 LP 供应量的变量 D。对 D 的增减会对应增发或销毁等量 yETH。

慢雾指出,负责计算供应量的 _calc_supply 函数使用了不安全的数学运算。攻击者通过反复调整流动性,将这些核心变量推入异常数值区间,触发下溢、乘法溢出和舍入问题。

第一阶段:操控虚拟余额,超额铸造 yETH

攻击交易为:

0x53fe7ef190c34d810c50fb66f0fc65a1ceedc10309cf4b4013d64042a0331156

据慢雾复盘,攻击者首先通过闪电贷借入多种资产,包括 wstETH、rETH、WETH、ETHx 和 cbETH。部分 WETH 被兑换为 ETH 后存入 Tornado Cash,再通过提款触发攻击合约的 fallback 函数执行攻击。

攻击合约先调用 update_rates 更新六种 LST 资产的汇率并平衡流动性,随后用 800 枚 WETH 兑换 yETH。之后,攻击者连续进行了五轮“移除流动性—添加流动性”操作:移除时按权重赎回池中的八种资产,添加时却只补入部分资产,不补入 cbETH、wOETH 和 mETH。

第五次添加流动性后,异常计算使 vb_prod 变为 0,供应量 D 则被推高至接近虚拟余额总和的水平。

慢雾使用 Foundry 模拟后给出的关键初始值为:

  • 供应量约为 2.51e21;
  • 虚拟余额总和约为 1.0903e22;
  • 虚拟余额乘积约为 3.5e15;
  • 放大系数为固定值 4.5e20。

分析指出,迭代计算中的 unsafe_sub 不检查下溢,导致第二轮计算得到约 1.94e18 的异常供应量,远小于此前数值。随后,虚拟余额乘积在计算中向下舍入为 0,使后续供应量计算固定在约 1.0927e22。

这组异常值被写入合约存储,并据此为攻击者铸造 yETH。攻击者接着使用 cbETH 单边添加流动性,再次获得超出预期数量的 yETH。

第二阶段:恢复计算状态后赎回,反复削减池内资产

攻击者随后以 0 为数量调用 remove_liquidity。慢雾指出,即使不实际销毁 LP,该函数仍会重新计算并更新虚拟余额乘积,使其恢复为约 9.09e19 的非零值。此时,虚拟余额总和约为 1.0926e22,供应量约为 1.095e22。

接着,攻击者通过 update_rates 更新 wOETH 汇率,触发供应量重新计算并销毁相应数量的 yETH。更新后,关键状态变为:

  • vb_prod 约为 4.34e19;
  • vb_sum 约为 1.0926e22;
  • 供应量约为 9.98e21。

攻击者此前在供应量被异常放大时获得 LP,此时则在供应量恢复并减少后赎回,因此能够取出超出正常预期的资产。

据原文,攻击者反复使用这一手法,逐步削减池内资产和 LP 供应量。过程中还调用了 OETHVaultCore 合约的 rebase 函数,以促使 wOETH 汇率更新,让后续 update_rates 再次调整池内状态。最终,池子被清空,虚拟余额乘积、虚拟余额总和及总供应量全部归零。

第三阶段:空池中的粉尘存款再次触发溢出

池子清空后,攻击者向其中添加粉尘数量的流动性。在供应量为 0 时,合约会通过 _calc_vb_prod_sum 重新计算相关变量,再交由 _calc_supply 计算应铸造的 LP 数量。

慢雾分析称,这次计算又因 unsafe_mul 发生溢出,得出约 2.354e56 的异常供应量,并为攻击者铸造相应数量的 yETH。攻击者最后通过 AMM 卖出 yETH,归还闪电贷后获利。

资金追踪:约 900 万美元获利与后续追回应分开看

据 MistTrack 分析,攻击者在此次事件中获利约 900 万美元,初始资金来自 Railgun 转入的少量 ETH。

原文披露,攻击者发起攻击后将 1,100 ETH 转入 Tornado Cash,其中 100 ETH 被提取用于进一步利用。其余约 600 万美元的获利资金被集中转入以下地址:

0xa80d3f2022f6bfd0b260bf16d72cad025440c822

这部分资金包括 128 ETH、48.96 cbETH、203.55 rETH、742.63 frxETH、857.48 pxETH 和 167.67 stETH。

原文还称,Yearn 后续通过销毁攻击者持有的 pxETH,成功追回 240 万美元资金;857.48 pxETH 已重新铸造并返还至 Redacted Cartel 多签钱包。约 900 万美元是原文给出的攻击获利估计,240 万美元则是其披露的后续追回金额,两者不应混为同一统计口径。MistTrack 表示已标记相关地址,并将持续监控资金异动。

审计重点:安全运算与极端状态测试

此次事件涉及的是资金池合约对 LP 供应量和虚拟余额的计算缺陷。攻击者不仅利用异常状态增发 LP,还通过恢复状态、赎回资产和空池重新初始化,将计算误差串联为完整攻击路径。

慢雾安全团队建议,项目方和审计人员应加强极端场景及边界条件的测试覆盖,对核心变量采用安全数学运算并进行检查,避免溢出等问题影响协议安全。

原始报道:慢雾《900 万美元被盗:Yearn yETH 池漏洞分析》

原文参考:yETH 攻击分析报告

延伸阅读