Back to Blog

「Cork Protocol」インシデント #6:2つの独立した脆弱性が組み合わさった壊滅的なエクスプロイトチェーン

Code Auditing
February 11, 2026
10 min read

2025年5月28日、Ethereum上のCork Protocolが攻撃を受け [1]、約1,200万ドルの損失が発生しました。根本原因は、満期時刻におけるHistorical Implied Yield Average (HIYA) の価格操作と、Uniswap v4フックコールバックにおけるアクセス制御の欠如が組み合わさったことにあります。HIYAのリスクプレミアムは満期までの時間がゼロに近づくにつれて指数関数的に増加するため、満期直前のスワップがHIYAを押し上げ、新しく初期化された市場におけるCover Tokenの価格を著しく過小評価させる結果となりました。同時に、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は、ロックされる資産であるRedemption Assetの預け入れを受け付けます。その見返りとして、Depeg Swap (DS) と Cover Token (CT) という2つのトークンが発行され、預け主に返還されます。設定された満期日より前であれば、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はRouterおよびCorkHookを経由する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. 2回目のbeforeSwap呼び出しで、RouterdepositPsmを介してRAをCTとDSに分解し、すべてのDSをユーザーに転送し、借り入れたCTをUniswapプールに返済し、余剰のCTを購入者に払い戻します。

発行後の資金分配:

RA+CT:AMMRA+CT: AMM

DS:RouterDS: Router

0x1.3 新規発行のための価格メカニズム

プロトコルはHIYA (Historical Implied Yield Average) を採用しており、累積量 (vTv_T) × リスクプレミアム (rTr_T) の累積合計として計算されます。これはリスクプレミアムを測定し、満期時の初期化価格を調整するために使用されます。HIYAが高い場合、プロトコルはより高いデペグ(ペグ外れ)リスクがあると見なし、初期のCT価格が低く設定されます。

Cumulative HIYA=TrTvTCumulative\ HIYA = \sum_T r_T v_T

リスクプレミアム (rTr_T) の算出は2つの要素で構成されます。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 Redemption Asset (償還資産)
PA weETH Pegged Asset (ペグ資産)
DS weETH8DS-2 Depeg Swap
CT weETH8CT-2 Cover Token

明確にするため、本レポートの残りの部分では、区別の必要がある場合を除き、具体的なトークン名ではなく抽象的な役割(RA、DS、CT)でトークンを指します。

攻撃者は2つの異なる方法を使用して、AMMとRouterの両方からDSとCTを抽出しました。DS + CTはRAに償還できるため、両方を入手することで直接的な利益抽出が可能になります。攻撃は2つのコンポーネントで構成されています。

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フック設計では、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) {
    ...
}

このチェックがないため、任意の外部コントラクトがhookDataを自由に指定してbeforeSwapを直接呼び出すことが可能です。hookDataが空でない場合、関数はFlashSwapの実行パス(セクション 0x1.2)に入り、depositPsmを介してRAをCTとDSに分解します。攻撃者は、偽の市場のトークンを指定した細工されたhookDatabeforeSwapを直接呼び出すことにより、この脆弱性を悪用しました。これにより、プロトコルはトークンを分解し、その結果を攻撃者に転送しました。

0x2.3 2つの欠陥が組み合わさる仕組み

いずれの脆弱性も単独では1,200万ドルの全額を抽出するには十分ではありません。

HIYAの操作により攻撃者は安価なCTを入手できますが、CT単独ではRAに償還することはできません。償還式には両方のトークンが必要です:CT + DS = RA。攻撃者はDSを入手する手段を依然として必要としていました。

beforeSwapにおけるアクセス制御の欠如がその手段を提供しました。細工されたhookDataを添えてbeforeSwapを直接呼び出すことで、攻撃者は任意のパラメータでFlashSwap分解パスをトリガーできます。このパスを通じて実際のDSを入手するため、攻撃者は実際のDSをRA(償還資産)として指定する「偽の市場」をデプロイしました。そしてbeforeSwapを呼び出してその「RA」(実際のDS)を偽のCTと偽のDSに分解し、それらを偽の市場を通じて実際のDSにスワップして戻すという手法をとりました。

HIYA操作で得たCTと、認証のないbeforeSwap呼び出し(偽市場経由)で得たDSの両方を揃えた攻撃者は、それらを1:1でRA(wstETH)へ償還しました。

0x3 攻撃の分析

攻撃は3つのトランザクションにわたり、それぞれが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. 攻撃者は(アクセス制御の欠如を悪用して)空ではないhookDataを指定し、beforeSwapを直接呼び出しました。これにより偽市場に対して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万ドル)。

まとめ

このインシデントは、単独では十分でない2つの独立した欠陥が組み合わさることで、プロトコルから1,200万ドルを流出させる単一の攻撃チェーンを形成したものです。

  • 満期直前の指数関数的なリスクプレミアム。 HIYA価格算出式は満期までの時間がゼロに近づくにつれてリスクプレミアムを増幅させ、満期直前のスワップを市場再初期化価格の操作ベクトルにしてしまいました。
  • フックコールバックにおける送信者検証の欠如。 CorkHook.beforeSwapmsg.senderPoolManagerであることを制限しておらず、任意のパラメータによる直接呼び出しを許可したため、攻撃者がFlashSwapの実行パスを偽装することを可能にしました。
  • モジュール間相互作用の死角。 経済設計(HIYAに基づく価格設定)とアクセス制御の欠落(認証のないフックコールバック)が別々のモジュールに存在していました。それらの相互作用が、単一モジュールの分析では検知が困難な攻撃可能なパスを作り出しました。

参考文献

  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