據消息,去中心化交易平台DODO 的wCRES/USDT V2 資金池被黑客攻擊,轉走價值近98 萬美元的wCRES 和近114 萬美元的USDT。 DODO 表示,團隊已下線相關資金池建池入口,該攻擊僅影響DODO V2 眾籌池,除V2 眾籌池之外,其他資金池均安全;團隊正在與安全公司合作調查,並努力挽回部分資金。更多後續消息請關注DODO 官方社群公告。

慢霧安全團隊在第一時間跟進並分析,下面將細節分析給大家參考。

攻擊細節分析

通過查看本次攻擊交易,我們可以發現整個攻擊過程非常簡單。攻擊者先將FDO 和FUSDT 轉入wCRES/USDT 資金池中,然後通過資金池合約的flashLoan 函數借出wCRES 和USDT 代幣,並對資金池合約進行初始化操作。

為何存入FDO 和FUSDT 代幣卻能成功借出wCRES 和USDT ,並且初始化資金池合約呢?是因為資金池的閃電貸功能有漏洞嗎?

接下來我們對flashLoan 函數進行詳細分析:

通過分析具體代碼我們可以發現,在進行閃電貸時會先通過_transferBaseOut 和_transferQuoteOut 函數將資金轉出,然後通過DVMFlashLoanCall 函數進行具體外部邏輯調用,最後再對合約的資金進行檢查。可以發現這是正常閃電貸功能,那麼問題只能出在閃電貸時對外部邏輯的執行上。

通過分析閃電貸的外部邏輯調用,可以發現攻擊者調用了wCRES/USDT 資金池合約的init 函數,並傳入了FDO 地址和FUSDT 地址對資金池合約進行了初始化操作。

到這裡我們就可以發現資金池合約可以被重新初始化。為了一探究竟,接下來我們對初始化函數進行具體的分析:

通過具體的代碼我們可以發現,資金池合約的初始化函數並沒有任何鑑權以及防止重複調用初始化的邏輯,這將導致任何人都可以對資金池合約的初始化函數進行調用並重新初始化合約。至此,我們可以得出本次攻擊的完整攻擊流程。

攻擊流程

1、攻擊者先創建FDO 和FUSDT 兩個代幣合約,然後向wCRES/USDT 資金池存入FDO 和FUSDT 代幣。

2、接下來攻擊者調用wCRES/USDT 資金池合約的flashLoan 函數進行閃電貸,借出資金池中的wCRES 與USDT 代幣。

3、由於wCRES/USDT 資金池合約的init 函數沒有任何鑑權以及防止重複調用初始化的邏輯,攻擊者通過閃電貸的外部邏輯執行功能調用了wCRES/USDT 資金池合約的初始化函數,將資金池合約的代幣對由wCRES/USDT 替換為FDO/FUSDT。

4、由於資金池代幣對被替換為FDO/FUSDT 且攻擊者在攻擊開始時就將 FDO 和FUSDT 代幣存入了資金池合約,因最終通過了閃電貸資金歸還的餘額檢查而獲利。

總結

本次攻擊發生的主要原因在於資金池合約初始化函數沒有任何鑑權以及防止重複調用初始化的限制,導致攻擊者利用閃電貸將真幣借出,然後通過重新對合約初始化將資金池代幣對替換為攻擊者創建的假幣,從而繞過閃電貸資金歸還檢查將真幣收入囊中。

參考攻擊交易:

https://cn.etherscan.com/tx/0x395675b56370a9f5fe8b32badfa80043f5291443bd6c8273900476880fb5221e