作者:Victory & Lisa
背景
5 月 22 日,據社區消息,SUI 生態上的流動性提供商 Cetus 疑似遭攻擊,流動性池深度大幅下降,Cetus 上多個代幣交易對出現下跌,預計損失金額超過 2.3 億美元。隨後,Cetus 發佈公告稱:“我們協議中檢測到了一起事件,安全起見,智能合約已暫時暫停。目前,團隊正在對該事件展開調查。我們很快會發布進一步的調查聲明。”
事件發生後,慢霧安全團隊第一時間介入分析,併發布安全提醒。以下是對攻擊手法及資金轉移情況的詳細解析。
(https://x.com/CetusProtocol/status/1925515662346404024)
相關信息
其中一筆攻擊交易:
https://suiscan.xyz/mainnet/tx/DVMG3B2kocLEnVMDuQzTYRgjwuuFSfciawPvXXheB3x
攻擊者地址:
0xe28b50cef1d633ea43d3296a3f6b67ff0312a5f1a99f0af753c85b8b5de8ff06
被攻擊的池子地址:
0x871d8a227114f375170f149f7e9d45be822dd003eba225e83c05ac80828596bc
涉及代幣:
haSUI / SUI
攻擊分析
此次事件的核心是攻擊者通過精心構造參數,使溢出發生但又能繞過檢測,最終用極小的 Token 金額即可換取鉅額流動性資產,以下爲具體步驟解析:
1.攻擊者首先通過閃電貸借出了10,024,321.28 個 haSUI,導致池子價格從18,956,530,795,606,879,104暴跌至18,425,720,184762886,價格下跌幅度達到99.90%。
2.攻擊者精心選擇了一個極窄的價格區間開立流動性頭寸:
Tick 下限:300000(價格:60,257,519,765,924,248,467,716,150)
Tick 上限:300200 (價格:60,863,087,478,126,617,965,993,239)
價格區間寬度:僅1.00496621%
3.接着就是此次攻擊的核心,攻擊者聲明要添加10,365,647,984,364,446,732,462,244,378,333,008單位的巨大流動性,但由於存在漏洞,系統只收取了1 個代幣 A。
我們來分析一下攻擊者爲什麼能夠用1 個 Token 兌換出鉅額流動性。其核心原因在於get_delta_a函數中的checked_shlw存在溢出檢測繞過漏洞。攻擊者正是利用了這一點,使得系統在計算實際需要添加多少haSUI 時出現了嚴重偏差。由於溢出未被檢測,系統誤判了所需 haSUI 的數量,導致攻擊者僅需極少的 Token,就能兌換出大量的流動性資產,從而實現了攻擊。
當系統計算添加如此巨大流動性需要多少haSUI 時:
這裏的關鍵在於checked_shlw函數的實現存在嚴重缺陷。實際上,任何小於0xffffffffffffffff << 192的輸入值都會繞過溢出檢測。然而,當這些值被左移64 位時,結果會超出u256的表示範圍,此時高位數據被截斷,導致得到的結果遠小於理論值。這樣一來,系統在後續計算中就會低估所需的haSUI 數量。
錯誤掩碼:0xffffffffffffffff << 192= 非常大的數值(約2^256-2^192)
幾乎所有輸入都小於這個掩碼,繞過溢出檢測
真正的問題:當n >= 2^192時,n << 64會超出u256 範圍並被截斷
攻擊者構造的中間值liquidity * sqrt_price_diff =6277101735386680763835789423207666908085499738337898853712:
小於錯誤掩碼,繞過溢出檢測
但在左移64 位後會超出 u256 最大值,從而導致超出的部分被截斷
導致最終計算結果約小於1,但由於是向上取整,quotient算出來就等於1
4.最後攻擊者移除流動性,獲得鉅額代幣收益:
第一次移除:獲得10,024,321.28 個 haSUI
第二次移除:獲得1個haSUI
第三次移除:獲得10,024,321.28 個 haSUI
5.攻擊者歸還閃電貸,淨獲利約10,024,321.28個haSUI 和5,765,124.79 個SUI,攻擊完成。
項目方修復情況
攻擊發生後,Cetus 發佈了修復補丁。具體修復代碼可參考:https://github.com/CetusProtocol/integer-mate/pull/7/files#diff-c04eb6ebebbabb80342cd953bc63925e1c1cdc7ae1fb572f4aad240288a69409。
修復後的checked_shlw函數如下:
修復說明:
將錯誤的掩碼0xffffffffffffffff << 192修正爲正確的閾值1 << 192
將判斷條件從n > mask修正爲n >= mask
確保當左移64 位可能導致溢出時,能正確檢測並返回溢出標誌
MistTrack 分析
據分析,攻擊者0xe28b50cef1d633ea43d3296a3f6b67ff0312a5f1a99f0af753c85b8b5de8ff06 獲利約 2.3 億美元,包括 SUI、vSUI、USDC 等多種資產。
我們發現攻擊者在兩天前就準備好了Gas Fee,然後在攻擊之前進行了一次嘗試,但失敗了:
獲利後,攻擊者將部分資金如
USDC、SOL、suiETH 通過跨鏈橋如 Sui Bridge、Circle、Wormhole、Mayan 跨鏈到 EVM 地址 0x89012a55cd6b88e407c9d4ae9b3425f55924919b:
其中,5.2341 WBNB 跨鏈到了 BSC 地址 0x89012a55cd6b88e407c9d4ae9b3425f55924919b:
接着,攻擊者將價值
1,000 萬美元的資產存入 Suilend:
攻擊者還將24,022,896 SUI 轉入新地址 0xcd8962dad278d8b50fa0f9eb0186bfa4cbdecc6d59377214c88d0286a0ac9562,目前暫未轉出:
幸運的是,據Cetus 稱,在 SUI 基金會及其他生態系統成員合作下,目前已成功凍結了在 SUI 上的 1.62 億美元的被盜資金。
(https://x.com/CetusProtocol/status/1925567348586815622)
接下來,我們使用鏈上反洗錢與追蹤工具MistTrack 分析 EVM 上接收跨鏈資金的地址 0x89012a55cd6b88e407c9d4ae9b3425f55924919b。
該地址在BSC 上收到 5.2319 BNB,暫未轉出:
該地址在Ethereum 上收到 3,000 個 USDT、4,088 萬個 USDC、1,771 個 SOL 和 8,130.4 個 ETH。
其中,USDT、USDC 和 SOL 通過 CoW Swap、ParaSwap 等兌換爲 ETH:
接着,該地址將20,000 ETH 轉入地址 0x0251536bfcf144b88e1afa8fe60184ffdb4caf16,暫未轉出:
目前該地址在Ethereum 上的餘額爲 3,244 ETH:
MistTrack 已將以上相關地址加入惡意地址庫,同時,我們將對持續對地址餘額進行監控。
總結
本次攻擊展示了數學溢出漏洞的威力。攻擊者通過精確計算選擇特定參數,利用checked_shlw函數的缺陷,以1 個代幣的成本獲得價值數十億的流動性。這是一次極其精密的數學攻擊,慢霧安全團隊建議開發人員在智能合約開發中嚴格驗證所有數學函數的邊界條件。