Back to Blog

#6 軟木塞協議事件:兩個獨立漏洞組合成毀滅性的攻擊鏈

Code Auditing
February 11, 2026
8 min read

2025 年 5 月 28 日,以太坊上的 Cork Protocol 遭到駭客攻擊 [1],導致約 1,200 萬美元的損失。此事件的根本原因在於到期時間前的歷史隱含收益率平均值 (HIYA) 價格操縱,以及 Uniswap v4 Hook 回調函式中缺少存取控制。由於 HIYA 風險溢價會隨著到期時間趨近於零而呈指數級增加,後期交易推高了 HIYA,導致新初始化的市場嚴重低估了 Cover Token (CT) 的價格。同時,CorkHook.beforeSwap 缺乏 msg.sender 驗證,允許攻擊者以精心構造的參數進行任意呼叫。透過同時利用這兩個漏洞,攻擊者提取了約 3,760e18 的 CT 和 DS,並將其兌換為 wstETH,耗盡了協議儲備金。

0x1 背景

0x1.1 代幣經濟學

Cork Protocol [2] 引入了一種用於代幣化風險的新原語,作為鏈上資產(如金庫代幣、生息穩定幣和流動性再質押代幣)的可程式化風險層。其核心組件是 Cork Pool,市場圍繞著該機制構建。每個 Cork Pool 均圍繞一對資產構建:贖回資產 (Redemption Asset, RA) 和 掛鉤資產 (Pegged Asset, PA)。

Cork Pool 接收鎖定的贖回資產。作為回報,系統會鑄造兩種代幣並返還給存款人:Depeg Swap (DS) 和 Cover Token (CT)。在設定的到期日期之前,1 個 DS + 1 個 CT/PA 可以兌換回 1 個 RA;到期後,1 個 CT 可以按比例贖回池中剩餘的 RA + PA。

PA+DS=RAPA + DS = RA

CT+DS=RACT + DS = RA

0x1.2 合約實作

DS 和 CT 均可交易。使用者可以透過 CorkHook 使用基於自定義 AMM 曲線的 NormalSwap 來交易 CT 和 RA,而 DS 和 RA 則透過 RouterCorkHook 使用 FlashSwap 進行交易。

NormalSwap [自定義 AMM 曲線]:

x1tyt=kx^{1-t} y^{t} = k

FlashSwap [FlashSwapRouter.swapDsforRa]:此機制是攻擊的核心。攻擊者後來透過對 beforeSwap 的直接、未經授權的呼叫(第 0x2.2 節)觸發了此路徑。

  1. 買方將 RA 轉移給 Router

  2. 在第一次 beforeSwap 呼叫中,Router 計算需要交換出的 DS 數量。如有必要,它會從 Uniswap v4 池中借入 RA 和 CT,將借入的 CT 和協議的 DS 轉換為 RA,保留所需的 RA,並將借入的 RA 歸還給 Uniswap 池。

  3. 在第二次 beforeSwap 呼叫中,Router 透過 depositPsm 將 RA 分解為 CT 和 DS,將所有 DS 轉移給使用者,償還借入的 CT 到 Uniswap 池,並將多餘的 CT 退還給買方。

發行後的資金分配:

RA+CT:AMMRA+CT: AMM

DS:RouterDS: Router

0x1.3 新發行的定價機制

該協議採用 HIYA(歷史隱含收益率平均值),計算方式為交易量 (vTv_T) × 風險溢價 (rTr_T) 的累積總和,用於衡量風險溢價並調整到期時的初始化價格。如果 HIYA 較高,協議會假設脫鉤風險較高,從而導致初始 CT 定價較低。

Cumulative HIYA=TrTvTCumulative\ HIYA = \sum_T r_T v_T

風險溢價 (rTr_T) 的計算包含兩個部分:高 CT 價格與低 rTr_T 值相關(這符合直覺),而到期時間 TT 具有指數級放大效應。臨近到期時,TT 趨近於零,導致指數 1/T1/T 迅速增長。這會將即使是很小的 CT 價格變化放大為巨大的風險溢價數值。

rT=(F/pT)1/T1r_T = (F / p_T)^{1/T} - 1

  • FF 為 1

  • PTP_T 為 CT 的價格

  • TT 為歸一化在 1 到 0 之間的到期時間

舉例說明其放大效應:如果 CT 的交易價格為 pT=0.95p_T = 0.95(5% 的折價),則在 T=0.5T = 0.5(距離到期還有一半時間)時的風險溢價為:

r0.5=(1/0.95)1/0.51=(1.053)210.108r_{0.5} = (1/0.95)^{1/0.5} - 1 = (1.053)^{2} - 1 \approx 0.108

T=0.01T = 0.01(接近到期時),相同的 CT 價格會產生:

r0.01=(1/0.95)1/0.011=(1.053)1001167r_{0.01} = (1/0.95)^{1/0.01} - 1 = (1.053)^{100} - 1 \approx 167

相同的 5% CT 折價在接近到期時會產生約 1,500 倍的風險溢價。這種指數級的敏感性即為操縱向量:在到期前不久執行的交換會不成比例地推高 HIYA,從而扭曲下一個市場的初始化價格。

0x2 漏洞分析

受影響的市場涉及以下代幣:

角色 代幣 描述
RA wstETH 贖回資產
PA weETH 掛鉤資產
DS weETH8DS-2 Depeg Swap (DS)
CT weETH8CT-2 Cover Token (CT)

為清楚起見,本報告其餘部分將代幣按其抽象角色(RA、DS、CT)稱呼,而非具體名稱(特殊情況除外)。

攻擊者使用兩種不同的方法從 AMM 和 Router 中提取了 DS 和 CT。由於 DS + CT 可以贖回為 RA,獲得兩者即可實現直接利潤提取。攻擊由兩個部分組成。

0x2.1 Cover Token 提取:HIYA 操縱導致人為壓低的市場初始化價格

當某個市場週期到期時,協議會使用前一個週期的 accumulatedHIYA 來設定 AMM 中的 CT/RA 價格比率。較高的 HIYA 代表感知到的脫鉤風險較高,這會轉化為較低的初始 CT 價格。

由於 HIYA 在每次交換時都會更新並包含風險溢價(第 0x1.3 節),且風險溢價隨著 T0T \to 0 而呈指數級增長,因此在到期前不久執行的交易會將 accumulatedHIYA 推高數個數量級。攻擊者透過在到期前呼叫 SwapRaForDs() 利用了這一點,產生了巨大的風險溢價並累積到 HIYA 中。

當新的市場週期隨即初始化時,協議讀取了被推高的 HIYA,並將其解釋為極端的脫鉤風險,將 CT 的初始 AMM 價格設定得遠低於其公平價值。攻擊者隨後以這種被扭曲的價格用 RA 交換 CT,從而廉價獲取了大量的 CT 部位。

0x2.2 Depeg Swap 提取:CorkHook.beforeSwap 缺少存取控制

在標準的 Uniswap v4 Hook 設計中,beforeSwap 僅由 PoolManager 在交換期間呼叫。Cork 的實作並未強制執行此限制:

// 缺失:require(msg.sender == address(poolManager));
function beforeSwap(
    address sender,
    PoolKey calldata key,
    IPoolManager.SwapParams calldata params,
    bytes calldata hookData
) external override returns (bytes4, BeforeSwapDelta, uint24) {
    ...
}

若沒有此檢查,任何外部合約都可以直接呼叫 beforeSwap 並傳入任意 hookData。當 hookData 不為空時,該函式會進入 FlashSwap 執行路徑(第 0x1.2 節),該路徑透過 depositPsm 將 RA 分解為 CT 和 DS。攻擊者透過使用包含假市場代幣資訊的精心構造的 hookData 直接調用 beforeSwap 來利用此漏洞,導致協議分解代幣並將結果轉移給攻擊者。

0x2.3 兩個漏洞如何組合

單一漏洞本身都不足以提取出 1,200 萬美元。

HIYA 操縱使攻擊者獲得了廉價的 CT,但僅憑 CT 無法贖回 RA。贖回公式要求兩種代幣同時存在:CT + DS = RA。攻擊者仍需要一種獲取 DS 的途徑。

beforeSwap 中缺失的存取控制提供了該路徑。透過直接使用精心構造的 hookData 呼叫 beforeSwap,攻擊者可以觸發帶有任意參數的 FlashSwap 分解路徑。為了透過此路徑獲取真正的 DS,攻擊者部署了一個假市場,將真正的 DS 指定為其 RA,然後呼叫 beforeSwap 將該「RA」(真正的 DS)分解為假 CT 和假 DS,並透過假市場將其換回真正的 DS。

當同時持有 CT(來自 HIYA 操縱)和 DS(透過假市場進行未經授權的 beforeSwap 呼叫獲取)時,攻擊者將它們以 1:1 的比例兌換為 RA (wstETH)。

0x3 攻擊分析

攻擊分三次交易展開,分別對應三個階段:推高 HIYA、獲取廉價 CT,以及提取 DS 以完成贖回配對。

0x3.1 準備階段:推高 HIYA

這筆交易中,攻擊者在市場到期前不久呼叫了 SwapRaForDs()。由於 TT 接近零,該交換產生了不成比例的巨大風險溢價(第 0x1.3 節),進而推高了 accumulatedHIYA

該階段後攻擊者持有: 來自交換的 DS(用於後續階段 0x3.3),以及儲存在鏈上的被推高的 accumulatedHIYA

0x3.2 初始化階段:獲取廉價 CT

這筆交易中,新市場週期被初始化。協議讀取了被推高的 accumulatedHIYA 並在 AMM 中設定了扭曲的 CT/RA 價格比率,使 CT 的定價遠低於公平價值。攻擊者隨後以該貶值價格用約 0.000003e18 RA 交換了 3,760e18 CT。

該階段後攻擊者持有: 大量的 CT 部位(透過被操縱的初始化價格廉價取得)。

0x3.3 提取階段:透過假市場獲取 DS

此階段利用存取控制漏洞(第 0x2.2 節)來提取 DS,從而湊齊贖回 RA 所需的 CT + DS 配對。核心技術是一個將真實 DS 視為其贖回資產的假市場:

假市場角色 實際代幣 目的
假 RA 真實 DS (weETH8DS-2) 允許真實 DS 進入分解路徑
假 CT 從假 RA 分解中鑄造 中間產物;用於換回真實 DS
假 DS 從假 RA 分解中鑄造 中間產物;用於換回真實 DS

攻擊交易的關鍵步驟:

  1. 攻擊者首先在合法市場中用 RA 交換 DS。

    攻擊者持有: 真實 DS。

  2. 攻擊者部署並初始化了假市場,將真實 DS 指定為假 RA。

  3. 攻擊者直接呼叫 beforeSwap(利用缺失的存取控制),並傳入非空的 hookData,觸發對假市場的 FlashSwap 執行路徑。在 hookData 中,攻擊者指定 paymentToken 為假 CT,導致協議對假市場執行 RA 分解邏輯。

  4. 協議將所有假 RA(即真實 DS)分解為假 CT 和假 DS。將全部假 DS 部分轉移給攻擊者,並退還假 CT 部分(扣除極少量的 paymentAmount)。

    攻擊者持有: 3,761e18 假 CT + 3,761e18 假 DS(均源自真實 DS)。

  5. 攻擊者在假市場內將假 CT 和假 DS 交換回假 RA,從而恢復出真實 DS。

    攻擊者持有: 3,761e18 真實 DS(已恢復)。

  6. 攻擊者將恢復的 DS 與第 0x3.2 節中獲得的 CT 組合,贖回 RA (wstETH),完成利潤提取。

    攻擊者持有: 3,760e18 RA (wstETH) 利潤(即 1,200 萬美元)。

總結

此次事件將兩個獨立的漏洞結合在一起,儘管單獨來看都不足以構成致命威脅,但組合後的攻擊鏈成功從協議中提取了 1,200 萬美元。

  • 到期前的指數級風險溢價。 HIYA 定價公式在到期時間趨近於零時會放大風險溢價,使得後期交易成為市場重新初始化價格的操縱向量。
  • Hook 回調中缺失對呼叫者的驗證。 CorkHook.beforeSwap 未強制要求 msg.senderPoolManager,從而允許攻擊者以任意參數進行直接呼叫,並透過偽造 FlashSwap 執行路徑來進行攻擊。
  • 跨模組互動帶來的盲點。 經濟設計(基於 HIYA 的定價)和存取控制漏洞(未經授權的 Hook 回調)存在於不同的模組中。它們之間的互動創造了一個單一模組分析難以發現的攻擊路徑。

參考資料

  1. https://www.cork.tech/blog/post-mortem

  2. https://docs.cork.tech/core-concepts/cork-pool


關於 BlockSec

BlockSec 是一家全端區塊鏈安全與加密合規服務提供者。我們構建產品和服務,協助客戶進行代碼審計(包括智慧合約、區塊鏈和錢包)、即時攔截攻擊、分析事故、追蹤非法資金,並在協議與平台的整個生命週期內履行反洗錢 (AML) 及反恐融資 (CFT) 義務。

BlockSec 已在知名會議上發表多篇區塊鏈安全論文,通報了多個 DeFi 應用的零日漏洞,攔截了多次駭客攻擊並挽回超過 2,000 萬美元的資金,並保護了價值數十億美元的加密貨幣資產。

Best Security Auditor for Web3

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

BlockSec Audit