Orion

慢霧:Orion Protocol 被攻擊是因合約兌換功能的函數沒有做重入保護所致

ChainCatcher 消息,今晨 Orion Protocol 項目的 ETH 和 BSC 鏈上的合約遭到攻擊,攻擊者獲利約 302.7 萬美元,對此次攻擊過程和原因慢霧安全團隊分析如下:攻擊者首先調用 ExchangeWithAtomic 合約的 depositAsset 函數進行存款,存入 0.5 個 USDC 代幣為下面的攻擊作準備;攻擊者閃電貸出 284.47 萬枚 USDT 代幣,接著調用 ExchangeWithAtomic 合約的 doSwapThroughOrionPool 函數兌換代幣,兌換路徑是 [USDC -> ATK(攻擊者創建的惡意代幣)-> USDT];因為兌換出來的結果是通過兌換後 ExchangeWithAtomic 合約裡的 USDT 代幣餘額減去兌換前該合約裡的 USDT 代幣餘額(284.47 萬枚),但問題就在兌換 USDC -> ATK 後,會調用 ATK 代幣的轉帳函數,該函數由攻擊惡意構造會通過攻擊合約調用 ExchangeWithAtomic 合約的 depositAsset 函數來將閃電貸來的 284.4 萬 USDT 代幣存入 ExchangeWithAtomic 合約中。此時攻擊合約在 ExchangeWithAtomic 合約裡的存款被成功記帳為 284.47 萬枚並且 ExchangeWithAtomic 合約裡的 USDT 代幣餘額為 568.9 萬枚,使得攻擊者兌換出的 USDT 代幣的數量被計算為兌換後的 568.9 萬減去兌換前的 284.47 萬等於 284.47 萬;之後兌換後的 USDT 代幣最後會通過調用庫函數 creditUserAssets 來更新攻擊合約在 ExchangeWithAtomic 合約裡的使用的帳本,導致攻擊合約最終在 ExchangeWithAtomic 合約裡 USDT 代幣的存款記帳為 568.9 萬枚;最後攻擊者調用 ExchangeWithAtomic 合約裡的 withdraw 函數將 USDT 提取出來,歸還閃電貸後將剩餘的 283.6 萬枚 USDT 代幣換成 WETH 獲利。攻擊者利用一樣的手法在 BSC 鏈上的也發起了攻擊,獲利 19.1 萬美元;此次攻擊的根本原因在於合約兌換功能的函數沒有做重入保護,並且兌換後再次更新帳本存款的數值是根據兌換前後合約裡的代幣餘額差值來計算的,導致攻擊者利用假代幣重入了存款函數獲得超過預期的代幣。
2023-02-03
ChainCatcher 與創新者共建Web3世界