閃電貸+重入攻擊,OUSD 損失 700 萬美金技術簡析

by :  [email protected]慢霧安全團隊


據慢霧區情報,2020 年 11 月 17 日,以太坊 defi 專案 ousd 遭受閃電貸攻擊。慢霧安全團隊於第一時間跟進並進行相關分析。以下是慢霧安全團隊針對本次攻擊的簡要分析。攻擊過程詳細分析會在稍後釋出。如有興趣可保持持續關注。


背景提要


origin dollar (ousd)由origin protocol (ousd)建立,是一種新型的erc-20 穩定幣,當它仍然放在錢包裡時,會自動從defi 協議中獲得有競爭力的收益。ousd 由usdt、usdc 和dai 等其他穩定幣的1:1 支援。


攻擊流程簡析


1. 攻擊者使用 dydx 閃電貸借出 70000 個 eth,隨後透過 uniswap 將其兌換為 usdt 和 dai。


2. 攻擊者呼叫 ousd vault的 mint 函式,vault 會先進行一次 rebase 將之前積累的獎勵進行分配,隨後將 750 萬 usdt 從攻擊者合約轉入 ousd vault 中。此時 ousd 合約會鑄出等量的 750 萬 ousd 代幣給攻擊合約,最後透過 allocate 來結算當前的收益。


3. 在攻擊者轉入 750 萬之前,vault 的價值約為 7018138 美元。攻擊者轉入 750 萬 usdt 後將佔 vault 總價值的一半以上。


4. 隨後攻擊合約利用 mintmultiple 函式傳入 dai 合約地址與攻擊合約的地址,同樣是先進行一次 rebase ,將之前累計的收益進行分配(包含先前轉入的 750 萬 usdt 部分),再透過 transferfrom 先將攻擊合約的 2050 萬 dai 轉入 vault 中。隨後將呼叫攻擊合約的 transferfrom 函式,攻擊者在攻擊合約的 transferfrom 函式中構造再次呼叫 vault 合約 mint 函式的邏輯來實現重入攻擊。


5. 在上一步驟中轉入 2050 萬 dai 後透過攻擊合約的 transferfrom 函式再次呼叫 vault 的 mint 函式。由於重入時傳入 2000 usdt 符合判斷是否呼叫 rebase 的條件,此時將進行一次 rebase,而由於 rebase 需要 vault 中的資產總價值和 ousd 的總鑄幣數有差值才能觸發。按照原本的業務場景是進行 allocate 結算收益後改變 vault 中的資產總價值然後透過 rebase 進行分配。而由於重入原因並沒有先透過 ousd.mint 進行鑄幣操作,且攻擊者已先將 2050 萬的 dai 轉入 vault 中,所以 vault 中的資產總價值仍然增加了,導致合約中的資產總價值大於 ousd 的總鑄幣量。因此 vault 會將增加的 2050 萬 dai 當成收益部分進行 rebase 分配。在步驟 3 中由於攻擊者資產已佔 vault 總價值的一半以上,所以此時攻擊者將憑空獲得超過價值 1025 萬的收益分配。


6. 隨後將透過 ousd.mint 鑄出 2000 ousd,並透過 allocate 結算重入時 2000 usdt 的收益(從上一步驟可以看出攻擊合約傳入的 2000 usdt 只是為了滿足呼叫 rebase 的條件,觸發收益分配而已)。重入結束後仍將透過 ousd.mint 鑄出之前轉入的 2050 萬 dai 等值的 ousd 代幣。


7. 最後 vault 的總價值約為 3501 萬美元,但攻擊者所擁有的價值超過 3825 萬美元,因此攻擊者用大部分的 ousd 去 vault 進行贖回操作,將 vault 基本提空,而其餘的 ousd 是透過 uniswap 和 sushiswap 的 ousd - usdt 池將 ousd 換成 usdt 來增加收益。


總結


此次攻擊關鍵在於呼叫外部合約造成的重入問題與 vault 的 rebase 收益分配機制相結合,導致攻擊者可以透過重入來憑空獲得鉅額的收益分配。針對此類情況,慢霧安全團隊建議對傳入資產進行檢查後,對不在白名單內的資產直接進行回滾,並使用防重入鎖以避免重入攻擊。

相關連結:

(1) 參考攻擊交易:

0xe1c76241dda7c5fcf1988454c621142495640e708e3f8377982f55f8cf2a8401


免責聲明:

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

推荐阅读