持分価格操作攻撃とは何ですか?以前の記事で紹介したオラクル操作攻撃とどう違いますか?
以前の記事で紹介したオラクル操作攻撃は外部の価格ソースを狙う——攻撃者はある資産の市場でのリアルタイムの相場を操作し、この相場に依存するプロトコルに誤った判断をさせる。持分価格操作攻撃はまったく異なる層を狙う:ほとんどのボールト型商品(ERC-4626という標準化されたインターフェースを採用したトークン化されたボールトなど)は内部で会計のロジックを維持しており、「ボールトが現在合計でどれだけの原資産を管理しているか」と「現在合計でどれだけの持分が発行されているか」を継続的に計算し、この2つの数字の比率を使って「1持分が現在いくらの価値があるか」を計算する。持分価格操作攻撃はこの内部の会計ロジック自体を直接操作するものであり、いかなる外部の価格ソースにも触れる必要がない。
オラクル操作攻撃との最大の違いは「誰の台帳を標的にしているか」にある:オラクル操作攻撃はプロトコルが外部に依存する市場データを侵害する;持分価格操作攻撃はプロトコル自身の内部の資産会計ロジックを侵害する——ある程度プロトコルの「自分の家の台帳」を直接改ざんすることに近く、プロトコルを騙して誤った外部情報源を信頼させることではない。この2つの攻撃は防御戦略においても完全に異なる——以前の記事で紹介した複数のノードを集約する分散型オラクルネットワークは最初の攻撃を効果的に防げるが、2番目の攻撃にはまったく役に立たない。問題がそもそも外部データソースにないためだ。
持分価格操作攻撃はなぜ存在するのですか?この脆弱性の技術的な根本原因は何ですか?
ほとんどのボールトコントラクトが持分の価値を計算する数式は、本質的には比例配分の数学演算である——ボールトが現在実際に保有する総資産を、現在流通している総持分数で割り、各持分がどれだけの資産に対応するかを算出する。この仕組みは通常の状況では正常に機能するが、重要な前提がある:ボールトの総資産の数字が実際の状況を完全に正確に反映していなければならないということだ。この前提が破られうる理由は、一部のボールトの設計が「正常な預け入れプロセスを通じてボールトに入る資産」と「他のチャネル(直接送金など)を通じてボールトに入る資産」を厳密に区別しておらず、両方とも総資産にカウントされるが、前者だけが対応する持分数を同時に増加させることだ。
攻撃者が利用するのはまさにこのギャップだ:もしボールトがちょうど総持分規模が非常に小さい状態にあれば(ボールトが有効化されたばかりで、まだ本物のユーザーの預金がないなど)、攻撃者はまず極めて少額の資金を預けてわずかな持分を取得し、次に直接大金の資産をボールトに送金する(正常な預け入れプロセスを経ず、いかなる持分とも交換しない)。この一方的に注入された資産は総資産にカウントされるが、対応する持分数の増加はなく、瞬時に「各持分が対応する資産価値」を極端な数字まで押し上げる。次に、別の何も知らないユーザーが正常なプロセスで資金を預ければ、計算上ゼロ持分しか配分されない可能性が非常に高く(除算演算で切り捨てられるため)、この預金は何もないところに消え去り、すべて攻撃者が保有する持分に帰属することになる。この技術的な根本原因は、ある程度「極端な比率の下で除算演算が生み出す境界のケースの脆弱性」であり、コードのロジックが明らかに間違って書かれているのではなく、設計時にこの極端なシナリオが考慮されていなかったことにある。
持分価格操作攻撃は具体的にどう機能しますか?完全な1つの攻撃の流れはどのようなものですか?
典型的な持分価格操作攻撃の最も古典的な派生形(しばしば「初回預金者攻撃」と呼ばれる)にはいくつかの段階がある:
この「初回預金者」の派生形以外に、以前の記事で紹介したSummer.fi Lazy Summer Protocolが遭遇した攻撃は別の派生形だった——空のボールトを狙うのではなく、稼働中のボールトの持分価格決定の会計ロジック自体を狙い、フラッシュローンの巨額の資金と組み合わせて、単一の取引内で操作と利益確定を完了した。技術的な詳細は完全には同じではないが、核心的な原理はどちらもボールトが持分の価値を計算する内部ロジックを攻撃することにある。
持分価格操作攻撃は一般ユーザーにとって実際どのような影響がありますか?自分が使用しているボールトがこの種の攻撃に対する防御があるかをどう評価すればよいですか?
一般ユーザーにとって、この種の攻撃の最も直接的なリスクは——正常なプロセスに従って資産をボールトに預けたのに、ボールト自体の内部会計の欠陥のためにいかなる対応する持分証書も得られない可能性があり、あなたの預金はある程度何もないところに消え去り、すべて攻撃者の手に落ちることだ。このリスクは「ボールトが起動されたばかりで、規模がまだ小さい」段階で特に顕著であり、新しいボールトの早期預金者になることを検討しているなら、この層のリスクに特に注目する価値がある。
自分が使用しているボールトがこの種の攻撃に対する防御を持っているかを評価する際、検証する価値のあるいくつかの具体的な側面:このボールトが業界で認められた防御メカニズムを採用しているかを検証する——一般的な方法には、開発チーム自身がデプロイ時にまず「デッドシェア」(永久にロックされ、決して償還されない初期持分)を預け入れることが含まれ、後で誰かが低い総持分規模を利用して攻撃を仕掛けようとしても、このデッドシェアの存在により攻撃が経済的に割に合わなくなることを確保する;ボールトコントラクトが「正常な預け入れ関数を経ずに直接ボールトに送金する」という種類の資産を検出または制限しているかを検証し、この種の一方的に注入された資産が持分の価値を計算するために使用される総資産の数字に直接カウントされないようにする;そしてもしあなたがあるボールトの早期預金者になることを検討しているなら、このボールトにあなたが預け入れる前にすでに他の本物のユーザーの預金があり、一定の総持分規模を蓄積していたかを検証する——規模が大きいほど、空のボールトや極めて小規模なボールトを狙う初回預金者攻撃のようなタイプの攻撃の実現可能性は理論上低くなる。
OpenZeppelinが発表した技術分析によると、wUSDM(トークン化されたボールト商品)を狙った攻撃事例の一つでは、攻撃者はわずか約32万ドルをボールトに寄付しただけで、当時のボールトの流動性が比較的低かったため、この寄付が各持分が対応する資産価値を人為的に50%急騰させた。攻撃者がもともと借り出していたポジションの帳簿価値は、その結果約288万ドルから約432万ドルまで瞬時に膨れ上がり、攻撃者に約32万ドルの即時裁定取引の余地をもたらすと同時に、このボールトの価格設定に依存する融資プロトコルに対応する不良債権の穴を負担させた。この種の攻撃はDeFi業界において孤立した事例ではなく、「Resupply」と呼ばれるプロトコルも類似のシナリオの下でかつて攻撃を受けたことがある。これらの事例はその後、OpenZeppelinのような主流のスマートコントラクトライブラリに、この種の脆弱性に対する防御メカニズム(仮想持分の設計など)をERC-4626ボールトを監査する際の最初のチェック項目として挙げさせることを促した。
これは安全リスクの用語であり、前向きなトレードオフというものは存在しない。唯一議論できるトレードオフは防御メカニズム自体の設計コストにある——仮想持分やデッドシェアのような防御設計を採用することは、通常デプロイ段階で追加の小さな初期資産をロックする、あるいはコントラクトのロジックの複雑さを増やす必要があるが、このコストは攻撃が引き起こしうる損失の規模に対して無視できる程度であり、現在業界で認められ、採用しない理由がほとんどない基本的な防御措置である。