損失1.97億美金!Euler Finance遭閃電貸攻擊
Numen Cyber Labs/微信公眾號/Annie編譯
2023-03-14 09:44

背景 

根據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 

本文為火星財經授權刊登,原文標題為「Euler Finance遭閃電貸攻擊,損失1.97億美金,漏洞分析附PoC