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 的,不是黑客的刀,而是协议对自身数学逻辑的盲目信任。
在可预见的未来,随着协议更复杂、组合性更强,
数学级、边界级漏洞 将成为主流攻击方式。
下一次黑客攻击到来之前,每一个项目都应该问问自己:
你的底层机制,是防线?还是幻觉?






