概述
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最大支持者之一Blue Kirby宣布即将退出该项目:yearn.finance最大支持者之一Blue Kirby最近宣布即将退出该项目。就在几天前,他离开了项目的核心团队,此前Blue Kirby担任项目的社区沟通主管。10月4日,Blue Kirby宣布他将离开“与YFI和yearn有关的一切”,并打趣说他改天可能再回来改进这个项目。他解释称这样做是为了保护自己的安全和隐私,因为他收到了与“Eminence”事件有关的威胁。
此前消息,yearn.finance创始人Andre Cronje刚推出的游戏项目Eminence(EMN)遭遇“Flash贷款”攻击,黑客将800万美元的资金返还给了yearn部署者合约。官方目前正在调查具体情况,并将重新分配受攻击的800万美元。对此,Cronje发推解释该攻击事件称,凌晨3点左右收到消息:1.近1500万美元被存入合约;2.全部的1500万美元被攻击者利用;3.800万已发送至Andre Cronje的部署者帐户。该漏洞利用程序本身,在曲线上铸造了许多EMN,销毁EMN换取另一种货币,然后卖掉代币又换取EMN。据悉,EMN已发布测试合约,并独立于YFI。(CryptoSlate)[2020/10/6]
接下来,攻击者将800,000USDT转移到了攻击合约0x9fcc1409b56cf235d9cdbbb86b6ad5089fa0eb0f中。在该合约中,攻击者多次调用了Aave:LendingPoolV1的repay函数,帮助其他人偿还债务,以使Aave的APR等于0:
yearn.finance创始人:资金正在成为defi游戏中使用的装备:yearn.finance创始人Andre Cronje刚刚发推表示,游戏化在货币政策中的应用让我兴奋不已。你的资金正在成为在这个defi游戏中使用的装备。到目前为止我们一直在克隆“tradfi”,接下来我们将进入“gamefi”。[2020/9/10]
攻击者调用了yUSDT的deposit函数,抵押了900,000USDT,并获得了820,000yUSDT:
接下来,攻击者调用了bZxiUSDC的mint函数,使用156,000USDC铸造了152,000bZxiUSDC,并将其转移到了YearnyUSDT:
攻击者调用Yearn:yUSDT的withdraw函数,将820,000yUSDT兑换成1,030,000USDT。此时,合约中只剩下攻击者转移的bZxiUSDC:
yearn.finance:治理每周可调整curve.fi池的奖励,优先级和权重经讨论决定:yearn.finance官方发推称,dao.curve.fi/gaugeweight允许治理每周调整curve.fi池的奖励,可讨论哪些池应该优先和给予的具体权重。一旦决定,这些调整将保持默认状态,直到另一项提案做出新的调整。[2020/8/27]
接下来攻击者调用Yearn:yUSDT的rebalance函数,销毁bZxiUSDC:
然后攻击者向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:有关同意yVaults参与治理的投票人数已达目标:yearn.finance官方刚刚发推文称,在关于是否允许yVaults参与治理的投票中,同意的人数已达成目标。假设这些支持的投票能一直维持到8月31日,那么提案将获得通过,yVaults将被允许参与治理。[2020/8/25]
然后在yearn:yDAI和yearn:yUSDC中分别调用withdraw,提取678万个DAI和562w万个USDC,并归还闪电贷:
漏洞分析
这次攻击中最关键的一点,是攻击者使用100,000USDT铸造了1,252,660,242,850,000个yUSDT。查看deposit函数的实现:
可以看到share的数量和变量pool相关,pool越小,share越大,而pool的值由_calcPoolValueInToken获得:
外媒:yEarn创始人或将退出DeFi行业:曾帮助DeFi发展为一个价值数十亿美元产业的去中心化金融(DeFi)协议yEarn项目创始人Andre Cronje表示将要退出这个行业,他声称“自己现在已经疲惫不堪、破产、濒临退出”。他还称指出,“有”的DeFi社区是他不满的原因。(Decrypt)[2020/8/8]
攻击者在调用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
标签:USDSDTUSDTEARNPUSD币世界快讯GUSDTcoinbase买的USDT不能发送Heco YearnFinance
相关阅读KuCoinLabs第一季孵化计划项目解析KuCoinLabs第一季孵化计划项目解析KuCoinLabs第一季孵化计划项目解析近日,KuCoinLabs第1季孵化计划开始.
1900/1/1 0:00:004月17日晚,火币网官微发博称,原滴滴首席安全官吴树鹏加入火币,担任火币集团首席安全官,并将全面领导火币安全团队,任命即日生效.
1900/1/1 0:00:00文|卢晓明编辑|罗彬萌离EOS节点投票还有20天。竞选成了币价强心针。竞选开始不到两个月,币价从最低点4美元拉升至最高21美元。按总发行量10亿算,目前市值约170亿美元.
1900/1/1 0:00:00近日,全球权威财经媒体Bloomberg、知名财经媒体Benzinga、道琼斯旗下新闻网站MarketWatch以及美国知名科技博客BusinessInsider等多家海外权威媒体对波场TRON.
1900/1/1 0:00:00前几天看到一篇文章里说到了曾经风光无限的几个蓝筹PFPNFT在这轮熊市中跌跌不休,有的价格甚至跌了99%,这让前两年刚入场的很多新韭菜们心头在流血.
1900/1/1 0:00:00去年NFT市场因Blur的出现风卷雨涌,Blur全新的模式给死气沉沉的NFT市场带来新的激情。然而随着时间推移,第一波空投结束,这种激情似乎未能持续.
1900/1/1 0:00:00