撰文:Beosin
近期,Sui 生態最大的去中心化交易所 Cetus Protocol 因安全漏洞被攻擊,導致超過 2.2 億美元從流動性池中抽走,多個 Sui 生態代幣價格暴跌。Beosin 安全團隊對該事件進行了漏洞分析和資金追蹤,並將結果分享如下:
攻擊步驟
以其中一筆攻擊交易為例,簡化的攻擊步驟如下:
1. 啓用閃電貸:攻擊者通過閃電貸借入 1000 萬 haSUI。
2. 創建流動性倉位:開設一個新的流動性倉位,其價格區間為 [300000, 300200]。
3. 增加流動性:僅使用 1 個單位的 haSUI 增加了流動性,但獲得了高達 10,365,647,984,364,446,732,462,244,378,333,008 的流動性值。
4. 移除流動性:立即移除多筆交易中的流動性,以耗盡流動性池。
5. 償還閃電貸:償還閃電貸並保留約 570 萬 SUI 作為利潤。
漏洞分析
本次攻擊的根本原因在於 get_delta_a 函數中的 checked_shlw 實現錯誤,導致溢出檢查失敗。攻擊者僅需要少量代幣,就能在流動性池中兌換出大量資産,從而實現攻擊。
如下圖所示, checked_shlw 用於判斷 u256 數左移 64 位是否會導致溢出,小於 0xffffffffffffffff << 192 的輸入值會繞過溢出檢測,但輸入值在在左移 64 位後可能會超出 u256 最大值(溢出),而 checked_shlw 仍會輸出未發生溢出(false)。這樣一來,在後續計算中就會嚴重低估所需的代幣數量。
此外,在 Move 中,整數運算的安全性旨在防止溢出和下溢,因為溢出和下溢可能導致意外行為或漏洞。具體來說:如果加法和乘法的計算結果對於整數類型來說過大,則會導致程序中止。如果除數為零,則除法中止。
而左移(<<)的獨特之處在於,發生溢出時不會中止。這意味著,即使移位的位數超出了整數類型的存儲容量,程序也不會終止,從而可能導致錯誤值或不可預測的行為。
被盜資金追蹤
據分析,被盜資金中約 6200 萬美元被攻擊者通過跨鏈兌換成 Ethereum 鏈的 ETH,剩餘 1.6 億資金仍在 Sui 網絡。Beosin Trace 對 EVM 鏈的被盜資金進行追蹤發現:
攻擊者將絕大部分資金跨鏈至 Ethereum 鏈,在 Ethereum 上用於接收跨鏈資金的地址為 0x89012a55cd6b88e407c9d4ae9b3425f55924919b,資金通過 CoW Swap、ParaSwap 等協議兌換為 ETH。
隨後,該地址將 20,000 ETH 轉入地址 0x0251536bfcf144b88e1afa8fe60184ffdb4caf16,暫未轉出。Beosin Trace 已將黑客相關地址加入黑地址庫,後續將持續追蹤。
總結
本次攻擊的核心在於攻擊者利用左移校驗函數的實現錯誤,利用少量代幣就可以從流動性池提取巨量的代幣賣出獲利。這本是一個非常容易發現的代碼錯誤,但負責安全審計的公司在審計時,這類執行數值計算的庫代碼可能超出了其審計範圍,未能發現漏洞,而項目方在進行安全測試時也未能測試到此類邊緣情況。
Beosin 安全團隊建議項目方應當對項目的合約代碼加強審計與安全測試,特別是使用形式化驗證檢測 DeFi 業務正確性,從而避免類似情況的發生。
内容來源:TECHUB NEWS
更多精彩內容,請登陸
財華香港網 (https://www.finet.hk/)
現代電視 (http://www.fintv.com)