針對操縱價格的漏洞,可以採用鏈下的價格預言機,這樣可以避免價格被操縱。
作者:SharkTeam
2024 年 6 月 10 日,UwU Lend 遭受攻擊,專案方損失約 1,930 萬美元。
SharkTeam 對此事件第一時間進行了技術分析,並總結了安全防範手段,希望後續項目可以引以為戒,共築區塊鏈產業的安全防線。
一、攻擊交易分析
攻擊者:0x841dDf093f5188989fA1524e7B893de64B421f47
攻擊者共發動了 3 筆攻擊交易:
攻擊交易 1:
0x242a0fb4fde9de0dc2fd42e8db743cbc197ffa2bf6a036ba0bba303df296408b
攻擊交易 2:
0xb3f067618ce54bc26a960b660cfc28f9ea0315e2e9a1a855ede1508eb4017376
攻擊交易 3:
0xca1bbf3b320662c89232006f1ec6624b56242850f07e0f1dadbe4f69ba0d6ac3
以攻擊交易 1 為例,進行分析:
攻擊合約:0x21c58d8f816578b1193aef4683e8c64405a4312e
目標合約:UwU Lend 金庫合約,包括:
uSUSDE:0xf1293141fc6ab23b2a0143acc196e3429e0b67a6
uDAI:0xb95bd0793bcc5524af358ffaae3e38c3903c7626
uUSDT:0x24959f75d7bda1884f1ec9861f644821ce233c7d
攻擊過程如下:
1. 從不同平台閃電貸多種代幣,包括 WETH, WBTC, sUSDe, USDe, DAI, FRAX, USDC, GHO
代幣接收地址為 0x4fea76b66db8b548842349dc01c85278da3925da
閃電貸的代幣和數量如下:
從 AaveV3 閃電貸 159,053.16 WETH 和 14,800 WBTC
從 AaveV2 閃電貸 40,000 WETH
從 Spark 閃電貸 91,075.70 WETH 和 4,979.79 WBTC
從 Morpho 閃電貸 301,738,880.01 sUSDe,236,934,023.17 USDe 和 100,786,052.15 DAI
從 Uniswap V3: FRAX-USDC 中閃電貸 60,000,000 FRAX 和 15,000,000 USDC
從 Balancer 中閃電貸 4,627,557.47 GHO 和 38,413.34 WETH
從 Maker 閃電貸 500,000,000 DAI
共約 328,542.2 WETH,19779.79 WBTC,600786052.15 DAI,301,738,880.01 sUSDe,236,934,023.17 USDe,4,627,557.4007,000,000,000 1005,000,000 105,0005
2. 將閃電貸的 Token 轉移到合約 0xf19d66e82ffe8e203b30df9e81359f8a201517ad(簡記為 0xf19d)中,為發動攻擊做準備。
3. 透過兌換 (exchange) 代幣,控制 sUSDe 的價格(降低價格)
(1)USDecrvUSD.exchange
將 8,676,504.84 USDe 兌換成 8,730,453.49 crvUSD,USDecrvUSD 中 USDe 數量增加,價格降低,crvUSD 數量減少,價格提高
(2)USDeDAI.exchange
將 46,452,158.05 USDe 兌換成 14,389,460.59 DAI,USDeDAI 中 USDe 數量增加,價格降低,DAI 數量減少,價格提高
(3)FRAXUSDe.exchange
將 14,477,791.69 USDe 兌換成 46,309,490.86 FRAX,USDeDAI 中 USDe 數量增加,價格降低,FRAX 數量減少,價格提高
(4)GHOUSDe.exchange
將 4,925,427.20 USDe 兌換成 4,825,479.07 GHO,USDeDAI 中 USDe 數量增加,價格降低,GHO 數量減少,價格提高
(5)USDeUSDC.exchange
將 14,886,912.83 USDe 兌換成 14,711,447.94 USDC,USDeDAI 中 USDe 數量增加,價格降低,USDC 數量減少,價格提高
以上 exchange 後,5 個資金池中的 USDe 價格降低。最終導致 sUSDe 價格大跌。
4. 不斷創造借貸頭寸,即向 LendingPool 合約存入其他資產 (WETH,WBTC 和 DAI),然後再藉貸 sUSDe。因為 sUSDe 價格大跌,因此,借出的 sUSDe 數量比價格大跌前多很多。
5. 與步驟 3 類似,反向操作將 sUSDe 的價格拉高。
由於 sUSDe 被拉高,第 4 步借貸的部位價值超過抵押價值,達到了清算的標準。
6. 批量地對借貸部位進行清算,獲得清算獎勵 uWETH
7. 償還貸款,提取標的資產 WETH, WBTC,DAI 和 sUSDe。
8. 將 sUSDe 再次存入 LendingPool 中,此時 sUSDe 價格被拉高,因此可以藉貸出較多其他資產,包括 DAI 和 USDT。
9. 兌換代幣,償還閃電貸。最終獲利 1,946.89 ETH
二、漏洞分析
透過上述分析,發現整個攻擊過程存在大量的閃電貸以及多次操縱 sUSDe 的價格,當抵押 sUSDe 時,會影響借出資產的數量;當借出 sUSDe 時,會影響借貸率,進而影響清算係數(健康因子)。
攻擊者利用這一點,透過閃電貸砸低 sUSDe 的價格,抵押其他資產,借出大量的 sUSDe,然後再抬高 sUSDe 的價格,清算抵押資產而獲利,並將剩餘的 sUSDe 抵押借出其他資產,最後償還閃電貸,攻擊完成。
從上面第 3 步發現,攻擊者透過控制 Curve Finance 的 USDe/rvUSD, USDe/AI, FRAX/SDe, GHO/SDe 和 USDe/SDC 這 5 個交易池中的 USDe 的價格來操縱 sUSDe 的價格的。價格讀取函數如下:
其中,sUSDe 價格由 11 個價格計算得到的,其中前 10 個由 CurveFinance 中讀取,最後一個又 UniswapV3 提供。
從 CurveFinance 讀取的價格則是由 USDe/rvUSD, USDe/AI, FRAX/SDe, GHO/SDe 和 USD/SDC 這 5 個交易池提供,也是攻擊者在攻擊交易中操縱的 5 個交易池。
回傳的價格由 uwuOracle 讀取的 price,CurveFinance 交易池合約中的 price_oracle(0) 和 get_p(0) 計算得到的。
(1)price 是有 Chainlink 提供的價格,是不可以操縱的;
(2)交易池參數
攻擊者透過操縱交易池的代幣數量來操縱 get_p(0) 的回傳值,進而實現操縱價格。
三、安全建議
針對本次攻擊事件,開發過程中應遵循以下注意事項:
(1)針對操縱價格的漏洞,可以採用鏈下的價格預言機,這樣可以避免價格被操縱。
(2)專案上線前,需要由第三方專業的審計公司進行智慧合約審計。
免責聲明:作為區塊鏈資訊平台,本站所發布文章僅代表作者及來賓個人觀點,與 Web3Caff 立場無關。文章內的資訊僅供參考,均不構成任何投資建議及要約,並請您遵守所在國家或地區的相關法律法規。