Yearn Finance攻击事件分析-ODAILY_USD:YEA

概述

2023年4月13日,YearnFinance遭到黑客攻击,导致大约损失1000万美元。本文将分析攻击过程以及漏洞产生的原因。

攻击分析

这是一笔攻击交易:

https://etherscan.io/tx/0xd55e43c1602b28d4fd4667ee445d570c8f298f5401cf04e62ec329759ecda95d

攻击者从Balancer发起了闪电贷,借了500万DAI、500万USDC和200万USDT:

然后在Curve上,攻击者将500万DAI兑换成了695,000USDT,并将350万USDC兑换成151USDT:

攻击者调用IEarnAPRWithPool的recommend函数来检查当前的APR。此时,只有Aave的APR不等于0:

DeFi收益聚合器Yearn针对v3版本发起黑客公开挑战计划:7月26日消息,DeFi 收益聚合器 Yearn 在社交媒体上发文表示,其 v3 版本已经经过多次审核和内部审查,即日起将发起黑客挑战计划,若黑客能成功从 Yearn v3 Vault 中获取资金,Yearn 将不予追究。[2023/7/26 15:58:43]

接下来,攻击者将800,000USDT转移到了攻击合约0x9fcc1409b56cf235d9cdbbb86b6ad5089fa0eb0f中。在该合约中,攻击者多次调用了Aave:LendingPoolV1的repay函数,帮助其他人偿还债务,以使Aave的APR等于0:

攻击者调用了yUSDT的deposit函数,抵押了900,000USDT,并获得了820,000yUSDT:

接下来,攻击者调用了bZxiUSDC的mint函数,使用156,000USDC铸造了152,000bZxiUSDC,并将其转移到了YearnyUSDT:

yearn.finance购买并质押141.4万枚CRV:6月21日消息,DeFi收益聚合器yearn.finance发推称,购买并质押了141.4万枚CRV,yearn.finance 表示,这将同时提高Curve机池的“boost”(加速功能)与 yveCRV、yvBOOST奖励,使得质押者获得更高的年化收益率。[2021/6/21 23:54:14]

攻击者调用Yearn:yUSDT的withdraw函数,将820,000yUSDT兑换成1,030,000USDT。此时,合约中只剩下攻击者转移的bZxiUSDC:

接下来攻击者调用Yearn:yUSDT的rebalance函数,销毁bZxiUSDC:

然后攻击者向yUSDT合约转移了1/e6个USDT,并调用了deposit函数,抵押了10,000USDT,获得了1,252,660,242,850,000yUSDT:

Yearn v2策略代码正处于审查状态:12月11日,Yearn.Finance核心开发者banteg发推称,Yearn v2策略代码正处于审查状态。[2020/12/11 14:57:38]

然后在Curve上,攻击者将70,000yUSDT兑换成5,990,000yDAI,将4亿yUSDT兑换成4,490,000yUSDC,将1,240,133,244,352,200yUSDT兑换成1,360,000yTUSD:

然后在yearn:yDAI和yearn:yUSDC中分别调用withdraw,提取678万个DAI和562w万个USDC,并归还闪电贷:

漏洞分析

这次攻击中最关键的一点,是攻击者使用100,000USDT铸造了1,252,660,242,850,000个yUSDT。查看deposit函数的实现:

研究员:yearn.finance需要从Curve转向多元化:金色财经报道,加密对冲基金Spartan Capital的研究负责人Jason Choi表示,yearn.finance过于依赖Curve(CRV)平台上的稳定币池。Choi认为,yearn.finance的策略是将其大量资金用于yCRV vault,这正在损害YFI恢复上升趋势的机会。此外,Choi强调,由于通货膨胀,CRV的前景看跌,只要它仍然是主要策略,就将影响YFI的整体价格。该研究员认为,yearn.finance需要从Curve转向多元化,超越简单的流动性挖矿策略以进行创新,并从这些策略中获取收入来源。[2020/10/8]

可以看到share的数量和变量pool相关,pool越小,share越大,而pool的值由_calcPoolValueInToken获得:

攻击者在调用rebalance函数后,合约中只存在了USDC,但是_balance()获取的是USDT的余额,USDC的余额并不计入其中,因此此时的pool为1:

yearn.finance 8号治理提案考虑采用减半机制对治理代币YFI进行增发:DeFi聚合收益协议yearn.finance的治理代币YFI的8号治理议案正在进行中,据相关消息,8号提案是对已经通过的0号提案(治理代币YFI总量3万枚限制)的补充。具体内容包括:

1. 采用类似比特币的减半模式,每周减半,在两个月内增发3万枚代币,为形成更大社区共识争取时间;

2. 原定于三天以后截止的YFI流动性挖矿继续进行;

3. 增发完成后销毁增发私钥,以后无法增发,总量限制在6万枚。

目前支持132万票,反对2.5万票,但参与人数仍未达到项目要求的33%。Coingecko研究分析师、yearn.finance社区治理的签署人之一Dary Lau表示,未来将社区将继续决定代币的通胀代币机制以继续保持合理的流动性。

据DeBank数据,yearn项目的总锁仓量(Total Value Locked)已达到2.905亿美元,超过Balancer排名第6,与第5名Curve仅相差4300万美元。YFI代币市值在DeBank收录的27个DeFi协议中,仅以2000万美元排名23名。[2020/7/23]

这里显然是项目方的配置错误,yUSDT合约中应当都是USDT类的代币,但是其fulcrum变量却是USDC相关的bZxIUSDC代币,因此yUSDT中的USDC不计入balance中:

攻击者为什么能调用rebalance函数来burn掉bZxiUSDC代币呢?查看rebalance函数的实现:

可以看到在_withdrawFulcrum()中会存在redeem和burn操作,因此我们需要让"newProvider!=provider"成立,其中recommend()的实现:

攻击者通过控制IIEarnManager(apr).recommend(token)的返回值,使其为都为0来操控newProvider:

如何让其都为0呢,该函数的返回值和计算出的各个DeFi中的APR相关,由于Compound,bZx,dydx中没有池子,因此只需要控制Aave(Aave:LendingPoolCoreV1)即可:

要使其值返回为0,需要让apr.calculateInterestRates函数的第一个返回值为0:

即让currentLiquidityRate为0,该值和_totalBorrowsStable、_totalBorrowsVariable相关,当这两个个值都为0时,currentLiquidityRate为0:

_totalBorrowsVariable为0,即Aave:LendingPoolCoreV1此时没有人存在债务,为了达成这个条件,攻击者将池中所有人的债务进行了repay:

最后,攻击者让_totalBorrowsVariable变为0,所以它能够调用rebalance函数burn掉bZxiUSDC代币:

总结

此次Yearn攻击事件的根本原因是项目方的配置错误。攻击者通过一系列精妙的手法利用了该漏洞,最终获利大约1000万美元。

关于我们

AtEoceneResearch,weprovidetheinsightsofintentionsandsecuritybehindeverythingyouknowordon'tknowofblockchain,andempowereveryindividualandorganizationtoanswercomplexquestionswehadn'tevendreamedofbackthen.

了解更多:Website|Medium|Twitter

郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。

水星链

[0:46ms0-1:277ms