HashKey 曹一新:DeFi 経済攻撃の一般的なパターンを深く分析する
この記事はHashKey Researchに掲載され、原題は「DeFi経済攻撃の一般的なパターン分析」、著者:曹一新です。
2020年以降、Ethereum DeFiエコシステムにおいて、フラッシュローンを利用した大規模な攻撃事件が十数件メディアに報じられてきました(表1参照)。これらの事件は明らかにパターン化され、繰り返しの特徴を示しています。技術的な脆弱性による攻撃事件(番号6、8、11)とは異なり、他のいくつかの事件はDeFiエコシステムの経済システムの脆弱性を攻撃する手法を示しています。一見すると、共通点は主に攻撃対象のプロトコルが特定のAMMプロトコルと関連していることであり、攻撃者はAMM資産プール内の資産価格や資産数量を操作することで関連プロトコルに損失を与えます。このような攻撃を「経済攻撃」と呼ぶことにしましょう。これまでに発生した経済攻撃は「価格操作アービトラージ」と「オラクル操作」の2つの手法に分かれ、この記事では経済攻撃を引き起こすための必要非十分条件および一般的な攻撃パターンをまとめ、攻撃者がDeFiシステムを攻撃する「急所」を推測し、このようなセキュリティリスクに対する警告を提案します。
表1. フラッシュローン攻撃事件
「価格操作アービトラージ」攻撃
「価格操作アービトラージ」攻撃の原理は、CeFiで一般的なポンプ・アンド・ダンプの市場操作行為や、オンチェーン取引でよく見られる「フロントランニング」攻撃と本質的に変わりません。他者の資本を利用して自らの資産の価格を引き上げ、高値で売却して利益を得るというものです。DeFiエコシステムにおけるこの種の経済攻撃事件が成功する理由は、少なくとも2つのコアモジュール、すなわち攻撃対象とAMMに関連しており、これら2つのモジュールは条件一によって相互に関連しています。
条件一:攻撃対象とAMMの間に資産移転関係が存在し、ユーザーが自ら関連するスマートコントラクトをトリガーして資産移転を実行できること。
ここでの攻撃対象は、マシンガンプール、貸出プラットフォーム、レバレッジ取引プラットフォームなどのDeFiモジュールです。マシンガンプールは一定の投資戦略を実行するスマートコントラクトであり、ファンドに例えることができ、ユーザーに代理の資産運用サービスを提供します。ユーザーは自らの資産をマシンガンプールに預けて利益を得ることを期待します(例:Yearn、Harvest)。貸出プラットフォームは貸し手と借り手にサービスを提供し、金利差を稼ぎます。借り手は一般的にまず一部の資産を過剰担保する必要があります(例:Compound、Aave)。レバレッジ取引プラットフォームは、投資家が一定の資産を担保としてレバレッジ取引を行うことを許可します(例:bZx)。AMMは価格関数を通じて自動的にマーケットメイキング取引を実現し、ユーザーは資産を交換したり、流動性提供者(LP)として流動性マイニングに参加したりできます。ここでは詳細には触れません。
「価格操作アービトラージ」攻撃の一般的なステップ
条件一はDeFiシステムが「価格操作アービトラージ」攻撃を受けるための必要非十分条件であり、実際の攻撃プロセスでは資金量、手数料、スマートコントラクトが取引を実行する前に設定したチェックポイントなどの要素も考慮する必要があります。攻撃者は最適化モデルを構築して最適なパラメータを見つけ、「価格操作アービトラージ」の利益を予測し、行動を決定します。この攻撃手法の一般的な操作手順は以下の通りです(図1参照):
図1. 価格操作アービトラージ攻撃の基本モデル(番号は攻撃ステップを示し、実線は必要なステップ、破線はオプションのステップを示す;攻撃対象の純資産計算段階とAMMの価格関数は設計上ハッカーに利用されるリスクがある)
AMM資産プールの流動性資産をX、Y、流動性トークンをCと仮定します。
第一ステップ、準備。価格操作される初期資産Yと攻撃対象の自動実行戦略をトリガーするための初期資産Aを保有します。
第二ステップ、価格操作。資産Aを攻撃対象の関連スマートコントラクトに送信し、トークンB(マシンガンプール、貸出プラットフォーム、レバレッジ取引プラットフォームなどの攻撃プラットフォームにおけるポジションを表す、以下「ポジショントークン」と呼ぶ)を取得し、スマートコントラクトをトリガーしてAMM資産プールに資産Xを投入し、資産Yまたは流動性トークンCを取得し、AMM資産プール内の資産Yの価格を引き上げます。
第三ステップ、アービトラージ。攻撃者はステップ二で得た資産YをAMM資産プールに投入し、引き上げられた価格で資産Xまたは流動性トークンCを取得します。ここで注意すべきは、ステップ二と三の操作はswap(XとYの交換)または流動性マイニング(XまたはYとCの交換)に対応します。三つ以上のコインのAMMの場合、ここでのXまたはYは資産の組み合わせと見なすことができます。
第四ステップ、締めくくり。攻撃者はトークンBの最新の純資産価値とその後の取引計画に基づいて、資産Dを償還するかどうかを決定します。
流動性が豊富な資産プールの場合、AMM内で顕著な価格スリッページを生み出すためには、通常、大きな資金量を投入する必要があるため、攻撃者は一般的にフラッシュローンから初期資産を借り出します。フラッシュローンで借りられる資産の種類が要件を満たさない場合、攻撃者は特定のAMMや貸出プラットフォームを通じてswap、流動性マイニング、貸出などの方法で資産を取得するか、攻撃対象に関連するAMMから直接取得することもあります。攻撃者が第一ステップの準備プロセスでフラッシュローンを利用した場合、第四ステップでは同じ攻撃取引内でフラッシュローンを返済する必要があります。
攻撃者の利益分析
攻撃者がポジショントークンBを償還しない場合、初めに投入した資産Aはコストの上限となり、アービトラージの利益がこのコストを上回る場合にのみ利益を得ることができます。このような状況は、現在ではレバレッジ資金を提供する攻撃対象においてのみ成功しています。攻撃者は比較的少ない担保コストAで攻撃対象の大量資金Xを動かし、AMM内で資産Yの価格を引き上げます。しかし前提として、取引を実行する前に攻撃者は攻撃対象がその担保の純資産価値が清算ラインを下回っていないかをチェックするポイントを回避する必要があります。表1の番号1の攻撃事件は典型的なケースです。
ここで注意すべき点が2つあります:
ここでの重要な点は、攻撃対象が発行するシェアトークンBが攻撃者の初期資産に隔離保護を提供することです。攻撃者はしばしばAMM内の価格を操作して資産Xを大幅に減価させ、攻撃対象のファンド資産を犠牲にしてAMM内の価格スリッページを有利な方向に偏らせ、攻撃者は自らの資産が大幅に減価しないまま、かなりのアービトラージを実現します。表1の番号10の攻撃事件は典型的なケースです。
損失分析
小節1.2では「価格操作アービトラージ」攻撃パターンにおける攻撃者の利益の原理を分析しました。本節では、誰が損失の「冤大頭」なのかをさらに分析します。
攻撃対象の視点から見ると、攻撃全体の過程におけるその基盤資産の純資産価値の変化は以下の2つから来ています:
- 攻撃者が投入した資産Aによるシェアの取得;
- AMMとの資産交換の差額、すなわち式(6)に示されるもの;
- 攻撃者によるシェアの償還。
攻撃者が最終的にポジショントークンBを使ってシェアを償還する場合、攻撃対象の資産価値の変化は次のようになります:
攻撃者が初期資産を償還しない場合、攻撃対象の純収入資産Aに相当し、式(10)は次のようになります。
AMMにとって、その恒常的な積の価格方程式は、交換操作の前後で、資産プール内の資産数量と資産価格の総価値が一定であることを保証します。また、流動性を注入する場合、新たに発行された流動性トークンの各シェアの価値は、元の流動性トークンの各シェアの価値と一致します。したがって、攻撃者またはマシンガンプールが相互作用するたびに、AMM内部の価格に基づいて等価交換が行われます。たとえ攻撃者が巨額の資金を利用してAMMの価格を市場価格から逸脱させても、AMMの流動性提供者は一時的に価格偏差による無常損失を被るだけであり、その後、アービトラージャーが価格を平準化し、アービトラージャーが得る利益は金融業務モジュールの損失の一部から来ています。
ケーススタディ
表1の番号1および10の事件は、上記の「価格操作アービトラージ」攻撃の一般的なパターンに適合し、再現が容易です。Yearnマシンガンプールのフラッシュローン攻撃事件では、攻撃者は前述の1.1でまとめた4つのステップを実行しました:
第一ステップ、AaveとdYdXからフラッシュローンでETHを借り、Compoundに担保として預けて大量のDAIとUSDCを取得します。一部のDAIはそのまま保管し、残りのDAIとUSDCをCurveの3Poolに担保として預けて流動性マイニングを行い、流動性トークン3CRVを取得します。全ての3CRVを使ってUSDTを償還し、資産Y(USDT)と資産A(DAI)を準備します。
第二ステップ、DAIをYearnのyDAI Vaultに担保として預け、yDAI(すなわちポジショントークンB)を取得します。この契約は自動的にDAI(資産X)をCurve 3Poolに投入する流動性マイニング投資戦略をトリガーし、3CRV(トークンC)を取得します。3CRV内のDAIの数量が増加するため、価格関数の更新によりDAIは減価し、USDTは増価します。
第三ステップ、第一ステップで準備したUSDTをCurve 3Poolに投入し、高値で流動性トークン3CRV(トークンC)を交換します。この時、攻撃者は第一ステップでの初期数量よりも多くの3CRVを保有し、アービトラージに成功します。
第四ステップ、第二ステップで得たyDAIを使ってDAI(資産D)を償還します。yDAIの純資産価値は減少していますが、この損失はアービトラージの利益よりも小さいです。攻撃者は一回のフラッシュローン取引で上記のステップを10回繰り返し、フラッシュローンを返済し、最終的に大量の3CRVとUSDTを得ました。番号1のbZx攻撃事件では、攻撃者はフラッシュローンでETH(資産A)を借り、まず一部をCompoundに担保として預けてWBTC(資産Y)を借り、その後一部のETHをbZxに担保として預けて5倍のレバレッジでETHの空売り取引を行い、レバレッジポジションを表すsETHwBTC5x(ポジショントークンB)を取得しました。bZx契約は攻撃者にレバレッジ資金を提供し、大量のETH(資産X)をUniswapで売却してWBTC(資産Y)を得て、WBTCの価格を3倍に引き上げました。攻撃者はWBTC(資産Y)を売却し、ETH(資産X)を得て、一部をフラッシュローンに返済し、残りをCompoundの担保を償還するために使用しましたが、レバレッジポジションsETHwBTC5xは償還しませんでした。この時点で清算ラインがすでに発動しており、攻撃者は契約の脆弱性を利用してチェックポイントを回避しました。
番号3の攻撃事件は、Balancerがサポートする自己トークンを破壊することで手数料を徴収する行為を代替する「デフレ型」トークンSTAを利用し、STAを繰り返し取引することでその数量を減少させ、価格を引き上げる特定の条件下のケースであり、再現が難しいです。
「オラクル操作」攻撃
「オラクル操作」攻撃は「価格操作アービトラージ」攻撃の対称操作と考えることができ、その必要条件は次の通りです:
条件二:攻撃対象がAMMが提供する情報に依存して内部資産の価格を決定すること。
図2. オラクル操作攻撃の基本モデル(番号は攻撃ステップを示し、実線は必要なステップ、破線はオプションのステップを示す;攻撃対象の純資産計算段階とAMMの価格関数は設計上ハッカーに利用されるリスクがある)
この場合、攻撃者は攻撃対象内の資産を利用してAMM内の特定の資産の価格を引き上げることはできませんが、AMMモジュールがオラクルとして操作可能かどうかを調査し、攻撃対象内の資産を引き上げることができます。
攻撃対象がAMMが提供する情報に依存する主な目的は2つあります:
- 担保の評価;
- ポジショントークンの価格決定。
これを「純資産計算」と見なすこともでき、攻撃者は純資産計算において実際の状況と偏差が生じる契約を操作することを専門としています。
表1の番号5および9の事件では、攻撃者は同じオラクルの脆弱性を利用しました。Cheese BankとWarp Financeという2つのマシンガンプールは、ユーザーがUniswapの流動性トークンUNI-V2を過剰担保することで安定コインを借りることを許可しており、担保品UNI-V2の価値は独自に作成したオラクル契約によって計算されます。この契約は、対応するUniswap流動性プールの資産数量、資産価格、UNI-V2の発行量を基に計算しますが、資産数量と資産価格は2つの無関係なチャネルから取得されます。資産数量は直接Uniswap流動性プールの残高から取得され、資産価格はUniswapが提供する時間加重平均オラクルから取得されます。これにより、攻撃者はUniswap流動性の資産数量を変更することで、資産価格を維持したまま担保品UNI-V2の名目価値を引き上げ、より多くの安定コインを借りることができます。このタイプの攻撃は、オラクル契約の設計が不十分であるために主に発生しますが、依然として2回繰り返し発生し、DeFiプロジェクトに警戒を促すに足ります。
表1の番号2の事件では、攻撃者はbZxの担保品sUSDの評価を行うオラクル(UniswapとKyber)を操作し、sUSDの価格を引き上げ、より多くのETHを借り出しました。
表1の番号3および7の事件は、オラクルの価格を操作することで、マシンガンプール内のシェアトークンの純資産価値を引き上げ、より多くの資産を交換し、繰り返し累積利益を得ました。
「オラクル操作」攻撃の一般的なステップは次の通りです:
第一ステップ、準備。AMMオラクルを操作するための資産Yを取得し、攻撃対象に預ける資産Aを準備します。
第二ステップ、担保。資産Aを攻撃対象に担保として預け、担保品を表すポジショントークンBを取得します。場合によっては、ポジショントークンBを発行せず、スマートコントラクト内部で記帳することもあります。
第三ステップ、操作。資産YをAMMに投入して資産Xを交換し、AMM流動性プール内の資産の比率を変更して価格を変え、攻撃対象契約内の資産AまたはポジショントークンBの価格を更新します;
第四ステップ、締めくくり。借貸業務の場合、引き上げた担保の評価を通じてより多くの資産を借り出し、返済しない;マシンガンプール業務の場合、引き上げた価格のポジショントークンBを使って資産を償還し、増価利益を得ます。
討論と示唆
この記事では、DeFiシステムが経済攻撃を受ける一般的なパターンとその命名をまとめ、「価格操作アービトラージ」と「オラクル操作」攻撃パターンが本質的に純資産計算段階の利用と操作行為であることを発見しました。したがって、DeFiシステムを設計する際には、この段階を適切に処理することが重要です。最も基本的な予防策は、ユーザーが自動的に取引戦略をトリガーして連鎖的に実行したり、純資産を更新したりする権限を取り消すことで、攻撃者が一連の操作行為を完了することを根本的に阻止することです。
例えば、「価格操作アービトラージ」に対する攻撃戦略として、具体的な方法は、スマートボットを通じてユーザーの投資行動を識別し、固定時間ごとに純資産を一括計算し、資金を戦略プールに配分することかもしれません。しかし、この方法は元のアトミックトランザクションの利点を破壊し、ユーザー体験の悪化、コストの上昇、ボットが送信する取引が制御されるなどの新たな問題を引き起こす可能性があります。一方で、現在出現しているDeFiの組み合わせモデルの大部分は、単純なA->Bモデルにとどまっていますが、エコシステム内ではC->A->B(例:Alchemix)の多層ネストされた関連がすでに出現しており、これらの関連関係はスマートコントラクト間の自動トリガーを避けることができず、依然としてシステム的な経済的脆弱性が存在する可能性があります。
「オラクル操作」によって説明される攻撃リスクに対して、現在いくつかのマシンガンプールはスリッページ制限を設定し、価格変動範囲を制約しています。しかし、それでも攻撃者はコストを超えるアービトラージの余地を見つけ、複数回の実施を通じてアービトラージの総額を累積することができます(例:番号4のHarvest攻撃事件)。
フラッシュローンは攻撃全体の過程において付加的な役割を果たし、攻撃者に大量の初期資金を提供し、試行錯誤のコストは取引のガス代のみで済む攻撃機会を提供します。しかし、最近のETH価格の上昇に伴い、このような複雑な攻撃戦略を構築するために必要なスマートコントラクトの取引ガス代は非常に高くなっています。最近発生したyearnマシンガンプールの単一フラッシュローン攻撃取引では、攻撃者は1.933 ETH(当時の3088ドル相当)を消費しました。
以上のように、これらの経済攻撃事件は、AMMの設計メカニズムが攻撃者によって関連製品に対する攻撃に利用されやすいことを示しており、特定の攻撃パターンを持っています。攻撃パターンに依存する必要条件を取り除くことは新たな問題を引き起こす可能性があり、このようなリスクを完全に排除するための完璧な戦略はまだ存在しません。アービトラージの余地を攻撃者の期待値よりも小さくするために一定の制約条件を追加することは、探求に値する方法かもしれませんが、プロジェクトチームは自らと関連プロトコルの経済システムについて包括的かつ深い研究を行う必要があります。