SharkTeam:Prisma Finance被攻擊事件分析
SharkTeam
2024-04-07 11:08
本文约1517字,阅读全文需要约6分钟
2024 年3 月28 日,Prisma Finance 遭受閃電貸攻擊,專案方損失約1,221 萬美元。 SharkTeam 對此事件進行了技術分析,並總結了安全防範手段,希望後續項目可以引以為戒,共築區塊鏈產業的安全防線。

2024 年3 月28 日,Prisma Finance 遭受閃電貸攻擊,專案方損失約1,221 萬美元。

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

一、Prisma Finance 攻擊交易分析

攻擊者1 :0x7e39e3b3ff7adef2613d5cc49558eab74b9a4202(簡記為0x 7 e 39)

攻擊合約1 :0xd996073019c74b2fb94ead236e32032405bc027c(簡記為0x d 996)

攻擊者2 :0x7fe83f45e0f53651b3ed9650d2a2c67d8855e385

攻擊合約2 :0x4148310fe4544e82f176570c6c7b649290a90e17

被攻擊的目標合約:0x1cc79f3f47bfc060b6f761fcd1afc6d399a968b6

攻擊包含16 筆交易,以第一筆攻擊交易為例:

0x00c503b595946bccaea3d58025b5f9b3726177bbdc9674e634244135282116c7

攻擊流程如下:

1. 讀取地址0x56a201b872b50bbdee0021ed4d1bb36359d291ed(簡記為0x 56 a 2)在目標合約中的所有抵押物和債務。

回傳結果如下:

地址0x 56 a 2 在目標合約中抵押物共有1, 745 wstETH,總債務共有1, 442, 100 mkUSD。

2. 攻擊者0x 7 e 39 通過攻擊合約0x d 996 呼叫mkUSD 債務合約中的flashLoan 函數。

參數receiver 設定為MigrateTroveZap,amount 為上面查詢到的全部債務。

然後,在flashLoan 函數中會呼叫receiver(這裡是MigrateTroveZap)中的onFlashLoan 函數。

onFlashLoan 函數透過閃電貸先償還原來的所有債務,提取抵押物到receiver,然後receiver 將一定數量的抵押物重新抵押,並藉取一定的債務。其中主要呼叫了2 個函數:

(1)closeTrove 函數,償還債務並將所有的抵押物(1745.08 swtETH)從troverManager 提取到receiver(這裡是MigrateTroveZap 合約);

(2)openTrove 函數,由receiver 將463.18 wstETH 重新抵押到troverManager 中,並負債1, 443, 598 mkUSD。

從上面資料可以看出,flashLoan 函數執行完成後,receiver 中仍然保留了從troverManager 中提取的屬於地址0x 56 a 2 的抵押物,數量約為1745.08 – 463.18 = 1281.90 wstETH。

3. 攻擊者0x 7 e 39 通過攻擊合約0x d 996 從Balancer 中透過閃電貸借取了1 wstETH。

然後,抵押1 wstETH 並藉取債務2000 mkUSD,加上fee,共負債2200 mkUSD。

4. 與步驟2 類似,呼叫mkUSD 債務合約中的flashLoan 函數,這裡參數receiver 仍然設定為MigrateTroveZap,amount 為上一筆質押1 wstETH 後的全部債務,即2000 mkUSD。在FflashLoan 函數中會呼叫receiver 中的onFlashLoan 函數,然後呼叫closeTrove 和openTrove 函數。

只是,這裡closeTrove 和openTrove 函數中的參數account 不再是上面的地址0x 56 a 2 ,而是質押了1 wstETH 的攻擊合約0x d 996 。

(1)closeTrove 函數,償還債務並將所有的抵押物(1 swtETH)從troverManager 提取到receiver(這裡仍然是MigrateTroveZap 合約)。此時receiver 中共有1281.90 + 1 = 1282.90 wstETH.

(2)openTrove 函數,由receiver 將1282.80 wstETH(幾乎全部)重新抵押到troverManager 中,並負債2001.8 mkUSD。

實際上,這裡抵押物中1281.80 wstETH 是不屬於攻擊合約0x d 996 ,而是屬於上面的地址0x 56 a 2 。

5. 最後,攻擊者0x 7 e 39 通過攻擊合約0x d 996 單獨呼叫closeTrove 函數,將抵押的1282.80 wstETH 提取到了攻擊合約0x d 996 中。

償還閃電貸後,攻擊者仍獲利1281.80 wstETH,約2.30 M USD。

二、漏洞分析

這次事件的根本原因是專案合約存在邏輯和權限校驗,使得攻擊者可以利用該漏洞來取得其他帳戶地址的質押資產。

攻擊者最終獲得的wstETH 是原本地址0x 56 a 2 在troverManager 合約中的抵押物,透過mkUSD 合約的flashLoan 函數,自訂MigrateTroveZap 合約中onFlashLoan 函數的參數,利用MigrateTroveZap 將其轉變為攻擊合約的抵押物,然後將其提取出來。

攻擊者透過mkUSD 合約中的flashLoan 函數以及MigrateTroveZap 合約中的onFlashLoan 函數操縱其他帳戶地址的抵押和提取。

(1)flashLoan 函數中缺少對參數receiver 地址的校驗,因為onFlashLoan 函數中receiver 會接收account 的所有抵押物,因此需要對receiver 進行可信的校驗;

(2)onFlashLoan 函數中缺少account 地址的校驗,因為closeTrove 和openTrove 函數都是操作的account 的資產,因此需要對account 增加權限方面的校驗;

除了這兩個地址參數的校驗外,可能還需要對flashLoan 函數中的數量參數以及實現邏輯進行校驗。

三、安全建議

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

(1)在設計開發過程中,要維持邏輯的完整性和嚴謹性,尤其是涉及資產的轉移過程中,更要加強對函數研究權限的校驗,保證呼叫者、呼叫函數、函數參數、轉帳邏輯等都是安全可信的。

(2)專案上線前,需要找專業的第三方審計團隊進行合約審計。

About Us

SharkTeam 的願景是保護Web3世界的安全。團隊由來自世界各地的經驗豐富的安全專業人士和高級研究人員組成,精通區塊鍊和智慧合約底層理論。提供包括風險識別與阻斷、智慧合約審計、KYT/AML、鏈上分析等服務,並打造了鏈上智慧風險識別與阻斷平台ChainAegis,能有效對抗Web3世界的高級持續性威脅(Advanced Persistent Threat ,APT)。已與Web3生態各領域的關鍵參與者,如Polkadot、Moonbeam、polygon、Sui、OKX、imToken、Collab.Land 等建立長期合作關係。

官網:https://www.sharkteam.org

Twitter:https://twitter.com/sharkteamorg

Telegram:https://t.me/sharkteamorg

Discord:https://discord.gg/jGH9xXCjDZ

SharkTeam
作者文库