900 万美金怎么没的?一文带你看懂 Yearn 被黑全过程

OneKeyTeamOneKeyTeam
AbbieAbbie
/更新于 2025年12月7日
900 万美金怎么没的?一文带你看懂 Yearn 被黑全过程

行情冷下来后,很多协议都进入“低功耗模式”,更新慢了、审计跟不上了,旧代码的问题也开始浮出水面。黑客就喜欢捏这类「软柿子」,因此链上的攻击明显变得频繁。

仅 2025 年 11 月,链上累计被盗金额就超过 1.8 亿美元。

12 月 1 日,老牌 Defi 项目 Yearn 的 yETH 池子也没能幸免,被黑客抽走约 900 万美元。

今天我们不用晦涩语言,只用最简单的话讲明白:

黑客究竟做了什么?Yearn 为什么防不住?这类攻击会越来越多吗?

一、看懂攻击前,先搞懂 LP 和池子怎么运作

如果你对 LP、流动性、池子算法都不熟,这一节可以帮你快速上手,后面所有攻击步骤都围绕这些机制展开。

1. 流动性池:大家一起往储钱罐里放钱

把 yETH 池想成一个“大储钱罐”,里面装着各种 ETH 质押代币(LST),比如:

  • stETH
  • cbETH
  • rETH

越多人往池子里存钱,池子越厚,交易越稳定。

当你往池子里存资产,系统会发给你 LP(Liquidity Provider token),相当于你在这个池子里的股份凭证。

池子产生收益时,你能按 LP 比例分到钱;
等你想退出时,也可以按 LP 比例赎回池子里的真实资产。

2. LP 给多少?怎么算公平?

不同资产价值不一样,池子必须回答:“你放进来的资产究竟占池子多少价值?应该给你多少 LP?”

决定这个问题的,就是 Yearn 的核心函数 calc_supply,用于计算新的 LP 供应量(D)和池子的平衡指标 Π(vb_prod)。

它会把所有资产数值换算成统一单位,然后进行一系列复杂计算。

如果结果正确,一切正常;
如果结果错误,那就是黑客的机会。

3. Σ 与 Π:池子用来维持平衡的两个关键指标

池子会计算两个东西:

  • Σ(所有资产的虚拟余额相加):池子里“东西的总体量”
  • Π(所有资产的虚拟余额相乘):池子是否“保持平衡”的指标

只需要理解一件事:

Π 就像池子的“平衡线”,维护整个 AMM 的正常运作。

如果 Π 出现异常,池子就会错误判断资产价值。

而 Π = 0 对池子来说,就像“大脑短路”,会让整个算法进入错误模式。

黑客做的,就是让 Π 变成 0。

二、黑客如何一步步把 Yearn 推向崩溃?

1. 黑客先把池子调整到一个“很容易犯错”的状态

黑客先通过闪电贷借来大量 LST(LST=Liquid Staking Token,流动性质押代币),然后做了一些表面上很正常的操作:

  • 更新利率(update_rates):让池子内部的虚拟余额重新计算
  • 小幅添加流动性
  • 小幅移除流动性

这些操作本身是合法的,但会让 calc_supply 进入一个非常敏感的位置:
此时稍微改变池子数据,就可能导致算法算错。

2. calc_supply 被黑客推入错误分支:Π 被算成 0

calc_supply 内有一个非常关键的公式:

Π' = Π * (s'/s)^8

黑客通过精确控制池子状态,让 s’(新供应量)远小于 s(旧供应量)。

当 s'/s 非常非常接近 0 时:

  • (s'/s)^8 会直接被舍入为 0
  • Π' = Π * 0 = 0

Π = 0 = 池子不再按正常曲线工作

此时池子会误以为“资产之间没有价值关系”,整个定价逻辑失效。

这是整个攻击的转折点。

3. 利用 Π = 0,黑客开始凭空“印 LP”

当 Π=0 时,calc_supply 会进入一种退化模式:LP 按虚拟余额线性计算,添加不平衡资产会被系统严重“高估”。

Π=0 时,calc_supply 会退化,变成一种非常粗糙的线性计算模式:单边放入一点资产,系统会认为价值巨大,并奖励大量 LP。

这等于黑客可以只存入一点真实资产,就获得大量虚高 LP

4. 黑客用虚高 LP 去赎回真实资产,重复几轮后池子被掏空

黑客手中的 LP 数量远超本应获得的数值。

当他去 remove_liquidity 时,合约按 LP 比例给他真实资产,可池子并不知道 LP 是黑客“印”出来的

于是:虚假 LP → 换取真实 ETH/LST → 池子余额不断减少

每循环一次,池子资产减少一大截。

几轮下来,Yearn yETH 池就被榨干。

5. 池子被掏空后,黑客用“粉尘攻击”印最后一次钞

当池子彻底没有资产后:

  • Σ=0
  • Π=0
  • D=0

此时 calc_supply 不应该继续工作,但 Yearn 没有保护。

黑客再存入:几乎可以忽略不计的 1 wei 级别“粉尘”

calc_supply 在计算 A*Σ - s*Π 时,因为 unsafe_sub、unsafe_mul 不检查溢出,下溢变成一个巨大整数,再除以 d ≈ 2.6 × 10^56 个 LP

全部发给黑客。

这就是攻击的最后一步。

三、为什么这种攻击越来越频繁?

Yearn 这类被“数学漏洞”击穿的项目,之前有很多起。

2025 年 5 月 22 日,SUI 生态最大 DEX Cetus 被盗 2.23 亿美元。

它的问题与 Yearn 非常相似,都是关键数学模块没有处理好极端数值。

Cetus 的错误是位移运算检测阈值写错,让本该溢出的巨大数值通过检查。

黑客将 1 枚代币伪装成“天量流动性”,再把池子清空。

这种攻击模式几乎和 Yearn 一样:关键数学模块缺乏极端情况覆盖 → 黑客把系统推到极端 → 数学出错 → 池子崩坏。

这是如今最常见、也最难防的 DeFi 攻击类型:
不是攻破权限,而是攻破数学。

四、项目方如何避免成为下一个“Yearn”?

结合 Yearn、Cetus 的惨痛经验,可以看到三个共同点:

1. 数学函数必须经过“极端值”测试

重点检查:

  • 除以接近 0 的场景
  • 涉及指数幂的计算(尤其是 n≥4)
  • supply / balance 比值极小或极大时的行为

Yearn 的 calc_supply 与 Cetus 的流动性公式,都是在极端值上缺乏保护。

2. 禁用 unsafe_sub / unsafe_mul / unsafe_shifts

使用无检查运算符等于在数学系统里放炸弹。

  • Yearn 因为 unsafe_sub 发生下溢 → supply 爆成 10^56  
  • Cetus 因为 checked_shlw 阈值写错 → 流动性无限放大

只要一个地方没检查,黑客就能找到入口。

3. LP mint 必须设置上限保护

可以简单粗暴地设:

minted_LP ≤ deposited_value * C

即便 C 取 2 或 3,都能阻断几乎所有数学级攻击。

Yearn 和 Cetus 都缺乏对“异常铸造 LP”的监控。

真正摧毁 DeFi 的,不是黑客的刀,而是协议对自身数学逻辑的盲目信任。

在可预见的未来,随着协议更复杂、组合性更强,
数学级、边界级漏洞 将成为主流攻击方式。

下一次黑客攻击到来之前,每一个项目都应该问问自己:

你的底层机制,是防线?还是幻觉?

使用 OneKey 保护您的加密之旅

View details for 选购 OneKey选购 OneKey

选购 OneKey

全球最先进的硬件钱包。

View details for 下载 App下载 App

下载 App

只需邮箱, 即可快速开始全球资产交易。

View details for OneKey SifuOneKey Sifu

OneKey Sifu

即刻咨询,扫除疑虑。

继续阅读