據慢霧區情報,2020 年11 月17 日,以太坊DeFi 項目OUSD 遭受閃電貸攻擊。慢霧安全團隊於第一時間跟進並進行相關分析。以下是慢霧安全團隊針對本次攻擊的簡要分析。攻擊過程詳細分析會在稍後發布。如有興趣可保持持續關注。 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