Prisma Finance被攻擊事件分析吸取教訓
一、攻擊交易分析
攻擊者1:0x7e39e3b3ff7adef2613d5cc49558eab74b9a4202(簡記為0x7e39)
攻擊合約1:0xd996073019c74b2fb94ead236e32032405bc027c(簡記為0xd996)
攻擊者2:0x7fe83f45e0f53651b3ed9650d2a2c67d8855e385
攻擊合約2:0x4148310fe4544e82f176570c6c7b649290a90e17
被攻擊的目標合約:0x1cc79f3f47bfc060b6f761fcd1afc6d399a968b6
攻擊包含16筆交易,以第一筆攻擊交易為例:
0x00c503b595946bccaea3d58025b5f9b3726177bbdc9674e634244135282116c7
攻擊流程如下:
1. 讀取地址0x56a201b872b50bbdee0021ed4d1bb36359d291ed(簡記為0x56a2)在目標合約中的所有抵押物和債務。
返回結(jié)果如下:
地址0x56a2在目標合約中抵押物共有1,745 wstETH,總債務共有1,442,100 mkUSD。
2. 攻擊者0x7e39通過攻擊合約0xd996調(diào)用mkUSD債務合約中的flashLoan函數(shù)。
參數(shù)receiver設(shè)置為MigrateTroveZap,amount為上面查詢到的全部債務。
然后,在flashLoan函數(shù)中會調(diào)用receiver(這里是MigrateTroveZap)中的onFlashLoan函數(shù)。
onFlashLoan函數(shù)通過閃電貸先償還原來的所有債務,提取抵押物到receiver,然后receiver將一定數(shù)量的抵押物重新抵押,并借取一定的債務。其中主要調(diào)用了2個函數(shù):
(1)closeTrove函數(shù),償還債務并將所有的抵押物(1745.08 swtETH)從troverManager提取到receiver(這里是MigrateTroveZap合約);
(2)openTrove函數(shù),由receiver將463.18 wstETH重新抵押到troverManager中,并負債1,443,598 mkUSD。
從上面數(shù)據(jù)可以看出,flashLoan函數(shù)執(zhí)行完成后,receiver中仍然保留了從troverManager中提取的屬于地址0x56a2的抵押物,數(shù)量約為1745.08 – 463.18 = 1281.90 wstETH。
3. 攻擊者0x7e39通過攻擊合約0xd996從Balancer中通過閃電貸借取了1 wstETH。
然后,抵押1 wstETH并借取債務2000 mkUSD,加上fee,共計負債2200 mkUSD。
4. 與步驟2類似,調(diào)用mkUSD債務合約中的flashLoan函數(shù),這里參數(shù)receiver仍然設(shè)置為MigrateTroveZap,amount為上一筆質(zhì)押1 wstETH后的全部債務,即2000 mkUSD。在FflashLoan函數(shù)中會調(diào)用receiver中的onFlashLoan函數(shù),然后調(diào)用closeTrove和openTrove函數(shù)。
只是,這里closeTrove和openTrove函數(shù)中的參數(shù)account不再是上面的地址0x56a2,而是質(zhì)押了1 wstETH的攻擊合約0xd996。
(1)closeTrove函數(shù),償還債務并將所有的抵押物(1 swtETH)從troverManager提取到receiver(這里仍然是MigrateTroveZap合約)。此時receiver中共有1281.90 +1=1282.90 wstETH.
(2)openTrove函數(shù),由receiver將1282.80 wstETH(幾乎全部)重新抵押到troverManager中,并負債2001.8 mkUSD。
實際上,這里抵押物中1281.80 wstETH是不屬于攻擊合約0xd996,而是屬于上面的地址0x56a2。
5. 最后,攻擊者0x7e39通過攻擊合約0xd996單獨調(diào)用closeTrove函數(shù),將抵押的1282.80 wstETH 提取到了攻擊合約0xd996中。
償還閃電貸后,攻擊者仍獲利1281.80 wstETH,約2.30M USD。
二、漏洞分析
本次事件的根本原因是項目合約存在邏輯和權(quán)限校驗,使得攻擊者可以利用該漏洞獲取其他賬戶地址的質(zhì)押資產(chǎn)。
攻擊者最終獲得的wstETH是原本地址0x56a2在troverManager合約中的抵押物,通過mkUSD合約的flashLoan函數(shù),自定義MigrateTroveZap合約中onFlashLoan函數(shù)的參數(shù),利用 MigrateTroveZap將其轉(zhuǎn)變?yōu)楣艉霞s的抵押物,然后將其提取出來。
攻擊者通過mkUSD合約中的flashLoan函數(shù)以及MigrateTroveZap合約中的onFlashLoan函數(shù)操縱其他賬戶地址的抵押和提取。
(1)flashLoan函數(shù)中缺少對參數(shù)receiver地址的校驗,因為onFlashLoan函數(shù)中receiver會接收account的所有抵押物,因此需要對receiver進行可信的校驗;
(2)onFlashLoan函數(shù)中缺少對account地址的校驗,因為closeTrove和openTrove函數(shù)都是操作的account的資產(chǎn),因此需要對account增加權(quán)限方面的校驗;
除了對這兩個地址參數(shù)的校驗外,可能還需要對flashLoan函數(shù)中的數(shù)量參數(shù)以及實現(xiàn)邏輯進行校驗。
三、安全建議
針對本次攻擊事件,我們在開發(fā)過程中應遵循以下注意事項:
(1)項目在設(shè)計和開發(fā)過程中,要保持邏輯的完整性和嚴謹性,尤其是涉及到資產(chǎn)的轉(zhuǎn)移過程中,更要加強對函數(shù)調(diào)研權(quán)限的校驗,保證調(diào)用者、調(diào)用函數(shù)、函數(shù)參數(shù)、轉(zhuǎn)賬邏輯等都是安全可信的。
(2)項目上線前,需要找專業(yè)的第三方審計團隊進行合約審計。
關(guān)于 SharkTeam
SharkTeam的愿景是保護Web3世界的安全。團隊由來自世界各地的經(jīng)驗豐富的安全專業(yè)人士和高級研究人員組成,精通區(qū)塊鏈和智能合約底層理論。提供包括風險識別與阻斷、智能合約審計、KYT/AML、鏈上分析等服務,并打造了鏈上智能風險識別與阻斷平臺ChainAegis,能有效對抗Web3世界的高級持續(xù)性威脅(Advanced Persistent Threat,APT)。已與Web3生態(tài)各領(lǐng)域的關(guān)鍵參與者,如Polkadot、Moonbeam、polygon、Sui、OKX、imToken、Collab.Land等建立長期合作關(guān)系。