TradeOnOrion事件分析

本文為機器翻譯
展示原文

2024 年 5 月 28 日,Orion 項目遭到攻擊,截至本文撰寫時造成約 645,000 美元的損失。讓我們來看看這次攻擊是如何發生的細節。

概述

攻擊者地址: https ://bscscan.com/address/0x51177db1ff3b450007958447946a2eee388288d2

https://bscscan.com/address/0xf7a8c237ac04c1c3361851ea78e8f50b04c76152

攻擊合約: https ://bscscan.com/address/0xf8bfac82bdd7ac82d3aeec98b9e1e73579509db6

受害人合同:

https://bscscan.com/address/0xc662cea3d8d6660ca97fb9ff98122da69a199cd8

攻擊交易: https ://bscscan.com/tx/0x660837a1640dd9cc0561ab7ff6c85325edebfa17d8b11a3bb94457ba6dcae18c

準備交易:

將資產存入

鎖定股權

兌換 Atomic

請求釋放股權

兌換 Atomic

將資產存入

鎖定股權

兌換 Atomic

請求釋放股權

兌換 Atomic

ExchangeWithGenericSwap實現了一個代幣交換和質押平臺。用戶可以通過調用lockStakedoRedeemAtomic函數存入餘額進行質押或轉賬。具體來說,通過轉賬功能,用戶可以推遲負債,而不會影響質押的代幣數量,只要負債不超過總餘額即可。

漏洞分析

這次攻擊似乎遵循了一個簡單的模式:攻擊者通過一系列準備交易,精心操縱了地址為0xf7a8c237ac04c1c3361851ea78e8f50b04c76152的賬戶的負債數組。

Pretransaction setup

首先,他向賬戶存入 10,000,000 ORN,並調用lockStake函數來鎖定和質押代幣,這將 assetBalances 值減少到 0。

之後,他使用redeemAtomic函數將相同數量的ORN轉移到另一個名為B受控賬戶。該函數允許用戶通過setLiability機制在轉移代幣時產生負債。當用戶轉移的代幣數量大於其資產餘額時,系統會檢查他們是否有足夠的餘額和授權存入所需數量的代幣。如果餘額仍然小於0,系統就會為該用戶設置負債。該機制由系統的檢查來確保,該系統會計算總餘額,包括抵押資產和負債資產。

_Updatebalance mechanism to transfer token in redeemAtomic function

回到真實的案例,攻擊者從0xf7a8c237ac04c1c3361851ea78e8f50b04c76152進行轉賬,該地址的餘額為 0,結果系統給這個地址設置了 10,000,000 的負債,導致賬戶餘額變為 -10,000,000。

接下來攻擊者調用requestReleaseStake取出所有質押的代幣,並將這些代幣添加到0xf7a8c237ac04c1c3361851ea78e8f50b04c76152的餘額中,使該賬戶的資產餘額恢復為 0。然後他再次調用redeemAtomic將另外 10,000,000 ORN 轉移到B地址。此操作將0xf7a8c237ac04c1c3361851ea78e8f50b04c76152的負債數組操縱為包含兩個具有相同值的元素: ["ORN", timestamp, 10,000,000]

After first manipulated

攻擊者又存入了 20,000,000 ORN,再次重複了所有步驟。此時0xf7a8c237ac04c1c3361851ea78e8f50b04c76152的負債數組包含三個元素: ["ORN", timestamp, 10,000,000] ,而該賬戶的資產餘額只有 -10,000,000。

After second manipulated

通過操縱負債數組,攻擊者利用PancakeSwap的閃電貸將大量資金從B賬戶轉回0xf7a8c237ac04c1c3361851ea78e8f50b04c76152 ,導致餘額從 -10,000,000 變為約 196 萬。結合之前的信息,攻擊者可以從系統中借到比應得金額更多的資產。隨後,攻擊者再次利用redeemAtomic函數將代幣轉入攻擊合約。

如上文所述,有一個檢查機制來確保用戶的總餘額(包括資產餘額和質押餘額)減去負債餘額必須大於 0。

系統首先通過calcAssets函數計算用戶的資產餘額。然後,它調用calcLiabilities將用戶的所有負債相加,並通過對這些值進行減法來計算最終狀態。只有POSITIVE狀態才可以接受轉移代幣。

Healthcheck

由於用戶資產餘額約為196萬,且負債數組仍然存在,原本應該為負數的liabilityValue值變成了正數,因此攻擊者可以在借入其他代幣時繞過健康檢查機制,並且通過操控負債數組,攻擊者可以借入更大價值的代幣。

the value change when liabilities array being manipulated

他利用這種攻擊模式轉移和提取了價值約 645,000 美元的 ORN、 BNB、BUSD-T 代幣及其他代幣。

Root cause

漏洞利用之後,攻擊者歸還了從PancakeSwap閃電貸中借入的貸款。

Root cause

根本原因

該漏洞的根本原因是受害者沒有正確管理負債。當用戶的資產餘額發生變化時,必須更新負債。然而,在requestReleaseStake中,在釋放資產時未能更新用戶的負債是導致此漏洞的關鍵因素。

Root cause

此外,系統在更新或刪除負債時,應檢查用戶是否對同一代幣有不同的負債。

Remove liability

結論

總之,在餘額更新過程中缺乏對負債的有效控制可能會導致嚴重的財務差異和用戶不滿。實施強有力的控制措施以實時監控和管理負債水平至關重要,確保用戶保持可持續的餘額並防止平臺內的財務不穩定。通過解決這些問題,我們可以為所有用戶營造一個更安全、更值得信賴的環境。

來源
免責聲明:以上內容僅為作者觀點,不代表Followin的任何立場,不構成與Followin相關的任何投資建議。
喜歡
收藏
評論