2024 年 5 月 15 日,Sonne Finance 遭受攻擊,專案方損失超過 2 千萬美元。

作者:SharkTeam

SharkTeam 對此事件第一時間進行了技術分析,並總結了安全防範手段,希望後續項目可以引以為戒,共築區塊鏈產業的安全防線

一、攻擊交易分析

攻擊者:0xae4a7cde7c99fb98b0d5fa414aa40f0300531f43

攻擊合約:0x02fa2625825917e9b1f8346a465de1bbc150c5b9

目標合約:0xe3b81318b1b6776f0877c3770afddff97b9f5fe5

攻擊交易:0x9312ae377d7ebdf3c7c3a86f80514878deb5df51aad38b6191d55db53e42b7f0

攻擊過程如下:

1. 閃電貸 35,569,150 VELO,並將這些 VELO Token 轉移 (transfer) 至 soVELO 合約中

因為是直接轉帳(捐贈),沒有鑄造 soVELO Token。因此,soVELO 合約中,totalCash 增加了 35,569,150 VELO, soVELO 的 totalSupply 不變。

2. 攻擊者新建合約 0xa16388a6210545b27f669d5189648c1722300b8b,在新合約中對目標合約發動攻擊,攻擊流程如下:

(1)向新合約轉入 2 soVELO

(2)將 soWETH 和 soVELO 聲明為抵押物

(3)向 soWETH 借貸 265,842,857,910,985,546,929 WETH

從以上 borrow 函數的執行過程中,根據 getAccountSnapshot 函數的回傳值,發現:

對於 soWETH 合約,新合約餘額為 0,借貸額為 0,兌換率 (exchangeRate) 為 208,504,036,856,714,856,032,085,073

對於 soVELO 合約,新合約餘額為 2,即抵押了 2wei 的 soVELO,借貸額為 0,兌換率 (exchangeRate) 為 17,735,851,964,756,377,265,143,988,000,000,000,000,00,0

exchangeRate 計算如下:

抵押 1wei 的 soVELO,可以藉貸不超過 17,735,851,964,756,377,265,143,988 VELO,而

借貸 265,842,857,910,985,546,929 WETH,至少需抵押 265,842,857,910,985,546,929 soWETH,

soWETH 的價格:soWETHPrice = 2,892,868,789,980,000,000,000,

soVELO 的價格:soVELOPrice = 124,601,260,000,000,000

抵押 1wei 的 soVELO 可藉貸的 WETH 數量如下:

1 * exchangeRate * soVELOPrice / soWETHPrice = 763,916,258,364,900,996,923

約 763 WETH。僅需 1wei 的 soVELO 抵押就足以支持本次借貸。

借貸 265,842,857,910,985,546,929 WETH(約 265 WETH)換算成抵押物 soVELO,至少需要抵押的 soVELO 數量為:

265,842,857,910,985,546,929 * soWETHPrice / soVELOPrice / exchangeRate = 0.348

即 1wei 的 soVELO 抵押物即可。

實際上 2wei 的 soVELO 抵押物,在藉貸時只用到了 1wei

(4)贖回標的資產,即 35,471,603,929,512,754,530,287,976 VELO 

exchangeRate = 17,735,851,964,756,377,265,143,988,000,000,000,000,000,000

贖回 35,471,603,929,512,754,530,287,976 VELO 所需的抵押物 soVELO 的數量為

35,471,603,929,512,754,530,287,976 * 1e18 / exchangeRate = 1.99999436 

在計算時,因為計算採用了截斷取整而不是四捨五入,實際計算的所需抵押物為 1wei 的 soVELO。

實際抵押物為 2wei 的 soVELO,其中 1wei 用於上面的借貸 265WETH,剩下的 1wei 用於贖回 35M VELO

(5)將藉貸的 265 WETH 以及贖回的 35M VELO 轉帳給攻擊合約

3. 重複 3 次(共 4 次)建立新合約,重複攻擊。

4. 最後,償還閃電貸。

二、漏洞分析

以上攻擊過程中利用了 2 個漏洞:

(1)捐贈攻擊:直接向 soVELO 合約轉帳(捐贈)VELO Token,改變了 exchangeRate,使得攻擊者可以在只有 1wei soVELO 的抵押物的情況下,借貸出約 265 WETH

(2)計算精度問題:利用計算過程中的精度損失以及被修改的 exchangeRate,在只抵押了 1wei soVELO 的情況下,可以贖回 35M VELO 

三、安全建議

針對本次攻擊事件,我們在開發過程中應遵循以下注意事項:

(1)專案在設計和開發過程中,要保持邏輯的完整性和嚴謹性,尤其存款、質押、更新狀態變數以及計算過程中乘除法計算結果的取捨問題,要盡可能多考慮一些情況,使得邏輯完整,沒有漏洞。

(2)專案上線前,需要由第三方專業的審計公司進行智慧合約審計。

免責聲明:作為區塊鏈資訊平台,本站所發布文章僅代表作者及來賓個人觀點,與 Web3Caff 立場無關。文章內的資訊僅供參考,均不構成任何投資建議及要約,並請您遵守所在國家或地區的相關法律法規。