背景
根據Numen鏈上監控顯示,Mar-13-2023 08:56:35 AM +UTC, Euler Finance 項目因為Etoken中的donateToReserves函數缺少流動性檢查而遭到閃電貸攻擊。黑客通過不同幣種多次調用完成獲利,本次攻擊共計損失1.97億美元,金額巨大,涉及6種代幣。當前,資金還存留在黑客的賬戶中。
黑客地址: https://etherscan.io/address/0xb66cd966670d962c227b3eaba30a872dbfb995db
黑客合約: https://etherscan.io/address/0x036cec1a199234fc02f72d29e596a09440825f1c
攻擊交易(其中一筆) : https://etherscan.io/tx/0xc310a0affe2169d1f6feec1c63dbc7f7c62a887fa48795d327d4d2da2d6b111d
詳細分析
1.黑客先從Aave閃電貸借了3000W個Dai後部署了兩個合約,一個是藉貸合約,一個是清算合約。
2.調用deposit函數將藉來的Dai其中的20 M個質押到Euler Protocol合約中獲取了19.5M個eDAI。
3.Euler Protocol可以調用mint函數借出10倍存款,此時黑客從中藉出了195.6M個eDAI 和200M個dDAI。
4.調用repay函數,用閃電貸剩餘的10M個DAI償還債務並且銷毀了10M個dDAI,然後繼續調用min函數借出195.6M個eDAI 和200M個dDAI。
5.調用donateToReserves函數捐贈10倍的償還資金,發送了100M的eDAI,並調用liquidate函數去清算,得到310M的dDAI和250M的eDAI。
6.調用withdraw函數獲取了38.9M的Dai並且去歸還了借的閃電貸30M。從中獲利8.87M個Dai。
漏洞成因
先看一下donateToReserves函數,用戶能夠被清算是在這一步發生的。
與下圖的mint函數對比我們發現,donateToReserves函數少了一個關鍵步驟checkLiquidity。
然後跟進看checkLiquidity的實現。我們發現了callInternalModule函數,它會調用RiskManager對用戶進行檢查保證Etoken>Dtoken。
在每次操作的時候需要對用戶的流動性進行檢查,調用checkLiquidity完成,而donateToReserves這個函數沒有執行此操作,導致用戶可以通過該協議的某些函數先使自己處於被清算的狀態,然後在完成清算。
攻擊復現
我們成功復現了此次攻擊,詳細PoC可查看鏈接: https://github.com/numencyber/SmartContractHack_PoC/tree/main/EulerfinanceHack
總結
Numen實驗室提醒項目方,合約在上線前要做好安全審計,保證合約安全性,對於借貸類項目需要特別關注資金償還,流動性檢測,債務清算等問題。 Numen實驗室專注於為WEB3保駕護航。