Yearn $9M资产被黑事件深度解析:从协议漏洞到美元价值蒸发

2025年12月1日,Yearn协议经历了DeFi历史上一场精心策划的多层级复合攻击,最终导致约900万美元的用户资产血本无归。这不是简单的单点漏洞利用,而是攻击者通过闪电贷撬动资金、逐层突破协议防护机制、无限铸造yETH相关LP代币、最终耗尽资金池的系统性摧毁。本次事件再次警示整个行业:DeFi协议的安全风险不在某个单独漏洞,而在于多个缺陷的叠加引爆——这是当前行业最难防御的攻击模式。

事件概览:闪电贷如何成为多阶段攻击的撬杆

攻击者的资金筹备策略看似平凡,却为后续一系列连锁操作奠定基础。他们从Balancer和Aave两个协议同时发起闪电贷,一次性借出了大量的wstETH、rETH、WETH、ETHx、cbETH等多种ETH衍生品。这些资产并未直接进入交易,而是被精心分配:1100个ETH中有100个被送入Tornado.Cash进行混币——这一步骤的真实目的是掩盖资金来源,为后续的"洗白"操作铺路。

在混币完成后,攻击者将100个ETH提取到恶意合约地址0x3e8e7533dcf69c698Cf806C3DB22f7f10B9B0b97,并触发其fallback函数。在这个隐蔽的回调中,所有借入的资产被转换成了yETH weighted stableswap pool的LP代币——相当于购买了这个资金池的"份额凭证"。表面看这是一笔普通的流动性注入,实际上是在为一场精妙的"池子掏空术"做最后的准备。

三大核心漏洞:精度丢失、收益剥离、零供应初始化的致命组合

第一层漏洞:精度丢失与无成本状态篡改

整场攻击的技术核心在于一个看似微不足道的代码缺陷:remove_liquidity函数未对零金额进行短路处理

攻击者的第一步行动是故意制造池子中资产的极端失衡。他反复调用add_liquidity(添加流动性)函数,但刻意跳过index 3(rETH)、index 6(wOETH)和index 7(mETH)这三个代币的注入,这样就人为地拉大了这三种资产与其他资产的比例差距。随后,他单边注入巨量的rETH,进一步扩大失衡程度。

在这种极端失衡的池子状态下,攻击者调用remove_liquidity,但输入的提取金额参数为0。按照常规逻辑,提取0个代币应该直接返回,根本不应该有任何状态变化。但pool.vy合约没有这样做——它依然执行了完整的vb_prod(虚拟余额乘积)计算循环。

在极端权重失衡的数学环境下,_pow_down函数(向下取整计算)产生了显著的精度损失。合约错误地计算出了一个偏小的vb_prod值,并将这个被篡改的数值写入了全局状态packed_pool_vb。本质上,攻击者用一笔"零成本"的操作(不转账任何代币)成功篡改了整个池子的账面价值。

第二层漏洞:收益剥离与份额蚕食

第二层漏洞更加隐蔽。当攻击者调用update_rates函数时,它会触发内部的_update_supply逻辑。由于vb_prod之前被恶意压低,系统产生了一个错误的认知:池子的总价值急剧缩水。为了平衡账簿,合约自动销毁了Staking合约持有的大量LP代币。

攻击者精准地在汇率更新前后进行套利操作。每次调用update_rates更新特定资产(如wOETH、mETH)的汇率,然后立即调用remove_liquidity提取资产。由于Staking合约的份额被大量销毁,相对而言,攻击者手中的LP份额占比被动提升。通过反复这个"更新-提取-销毁"的循环,攻击者一步步榨干了池子中wOETH和mETH的实际余额,同时将池子的Total Supply推向危险的零值边界。

第三层漏洞:零供应无限铸币的临界点

经过前两个阶段的系列操作,池子已经被掏空殆尽:Total Supply接近0,wOETH和mETH的余额极低。此时攻击者发动了最后的致命一击:调用add_liquidity,注入的参数为[1, 1, 1, 1, 1, 1, 1, 9]——也就是前七种资产各注入1 wei(最小单位),第八种(mETH)注入9 wei。

这看似荒谬的操作在池子即将被摧毁的临界时刻引发了合约的计算崩溃。_calc_supply的迭代公式在处理极小数值时失效,最终合约错误地铸造了235,443个yETH LP代币。相当于凭空创造了数百万美元的假资产。

攻击四个阶段详解:从极端失衡到无限铸币

阶段一:资金筹备与池状态初始化

  • 从Balancer和Aave借入多种ETH衍生品
  • 通过Tornado.Cash混币掩盖资金来源
  • 将混币资金和借入资产全部兑换成yETH LP代币

阶段二:极端失衡的人工制造

  • 反复单边注入流动性,跳过特定代币(rETH、wOETH、mETH)
  • 单边注入巨量rETH进一步扩大失衡
  • 这一阶段为精度丢失创造了数学条件

阶段三:收益剥离与份额蚕食

  • 通过remove_liquidity(0)触发精度丢失状态
  • 调用update_rates更新汇率,导致Staking合约LP代币被销毁
  • 反复套利操作,榨干wOETH和mETH余额
  • 池子Total Supply被推向0

阶段四:零供应无限铸币

  • 在池子即将被摧毁时调用add_liquidity([1,1,1,1,1,1,1,9])
  • 合约_calc_supply计算崩溃,错误铸造235,443个LP代币
  • 攻击者通过exchange和redeem完成资产兑换
  • 偿还闪电贷,将获得的资产兑换成比特币、美金等流动性强的资产进行清算

资金追踪与清算路径:从yETH到美元的价值流失

这场攻击最终的黑色喜剧在于资金的逃逸链条。攻击者获得的235,443个LP代币经过一系列exchange操作,被逐步兑换成ETH和稳定币。随后通过DEX交易对将这些资产进一步兑换成比特币等更容易隐匿的资产形式,最终通过场外交易(OTC)平台将数百万美元的资产兑换成现金或比特币。整个过程中,900万美元的用户资金就这样在链上明目张胆地从协议余额转移到了攻击者的钱包,再逐步兑换成美金、比特币等最终逃脱。

行业启示:DeFi协议如何防范复杂组合攻击

本次事件的关键教训有三点:

教训一:加强边缘场景校验 DeFi协议必须对"零金额""极端失衡"等边缘场景进行严格的逻辑校验。remove_liquidity应当在接收到0参数时立即返回,而非执行完整的计算循环。这类"短路处理"看似简单,却能有效阻止状态篡改的可能性。

教训二:优化精度计算逻辑 _pow_down等涉及极端比例计算的函数必须引入防护机制。可以考虑采用更精密的数值处理库、增加中间溢出检测、或在极端场景下使用不同的算法分支。历史上Balancer协议就因类似精度问题遭遇过攻击,这已是前车之鉴。

教训三:建立多维度异常监控 需要构建实时监控系统,对以下操作进行预警:

  • 高频的单边流动性注入导致池子极度失衡
  • 异常的汇率波动和自动销毁事件
  • 零金额交易和极小数值操作的异常频率
  • 池子Total Supply在短时间内的剧烈波动

对于整个DeFi生态,这次事件证明了一个深刻的真理:安全不在于修复某个漏洞,而在于系统性地防范多个缺陷的组合利用。协议开发者需要从全流程视角审视代码逻辑,不放过任何看似"无害"的设计缺陷。同时,行业需要加强对攻击者资金流向的链上追踪与冻结能力,通过DEX黑名单、OTC平台风控等手段提升整体防护能力。Yearn被黑事件不是终点,而应该成为推动整个行业安全进化的催化剂。

BAL-1.82%
AAVE-5.26%
ETH-2.35%
BTC-1.54%
此页面可能包含第三方内容,仅供参考(非陈述/保证),不应被视为 Gate 认可其观点表述,也不得被视为财务或专业建议。详见声明
  • 赞赏
  • 评论
  • 转发
  • 分享
评论
请输入评论内容
请输入评论内容
暂无评论