概述
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推出新的LINK yVault:3月9日消息,Yearn.Finance官方宣布推出新的LINK yVault。該庫可在Curve Finance上LINK/sLINK池獲取CRV獎勵。[2021/3/9 18:28:14]
接下來,攻擊者將800,000USDT轉移到了攻擊合約0x9fcc1409b56cf235d9cdbbb86b6ad5089fa0eb0f中。在該合約中,攻擊者多次調用了Aave:LendingPoolV1的repay函數,幫助其他人償還債務,以使Aave的APR等于0:
攻擊者調用了yUSDT的deposit函數,抵押了900,000USDT,并獲得了820,000yUSDT:
接下來,攻擊者調用了bZxiUSDC的mint函數,使用156,000USDC鑄造了152,000bZxiUSDC,并將其轉移到了YearnyUSDT:
Yearn.Finance推出新的Compound機槍池:11月15日,Yearn.Finance官方發布機槍池周報。內容顯示:1.一個新的Compound機槍池;2.yveCRV新增快捷交易方式;3.vault v2的HEGIC池正在部署中;4.SUSHI lp、USDC的yvault v2即將推出。[2020/11/16 20:55:15]
攻擊者調用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.finance:開發人員已為SushiSwap測試新ETH/DAI保險庫:yearn.finance轉發推特稱,我們很高興與大家分享,工程師Andy已開發并正在為SushiSwap測試一個新的ETH/DAI保險庫。您可以將SushiSwap ETH/DAI資金池養殖(farm)起來,以賺取更多的ETH/DAI SLP代幣。[2020/11/10 12:08:19]
然后在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創始人:資金正在成為defi游戲中使用的裝備:yearn.finance創始人Andre Cronje剛剛發推表示,游戲化在貨幣政策中的應用讓我興奮不已。你的資金正在成為在這個defi游戲中使用的裝備。到目前為止我們一直在克隆“tradfi”,接下來我們將進入“gamefi”。[2020/9/10]
可以看到share的數量和變量pool相關,pool越小,share越大,而pool的值由_calcPoolValueInToken獲得:
攻擊者在調用rebalance函數后,合約中只存在了USDC,但是_balance()獲取的是USDT的余額,USDC的余額并不計入其中,因此此時的pool為1:
yearn.finance新提案:將YFI質押獎勵變為增加YFI份額:yearn.finance(YFI)在推特上表示,社區成員Matt West發起新提案:系統費用/獎勵被收集并歸為yUSD(yyCRV),以LP的形式提供給vaults。在達到treasury上限之后,這部分資金將分配給治理參與者。這項提案將把治理質押YFI的獎勵從yCRV改為通過從市場購買并增加至質押池來增加YFI份額。[2020/8/18]
這里顯然是項目方的配置錯誤,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
據官方公告,加密貨幣交易平臺火必宣布將加入BTTC(BitTorrentchain)生態,并支持基于BTTC的第二層(L2)網絡開發.
1900/1/1 0:00:00混合式zkRollup 以太坊上的數據都是公開的,但很多數據和交易有隱私的需求,基于此Aztec推出了透明+隱私混合式zkRollup。大家比較熟悉混動汽車的概念,即把油和電結合起來驅動汽車.
1900/1/1 0:00:00Qredo首先是為機構設計的。但它提供的治理工具對個人也非常有用。您的Qredo錢包的自定義簽名方案和子賬戶可用于一切,從保護您的遺產到保護您的資產免受基本攻擊.
1900/1/1 0:00:00隨著金融、娛樂、社交等行業版圖開始邁入Web3時代,區塊鏈正在改變當下行業發展的現狀,帶動各領域事業追求開放、透明、去中心化的未來.
1900/1/1 0:00:00加密貨幣交易平臺火必Huobi在Web3.0領域的探索更進了一步。3月21日,據火必Huobi官方消息,火必宣布聯合波場TRON、DMCLabs共同推出經多米尼克國政府授權的多米尼克元宇宙綁定代.
1900/1/1 0:00:00五一假日尚未落幕,V神又有新動作。4月30日,以太坊創始人VitalikButerin發布了一個新的概念驗證,演示了如何把分片擴展解決方案“栓在”以太坊主鏈上,并在Twitter發帖稱“分片即將.
1900/1/1 0:00:00