SharkTeam:MIM_SPELL被攻擊事件原理分析
來源:SharkTeam
2024年1月30日,MIM_SPELL遭受閃電貸攻擊,因爲精度計算漏洞,項目方損失650萬美元。
SharkTeam對此事件第一時間進行了技術分析,並總結了安全防範手段,希望後續項目可以引以爲戒,共築區塊鏈行業的安全防线。
一、攻擊交易分析
攻擊者地址:
0x87F585809Ce79aE39A5fa0C7C96d0d159eb678C9
攻擊合約:
0xe1091d17473b049cccd65c54f71677da85b77a45
0x13AF445F81B0DEcA5dCb2Be6A4C691F545c95912
0xe59b54a9e37ab69f6e9312a9b3f72539ee184e5a
被攻擊合約:
0x7259e152103756e1616A77Ae982353c3751A6a90
攻擊交易:
0x26a83db7e28838dd9fee6fb7314ae58dcc6aee9a20bf224c386ff5e80f7e4cf2
0xdb4616b89ad82062787a4e924d520639791302476484b9a6eca5126f79b6d877
攻擊流程:
1. 攻擊者(0x87F58580)通過閃電貸借取300000枚MIM代幣。
2. 隨後向被攻擊合約(0x7259e1520)發送了240000枚的MIM代幣,用於下一步償還用戶的借款。
3. 攻擊者(0x87F58580)隨後調用repayForAll函數償還其他用戶的借款,後續又依次調用repay函數償還其他用戶借款,目的是將elastic變量減小爲0.
4. elastic變量減小爲0後,攻擊者(0x87F58580)創建新的攻擊合約(0xe59b54a9)並不斷的進行borrow和repay函數的調用,直到將elastic =0,base = 120080183810681886665215049728時結束。
5. 隨後攻擊者(0x87F58580)調用borrow函數和DegenBox合約的withdraw函數借出了5000047枚MIM代幣。
6. 攻擊者(0x87F58580)歸還閃電貸函數,並將4400000枚MIM代幣兌換爲1807枚ETH,本交易獲利約450W。
二、漏洞分析
攻擊的本質是在進行借貸變量計算時精度出現了問題,使得關鍵變量elastic和base值被操縱後比例失衡,導致計算抵押物和借貸數量時出現問題,最終超額借出MIM代幣。
被攻擊合約(0x7259e1520)中borrow函數和repay函數在對elastic和base兩個變量進行計算時,都採用了向上取整的方式。
攻擊者(0x87F58580)首先通過償還其他用戶借款的方式,將elastic變量和base變量分別設置爲了0和97。
隨後不斷的調用borrow函數和repay函數並且參數amount都爲1,在第一次調用borrow函數時,由於elastic=0,會執行上述if邏輯並回到add函數中。這樣會導致elastic = 1,base = 98。
攻擊者(0x87F58580)再調用borrow函數並傳入1,由於elastic=1,會執行else邏輯,計算出的返回值爲98,這樣在回到add函數中時,elastic=2,base變量爲196.
但此時攻擊者(0x87F58580)調用repay函數並傳入1,由於elastic=2,會執行else邏輯,計算出的elastic變量本來爲 1*2/98 =0,但由於下面存在向上取整的步驟,導致計算出的返回值1,這樣在回到sub函數中時,elastic變量又變回1,而base變量爲195。
可以看到在經歷一次borrow-repay循環後,elastic變量不變而base變量近乎翻倍,利用這一漏洞,黑客頻繁進行borrow-repay函數循環,最後再調用一次repay,最終使得elastic=0 base = 120080183810681886665215049728。
當elastic和Base變量之間的比例嚴重失衡後,攻擊者(0x87F58580)添加了一點抵押物後即可通過solvent修飾符中的限制條件,從而借出大量MIM代幣。
三、安全建議
針對本次攻擊事件,我們在开發過程中應遵循以下注意事項:
1. 开發精度計算相關邏輯時,慎重考慮精度和取整情況。
2. 項目上线前,需要通過專業的第三方審計團隊進行智能合約審計。
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播信息之目的,不構成任何投資建議,如有侵權行為,請第一時間聯絡我們修改或刪除,多謝。