針對操縱價格的漏洞,可以採用鏈下的價格預言機,這樣可以避免價格被操縱。

作者: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 立場無關。文章內的資訊僅供參考,均不構成任何投資建議及要約,並請您遵守所在國家或地區的相關法律法規。