在 2025 年 5 月 22 日,Sui 上最大的集中流動性 DEX Cetus Protocol 遭受了災難性的漏洞攻擊,導致多個資金池的流動性被抽乾,估計損失約 2.23 億美元。此事件是 2025 年最大的 DeFi 駭客攻擊,凸顯了智慧合約安全性中的關鍵缺陷,特別是與定點數算法相關的風險。
此次漏洞起源於自定義溢出預防函數 checked_shlw() 中的缺陷。由於常量與比較邏輯錯誤,該函數在執行用於 u256 定點數數學運算的左移位 (left shift) 操作前,未能正確檢測危險條件。這種疏忽導致在計算關鍵增量(例如確定特定流動性所需的代幣投入量)時,其最高有效位 (most significant bits) 被靜默截斷。攻擊者透過精心控制流動性大小和刻度/價格範圍設置等參數,誘使協議將所需的存款計算為僅 1 個單位的代幣,同時卻為其倉位計入巨額流動性。隨著這一虛增的倉位在鏈上被記錄,攻擊者隨後移除流動性並提取真實儲備金,進而有效地抽空了資金池。
理解集中流動性與定點數數學
Cetus Protocol 採用了集中流動性做市商 (CLMM) 設計,這是一種先進的方案,流動性提供者 (LP) 僅在選定的價格區間(刻度間隔)內提供資產。與將流動性均勻分配的傳統 AMM 不同,CLMM 允許 LP 將資本集中在特定的上下界限之間。這種設計雖顯著提高了資本效率,但也極大地依賴精準的定點數數學來實現以下轉換:
- 計入倉位的流動性金額。
- 必須存入或可以提取的實際代幣數量。
當使用者增加流動性時,協議會根據當前價格和選定範圍來計算代幣增量(需要多少基礎代幣)。相反,當移除流動性時,反向計算決定了該倉位有權提取的資產數量。
Cetus 事件的核心漏洞正是利用了這種錯綜複雜的關係:如果計算「必須存入多少」的邏輯可以被操縱到極小,而倉位仍被計入大量流動性,那麼攻擊者隨後就可以移除這些計入的流動性,從而從資金池中提取真實儲備。這突顯了 DeFi 協議中涉及複雜數學運算時的一個常見攻擊向量。
關鍵的 u256 位移漏洞
這場大規模 DeFi 駭客攻擊的根本原因是一個輔助函數中的漏洞,該函數旨在安全地執行左移位,這是定點數 u256 算術中常見的操作(通常是 << 64 以應用 2^64 的縮放因子)。在基於 Move 的系統(如 Sui)中,溢出檢查並非統一強制執行於所有操作,因此針對位移的手動安全保護至關重要。
Cetus 實作了一個溢出預防輔助函數 checked_shlw(),用以驗證將 u256 值左移 64 位元是否會超出 256 位元的邊界。然而,由於常量與比較邏輯錯誤,該關鍵檢查對於某些本應被拒絕的巨大輸入值來說是可以繞過的。
具體而言,負責計算兩個價格(sqrt_price_0 和 sqrt_price_1)之間流動性提供所需基礎代幣(Token A)數量的 get_delta_a 函數,會呼叫 checked_shlw()。此處 checked_shlw() 的目的是確保 Token A 計算中的分子在移位時不會溢出。
漏洞在於 checked_shlw() 的溢出檢查,它使用了一個 0xffffffffffffffff << 192 的遮罩(等同於 2^256 - 2^192)。這個遮罩遠大於正確的閾值。因此,一個大於 2^192 但小於此錯誤遮罩的輸入值可以通過檢查,即使將其左移確實會超出 u256 的範圍。隨後的左移操作導致了靜默截斷,產生了一個不正確且小得多的數值。
下圖說明了漏洞版本實作與修復版本之間的差異。正確的邊界應為 1 << 192,而非遠大於此的 0xffffffffffffffff << 192。攻擊者巧妙地利用了這個有缺陷的檢查,以存入極少量(例如 1 wei)的 Token A 為代價,鑄造了異常大量的 LP 代幣。

Cetus DeFi 駭客攻擊剖析
儘管攻擊者在多個資金池中應用了相同的技術,但基本的攻擊流程保持不變。讓我們分析一筆特定交易,以了解這場複雜區塊鏈安全事故的具體步驟。
1. 利用閃電貸操縱資金池價格
攻擊始於攻擊者利用閃電貸迅速獲取了 10,024,321.28 個 haSUI。他們隨後兌換出 5,765,124.79 個 SUI,故意將資金池價格從 18,956,530,795,606,879,104 壓低至 18,425,720,184,762,886。這一戰略性的價格偏移至關重要,因為它允許攻擊者開啟一個僅需極少量代幣的 CLMM 倉位,利用了集中流動性設計中固有的「單邊/近乎單幣」流動性行為。

2. 以「幾乎免費」的存款增加流動性
接下來,攻擊者選擇了一個非常嚴苛的刻度範圍(例如 300000–300200)並精確調整了目標流動性。在 CLMM 系統中,代幣增量計算高度依賴範圍邊界的平方根價格,較窄的範圍會使得某些中間值對微小的變化變得極其敏感。
透過仔細調整這些參數,攻擊者導致內部乘法產生了一個 u256 的中間值。此數值在左移時本應溢出,但它成功通過了有缺陷的 checked_shlw() 防護。不安全移位導致截斷的直接後果是,協議將所需 Token A 數量計算為有效的 1 個單位,同時鑄造並記錄了一個**巨大流動性(即 10,365,647,984,364,446,732,462,244,378,333,008)**的倉位。

3. 移除流動性以提取真實儲備
憑藉著在鏈上顯示為擁有大量虛增流動性的倉位,攻擊者隨後移除流動性並提取資產,彷彿該倉位已得到充分資助。這關鍵的一步是資金池真實儲備被系統性抽乾的地方,導致了 2.23 億美元的鉅額損失。
4. 在多個資金池中重複操作
在成功驗證了攻擊原語後,攻擊者在多個資金池中複製了相同的流程,迅速擴大了總體損失,並執行了迄今為止最大的 DeFi 駭客攻擊之一。
Web3 最佳安全審計服務
在發布前驗證設計、程式碼和業務邏輯
關鍵要點與區塊鏈安全教訓
Cetus 事件再次嚴厲地提醒了大眾區塊鏈安全中的複雜挑戰,特別是在複雜的 DeFi 協議中。其根本原因在於定點數數學路徑中 u256 左移操作周圍的錯誤溢出檢查。這使得溢出的位移被靜默截斷,導致所需存款顯示為接近零,同時仍為 LP 倉位計入巨額流動性,最終實現了儲備提取。
智慧合約安全教訓:
- 算術運算的嚴謹性: 在處理定點數算術中的移位、縮放因子、捨入和邊界條件時,務必保持極度嚴謹。這些是導致關鍵漏洞的常見來源。
- 經驗證的基礎組件: 優先使用經驗證的安全數學原語或形式化不變量,而非開發臨時的輔助函數。如果必須自定義輔助函數,請極其小心地驗證其常量與閾值。
- 全面測試: 實作廣泛的邊界案例和基於屬性的測試,以覆蓋最大值、邊界刻度和對抗性的參數組合。這種主動預防的方法可以在部署前發現細微缺陷。
- 持續監測: 即使有穩健的審計,即時監測解決方案也至關重要。像 BlockSec 的 Phalcon Security 這樣的工具可以識別可疑的鏈上活動和潛在的攻擊進程,提供至關重要的最後一道防線。
Cetus 事件強調了區塊鏈安全多層次方法的重要性,結合細緻的程式碼審查、先進的測試方法論和持續的鏈上監測,以防禦複雜的 DeFi 駭客攻擊。
參考文獻
關於 BlockSec
BlockSec 是一家全棧式區塊鏈安全與加密合規服務提供商。我們建立的產品與服務旨在協助客戶執行程式碼審計(包括智慧合約、區塊鏈與錢包)、即時攔截攻擊、事件分析、追蹤非法資金,並滿足在協議與平台整個生命週期內的 AML/CFT 合規義務。
BlockSec 已在知名會議上發表多篇區塊鏈安全論文,報告了多起 DeFi 應用程式的零日攻擊,成功攔截多次駭客攻擊並挽回超過 2000 萬美元資金,且保護了價值數十億美元的加密資產。
- 官方網站:https://blocksec.com/
- 官方 Twitter 帳號:https://twitter.com/BlockSecTeam



