Back to Blog

Cetus 事件:一次未經檢查的移位導致 2.23 億美元流失,成為 2025 年最大 DeFi 駭客攻擊

Code AuditingPhalcon Security
February 9, 2026
7 min read
Key Insights

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_0sqrt_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 中存在漏洞與已修復的 u256 移位實作對比
Cetus 中存在漏洞與已修復的 u256 移位實作對比

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 倉位,利用了集中流動性設計中固有的「單邊/近乎單幣」流動性行為。

用於操縱 Cetus 資金池價格的閃電貸
用於操縱 Cetus 資金池價格的閃電貸

2. 以「幾乎免費」的存款增加流動性

接下來,攻擊者選擇了一個非常嚴苛的刻度範圍(例如 300000–300200)並精確調整了目標流動性。在 CLMM 系統中,代幣增量計算高度依賴範圍邊界的平方根價格,較窄的範圍會使得某些中間值對微小的變化變得極其敏感。

透過仔細調整這些參數,攻擊者導致內部乘法產生了一個 u256 的中間值。此數值在左移時本應溢出,但它成功通過了有缺陷的 checked_shlw() 防護。不安全移位導致截斷的直接後果是,協議將所需 Token A 數量計算為有效的 1 個單位,同時鑄造並記錄了一個**巨大流動性(即 10,365,647,984,364,446,732,462,244,378,333,008)**的倉位。

Cetus 攻擊者以極小存款增加流動性
Cetus 攻擊者以極小存款增加流動性

3. 移除流動性以提取真實儲備

憑藉著在鏈上顯示為擁有大量虛增流動性的倉位,攻擊者隨後移除流動性並提取資產,彷彿該倉位已得到充分資助。這關鍵的一步是資金池真實儲備被系統性抽乾的地方,導致了 2.23 億美元的鉅額損失。

4. 在多個資金池中重複操作

在成功驗證了攻擊原語後,攻擊者在多個資金池中複製了相同的流程,迅速擴大了總體損失,並執行了迄今為止最大的 DeFi 駭客攻擊之一。

Web3 最佳安全審計服務

在發布前驗證設計、程式碼和業務邏輯

關鍵要點與區塊鏈安全教訓

Cetus 事件再次嚴厲地提醒了大眾區塊鏈安全中的複雜挑戰,特別是在複雜的 DeFi 協議中。其根本原因在於定點數數學路徑中 u256 左移操作周圍的錯誤溢出檢查。這使得溢出的位移被靜默截斷,導致所需存款顯示為接近零,同時仍為 LP 倉位計入巨額流動性,最終實現了儲備提取。

智慧合約安全教訓:

  • 算術運算的嚴謹性: 在處理定點數算術中的移位、縮放因子、捨入和邊界條件時,務必保持極度嚴謹。這些是導致關鍵漏洞的常見來源。
  • 經驗證的基礎組件: 優先使用經驗證的安全數學原語或形式化不變量,而非開發臨時的輔助函數。如果必須自定義輔助函數,請極其小心地驗證其常量與閾值。
  • 全面測試: 實作廣泛的邊界案例和基於屬性的測試,以覆蓋最大值、邊界刻度和對抗性的參數組合。這種主動預防的方法可以在部署前發現細微缺陷。
  • 持續監測: 即使有穩健的審計,即時監測解決方案也至關重要。像 BlockSec 的 Phalcon Security 這樣的工具可以識別可疑的鏈上活動和潛在的攻擊進程,提供至關重要的最後一道防線。

Cetus 事件強調了區塊鏈安全多層次方法的重要性,結合細緻的程式碼審查、先進的測試方法論和持續的鏈上監測,以防禦複雜的 DeFi 駭客攻擊。

開始使用 Phalcon Security

檢測所有威脅,警報重要事件,阻斷攻擊。

立即免費試用

參考文獻

  1. Cetus Protocol 官方公告
  2. BlockSec 簡要分析
  3. Suiscan 上的交易紀錄

關於 BlockSec

BlockSec 是一家全棧式區塊鏈安全與加密合規服務提供商。我們建立的產品與服務旨在協助客戶執行程式碼審計(包括智慧合約、區塊鏈與錢包)、即時攔截攻擊、事件分析、追蹤非法資金,並滿足在協議與平台整個生命週期內的 AML/CFT 合規義務。

BlockSec 已在知名會議上發表多篇區塊鏈安全論文,報告了多起 DeFi 應用程式的零日攻擊,成功攔截多次駭客攻擊並挽回超過 2000 萬美元資金,且保護了價值數十億美元的加密資產。

Best Security Auditor for Web3

Validate design, code, and business logic before launch. Aligned with the highest industry security standards.

BlockSec Audit

Get Real-Time Protection with Phalcon Security

Audits alone are not enough. Phalcon Security detects attacks in real time and blocks threats mid-flight.

phalcon security