這是一次極其精密的數學攻擊,攻擊者通過精確計算選擇特定引數,利用 checked_shlw 函式的缺陷,以 1 個代幣的成本獲得價值數十億的流動性。
(前情提要:Cetus遭駭受害者怎麼想?Sui團隊要求承諾「完全還款」,含兩個關鍵條件 )
(背景補充:Cetus被駭案「懸賞500萬美元」,鏈上偵探ZachXBT:賞金太少了,哪個高手想做? )
背景
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 個代幣的成本獲得價值數十億的流動性。這是一次極其精密的數學攻擊,慢霧安全團隊建議開發人員在智慧合約開發中嚴格驗證所有數學函式的邊界條件。