狸貓換太子 ,一文分析 DODO 被黑始末

買賣虛擬貨幣

據訊息,去中心化交易平臺 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

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;