概述
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:
Yearn Finance削减ETH等关键资金库的管理费用:9月1日消息,Yearn Finance宣布削减ETH、USDC、DAI等关键资金库的管理费用。Yearn表示,削减费用是长期产品愿景的一部分,以继续构建专注于性能的创新自动化产品。[2022/9/1 13:02:18]
接下来,攻击者将800,000USDT转移到了攻击合约0x9fcc1409b56cf235d9cdbbb86b6ad5089fa0eb0f中。在该合约中,攻击者多次调用了Aave:LendingPoolV1的repay函数,帮助其他人偿还债务,以使Aave的APR等于0:
攻击者调用了yUSDT的deposit函数,抵押了900,000USDT,并获得了820,000yUSDT:
接下来,攻击者调用了bZxiUSDC的mint函数,使用156,000USDC铸造了152,000bZxiUSDC,并将其转移到了YearnyUSDT:
Iron Bank、Yearn Finance和Homora加入Optimism网络:金色财经报道,周二,基于以太坊的借贷平台Iron Bank、Yearn Finance和Homora加入Optimism网络,以提高其用户的跨链互操作性、安全性和资本效率。Iron Bank的主要贡献者Puff在一份声明中解释说:“通过上线Optimism,我们的目标是让DeFi作为协议到协议的流动性骨干更易于访问、可扩展和可靠。”
Yearn Finance的Dark Ghosty表示,在网络需求旺盛的时候,以太坊的费用变得让用户望而却步,在今年早些时候的一个这样的时期,每笔交易的网络费用高达9000美元。这就是为什么建立在像Optimism这样的网络上,让DeFi项目更容易被用户接受。(CoinDesk)[2022/8/16 12:28:38]
攻击者调用Yearn:yUSDT的withdraw函数,将820,000yUSDT兑换成1,030,000USDT。此时,合约中只剩下攻击者转移的bZxiUSDC:
接下来攻击者调用Yearn:yUSDT的rebalance函数,销毁bZxiUSDC:
yearn.finance宣布推出yVault产品线新品yvBOOST:yearn.finance宣布推出yVault产品线的新品yvBOOST,允许用户将从yveCRV vault赚取的3Crv售出为CRV并存回该vault,增加yvBOOST的yveCRV余额。
通过该vault,用户将获得长期CRV的复利敞口,同时随着时间的推移,通过Curve Finance策略,用户将增加所有Yearn vault的收益。
官方表示,为了创造流动性,已在SushiSwap上创建了yvBOOST-ETH池。目前的yveCRV-ETH池将迁移到yvBOOST-ETH,团队将发布一个工具帮助用户进行迁移。
具体存款方案如下:- 向yveCRV存款每周获得3Crv分发;- 向yvBOOST存款每周获得CRV长期复利敞口;- 向yvBOOST-ETH池存款获得高收益;- 向yvBOOST存款并开始赚取收益。[2021/5/1 21:16:37]
然后攻击者向yUSDT合约转移了1/e6个USDT,并调用了deposit函数,抵押了10,000USDT,获得了1,252,660,242,850,000yUSDT:
然后在Curve上,攻击者将70,000yUSDT兑换成5,990,000yDAI,将4亿yUSDT兑换成4,490,000yUSDC,将1,240,133,244,352,200yUSDT兑换成1,360,000yTUSD:
Yearn.Finance已开始申请3CRV奖励:12月9日,Yearn.Finance核心开发者banteg发推称,Yearn.Finance已开始申请3CRV奖励,这些奖励将被发送至yveCRV金库。3CRV奖励为Curve Finance自9月中旬以来累积的交易费用,大约有300万美元的3CRV (3Pool的LP代币),Curve Finance表示用户现在可申领。[2020/12/9 14:42:22]
然后在yearn:yDAI和yearn:yUSDC中分别调用withdraw,提取678万个DAI和562w万个USDC,并归还闪电贷:
漏洞分析
这次攻击中最关键的一点,是攻击者使用100,000USDT铸造了1,252,660,242,850,000个yUSDT。查看deposit函数的实现:
yearn.finance将在3-4天后推出v2版本:7月24日消息,yearn.finance官方表示,将在3-4天后推出v2版本。目前,流动性挖矿越来越复杂,yearn.finance团队发现v1版本正在僵化,已经无法纳入一个利率较高新的借贷池。新推出的v2版本相比v1将更加简洁,只需要登陆(checkin)就可以参与不断增长的投资组合(v2会提供一切服务)。(Medium)[2020/7/24]
可以看到share的数量和变量pool相关,pool越小,share越大,而pool的值由_calcPoolValueInToken获得:
攻击者在调用rebalance函数后,合约中只存在了USDC,但是_balance()获取的是USDT的余额,USDC的余额并不计入其中,因此此时的pool为1:
这里显然是项目方的配置错误,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
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。