2024年3月28日,Prisma Finance遭受閃電貸攻擊,專案方損失約1,221萬美元。
SharkTeam對此事件進行了技術分析,並總結了安全防範手段,希望後續項目可以引以為戒,共築區塊鏈產業的安全防線。
一、攻擊交易分析
攻擊者1:0x7e39e3b3ff7adef2613d5cc49558eab74b9a4202(簡記為0x7e39)
攻擊合約1:0xd996073019c74b2fb94ead236e32032405bc027c(簡記為0xd996)
攻擊者2:0x7fe83f45e0f53651b3ed9650d2a2c67d8855e385
攻擊合約2:0x4148310fe4544e82f176570c6c7b649290a90e17
被攻擊的目標合約:0x1cc79f3f47bfc060b6f761fcd1afc6d399a968b6
攻擊包含16筆交易,以第一筆攻擊交易為例:
0x00c503b595946bccaea3d58025b5f9b3726177bbdc9674e634244135282116c7
攻擊流程如下:
1. 讀取地址0x56a201b872b50bbdee0021ed4d1bb36359d291ed(簡記為0x56a2)在目標合約中的所有抵押物和債務。
回傳結果如下:
地址0x56a2在目標合約中抵押物共有1,745 wstETH,總債務共有1,442,100 mkUSD。
2. 攻擊者0x7e39透過攻擊合約0xd996呼叫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中提取的屬於地址0x56a2的抵押物,數量約為1745.08 – 463.18 = 1281.90 wstETH。
3. 攻擊者0x7e39透過攻擊合約0xd996從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不再是上面的地址0x56a2,而是質押了1 wstETH的攻擊合約0xd996。
(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是不屬於攻擊合約0xd996,而是屬於上面的地址0x56a2。
5. 最後,攻擊者0x7e39透過攻擊合約0xd996單獨呼叫closeTrove函數,將抵押的1282.80 wstETH 提取到了攻擊合約0xd996中。
償還閃電貸後,攻擊者仍獲利1281.80 wstETH,約2.30M USD。
二、漏洞分析
這次事件的根本原因是專案合約存在邏輯和權限校驗,使得攻擊者可以利用該漏洞來取得其他帳戶位址的質押資產。
攻擊者最終獲得的wstETH是原本地址0x56a2在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