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
實現了一個代幣交換和質押平臺。用戶可以通過調用lockStake
或doRedeemAtomic
函數存入餘額進行質押或轉賬。具體來說,通過轉賬功能,用戶可以推遲負債,而不會影響質押的代幣數量,只要負債不超過總餘額即可。
漏洞分析
這次攻擊似乎遵循了一個簡單的模式:攻擊者通過一系列準備交易,精心操縱了地址為0xf7a8c237ac04c1c3361851ea78e8f50b04c76152
的賬戶的負債數組。
首先,他向賬戶存入 10,000,000 ORN,並調用lockStake
函數來鎖定和質押代幣,這將 assetBalances 值減少到 0。
之後,他使用redeemAtomic
函數將相同數量的ORN轉移到另一個名為B
受控賬戶。該函數允許用戶通過setLiability
機制在轉移代幣時產生負債。當用戶轉移的代幣數量大於其資產餘額時,系統會檢查他們是否有足夠的餘額和授權存入所需數量的代幣。如果餘額仍然小於0,系統就會為該用戶設置負債。該機制由系統的檢查來確保,該系統會計算總餘額,包括抵押資產和負債資產。
回到真實的案例,攻擊者從0xf7a8c237ac04c1c3361851ea78e8f50b04c76152
進行轉賬,該地址的餘額為 0,結果系統給這個地址設置了 10,000,000 的負債,導致賬戶餘額變為 -10,000,000。
接下來攻擊者調用requestReleaseStake
取出所有質押的代幣,並將這些代幣添加到0xf7a8c237ac04c1c3361851ea78e8f50b04c76152
的餘額中,使該賬戶的資產餘額恢復為 0。然後他再次調用redeemAtomic
將另外 10,000,000 ORN 轉移到B
地址。此操作將0xf7a8c237ac04c1c3361851ea78e8f50b04c76152
的負債數組操縱為包含兩個具有相同值的元素: ["ORN", timestamp, 10,000,000]
。
攻擊者又存入了 20,000,000 ORN,再次重複了所有步驟。此時0xf7a8c237ac04c1c3361851ea78e8f50b04c76152
的負債數組包含三個元素: ["ORN", timestamp, 10,000,000]
,而該賬戶的資產餘額只有 -10,000,000。
通過操縱負債數組,攻擊者利用PancakeSwap
的閃電貸將大量資金從B
賬戶轉回0xf7a8c237ac04c1c3361851ea78e8f50b04c76152
,導致餘額從 -10,000,000 變為約 196 萬。結合之前的信息,攻擊者可以從系統中借到比應得金額更多的資產。隨後,攻擊者再次利用redeemAtomic
函數將代幣轉入攻擊合約。
如上文所述,有一個檢查機制來確保用戶的總餘額(包括資產餘額和質押餘額)減去負債餘額必須大於 0。
系統首先通過calcAssets
函數計算用戶的資產餘額。然後,它調用calcLiabilities
將用戶的所有負債相加,並通過對這些值進行減法來計算最終狀態。只有POSITIVE
狀態才可以接受轉移代幣。
由於用戶資產餘額約為196萬,且負債數組仍然存在,原本應該為負數的liabilityValue
值變成了正數,因此攻擊者可以在借入其他代幣時繞過健康檢查機制,並且通過操控負債數組,攻擊者可以借入更大價值的代幣。
他利用這種攻擊模式轉移和提取了價值約 645,000 美元的 ORN、 BNB、BUSD-T 代幣及其他代幣。
漏洞利用之後,攻擊者歸還了從PancakeSwap
閃電貸中借入的貸款。
該漏洞的根本原因是受害者沒有正確管理負債。當用戶的資產餘額發生變化時,必須更新負債。然而,在requestReleaseStake
中,在釋放資產時未能更新用戶的負債是導致此漏洞的關鍵因素。
此外,系統在更新或刪除負債時,應檢查用戶是否對同一代幣有不同的負債。
總之,在餘額更新過程中缺乏對負債的有效控制可能會導致嚴重的財務差異和用戶不滿。實施強有力的控制措施以實時監控和管理負債水平至關重要,確保用戶保持可持續的餘額並防止平臺內的財務不穩定。通過解決這些問題,我們可以為所有用戶營造一個更安全、更值得信賴的環境。