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