
概述
概述
攻擊分析
概述
https://etherscan.io/tx/0xd55e43c1602b28d4fd4667ee445d570c8f298f5401cf04e62ec329759ecda95d
攻擊分析
概述
攻擊分析
2023 年4 月13 日,Yearn Finance 遭到黑客攻擊,導致大約損失1000 萬美元。本文將分析攻擊過程以及漏洞產生的原因。
攻擊分析
這是一筆攻擊交易:
攻擊者從Balancer 發起了閃電貸,借了500 萬DAI、 500 萬USDC 和200 萬USDT:
然後在Curve 上,攻擊者將500 萬DAI 兌換成了695, 000 USDT,並將350 萬USDC 兌換成151 USDT:
攻擊者調用IEarnAPRWithPool 的recommend函數來檢查當前的APR。此時,只有Aave 的APR 不等於0 :
接下來,攻擊者將800, 000 USDT 轉移到了攻擊合約0x9fcc1409b56cf235d9cdbbb86b6ad5089fa0eb0f 中。在該合約中,攻擊者多次調用了Aave:Lending Pool V1的repay函數,幫助其他人償還債務,以使Aave 的APR 等於0 :
接下來,攻擊者調用了bZx iUSDC 的mint函數,使用156, 000 USDC 鑄造了152, 000 bZx iUSDC,並將其轉移到了Yearn yUSDT:
漏洞分析
接下來攻擊者調用Yearn:yUSDT 的rebalance函數,銷毀bZx iUSDC:
漏洞分析
然後在Curve 上,攻擊者將70, 000 yUSDT 兌換成5, 990, 000 yDAI,將4 億yUSDT 兌換成4, 490, 000 yUSDC,將1, 240, 133, 244, 352, 200 yUSDT 兌換成1 , 360, 000 yTUSD:
漏洞分析
然後在yearn: yDAI 和yearn: yUSDC 中分別調用withdraw ,提取678 萬個DAI 和562 w 萬個USDC,並歸還閃電貸:
漏洞分析"newProvider != provider"這次攻擊中最關鍵的一點,是攻擊者使用100, 000 USDT 鑄造了1, 252, 660, 242, 850, 000 個yUSDT。查看deposit 函數的實現:
可以看到share 的數量和變量pool 相關,pool 越小,share 越大,而pool 的值由_calcPoolValueInToken 獲得:
攻擊者在調用rebalance 函數後,合約中只存在了USDC,但是_balance() 獲取的是USDT 的餘額,USDC 的餘額並不計入其中,因此此時的pool 為1 (攻擊者轉入的) :
這裡顯然是項目方的配置錯誤,yUSDT 合約中應當都是USDT 類的代幣,但是其fulcrum 變量卻是USDC 相關的bZx IUSDC 代幣,因此yUSDT 中的USDC 不計入balance 中:
攻擊者為什麼能調用rebalance 函數來burn 掉bZx iUSDC 代幣呢?查看rebalance 函數的實現:
可以看到在_withdrawFulcrum() 中會存在redeem 和burn 操作,因此我們需要讓
攻擊者通過控制IIEarnManager(apr).recommend(token) 的返回值,使其為都為0 來操控newProvider:
總結
_totalBorrowsVariable 為0 ,即Aave: Lending Pool Core V1 此時沒有人存在債務,為了達成這個條件,攻擊者將池中所有人的債務進行了repay :
關於我們
At Eocene Research, we provide the insights of intentions and security behind everything you know or don't know of blockchain, and empower every individual and organization to answer complex questions we hadn't even dreamed of back then.