日前震驚幣圈的 Cetus 協議 2.2 億美元被盜案,引起各界討論。資安團隊慢霧也發布了整起事件的完整報告,慢霧團隊表示本次攻擊展現了數學溢位漏洞的威力。攻擊者透過精確計算選擇特定參數,利用 checked_shlw 函數的缺陷,以 1 個代幣的成本獲得價值數十億的流動性。這是一次極為精密的數學攻擊,並建議開發人員在智慧合約開發中嚴格驗證所有數學函數的邊界條件。
慢霧:事件核心是溢出檢查的漏洞
慢霧團隊表示這次事件的核心是攻擊者透過精心建構參數,使溢位發生但又能繞過偵測,最終以極小的代幣金額即可換取巨額流動性資產。與先前 @neeksec 的分析一致。
(從協議漏洞到去中心化辯證:詳解 Cetus 事件始末,MOVE 語言安全性動搖了嗎?)
攻擊者首先透過閃電貸借出 1,002 萬枚 haSUI,迅速使 haSUI/SUI 的池中價格暴跌 99.9%。接著在 tick 值 300000~300200 的區間添加流動性,這個價格區間僅 1% 的區間寬度。
接著就是事件的關鍵漏洞,攻擊者聲稱加入巨量流動性 (超過 10 的 27 次方),但由於 checked_shlw 函數的編碼錯誤,合約僅向其收取 1 枚 haSUI。
計算所需流動性公式 (來源:慢霧科技)
慢霧分析攻擊者之所以能夠用 1 個代幣換出巨額流動性。其核心原因在於 get_delta_a 函數中的 checked_shlw 存在溢出檢查出現漏洞。攻擊者正是利用了這一點,使得系統在計算實際需要添加多少 haSUI 時出現了嚴重偏差。由於溢出未被偵測,系統誤判了所需 haSUI 的數量,導致攻擊者僅需極少的 Token,就能兌換出大量的流動性資產。
任何小於 0xffffffffffffffff << 192 的輸入值都會繞過溢出檢查。然而,當這些值被左移 64 位元時,結果會超出 u256 的表示範圍,此時高位元資料被截斷,導致得到的結果遠小於理論值。這樣一來,系統在後續計算中就會低估所需的 haSUI 數量。
出現問題的代碼(來源:慢霧科技)
攻擊者分三次移除流動性,共獲得 2,004 萬枚 haSUI 與超過 576 萬枚 SUI。最後攻擊者歸還閃電貸,最終淨獲利逾 2.3 億美元。
Cetus 已修復代碼
事後 Cetus 修復了代碼,包含:
將 0xffffffffffffffff << 192 修正為正確的閾值 1 << 192。
將判斷條件從 n > mask 修正為 n >= mask。
確保當左移 64 位元可能導致溢出時,能正確偵測並傳回溢出標誌。
修復後的 checked_shlw 函數 (來源:慢霧科技) 慢霧團隊:開發者應嚴格驗證所有數學函數的邊界條件
慢霧表示攻擊者在兩天前就準備好 gas fee 了,在攻擊前還有一次嘗試,但失敗了。目前攻擊者的 Sui 地址資金已被凍結,EVM 地址也被慢霧加入黑名單進行追蹤。
慢霧團隊表示本次攻擊展現了數學溢位漏洞的威力。攻擊者透過精確計算選擇特定參數,利用 checked_shlw 函數的缺陷,以 1 個代幣的成本獲得價值數十億的流動性。這是一次極為精密的數學攻擊,慢霧安全團隊建議開發人員在智慧合約開發中嚴格驗證所有數學函數的邊界條件。
這篇文章 幣圈版瞞天過海?慢霧事件報告:駭客如何利用代碼漏洞洗劫 Cetus 2.2 億美元 最早出現於 鏈新聞 ABMedia。