Balancer V2 攻撃の予備分析

11月3日、Balancer V2プロトコルおよびそのフォークプロジェクトが複数のオンチェーンで攻撃を受け、$120M以上の深刻な損失が発生しました。BlockSecは最初に[1]を警告し、初期分析の結論[2]を提供しました。これは高度に複雑な攻撃事件です。私たちの初期分析によれば、根本原因は攻撃者が不変量(invariant)を操作し、BPT(Balancer Pool Token ) – つまりoolのLPトークン – の価格計算を歪めたためであり、これにより一回のbatchSwap操作で特定の安定プール(stable pool)で利益を得ることができました。

背景

1. スケーリング(scaling)とラウンド(rounding)

異なるトークンの小数点以下の桁数を統一するために、Balancer コントラクトは:

  • アップスケール:残高と金額を統一内部精度に拡大した後で計算する;
  • ダウンスケール:結果を元の精度に戻し、方向性のある切り捨てを行います(例えば、入力端は通常切り上げてプールが少なくならないようにし、出力パスは通常切り下げます)。

結論:同一の取引内で、異なる段階で採用される丸め方向が非対称である場合、極小のステップで繰り返し実行すると、システム的な微小な偏差が生じる。

2. D対BPT価格

今回の攻撃の影響を受けたのは、Balancer V2プロトコルのComposable Stable Pool [3]およびフォークされたプロトコルです。Stable Poolは、1:1の交換比率を維持できると予想される資産(または既知の為替レートで交換される資産)向けに設計されており、大規模な交換を行っても顕著な価格衝撃を引き起こさず、類似資産または関連資産間の資金利用効率を大幅に向上させることができます。

  • このプールはStable Math(Curveに基づくStableSwapモデル)を採用しており、不変式Dはプールの「仮想総価値」を表しています。
  • BPT (プールのLPトークン) 価格はおおよそ:

!

上記の公式から、Dを帳簿上で小さくすることができれば(実際に資金が流出していなくても)、BPTの価格をより安くすることができることがわかります。BTPはプールのシェアを表し、流動性を撤回する際にプール内のリザーブからどれだけ得られるかを計算するために使用されます。したがって、攻撃者がより多くのBPTを取得できれば、最終的に流動性を撤回する際に利益を得ることができます。

攻撃分析

Arbitrum 上の攻撃トランザクションの例を挙げると、batchSwap 操作は三つの段階に分けることができます:

第一段階:攻撃者はBPTを基礎資産に交換し、あるトークン(cbETH)の残高を四捨五入の境界の臨界点(数量 = 9)に正確に調整します。このステップは次の段階の精度損失(precision loss)を引き起こす条件を作ります。

第二段階: 攻撃者は精密に構築された数量(= 8)を使用して、別の基礎資産(wstETH)と cbETH の間で交換を行います。トークン数量をスケーリングする際に切り捨て(rounding down)が行われたため、計算された Δx はわずかに小さく(8.918 から 8 に)、その結果、Δy が過小評価され、不変量 D(Curve の StableSwap モデルからの)が小さくなります。BPT 価格 = D / totalSupply であるため、BPT 価格が人為的に押し下げられます。

!

第3段階:攻撃者は基盤資産を逆にBPTに交換し、リカバリープール内のバランスを回復させると同時に、押し下げられたBPT価格を利用して利益を得る – より多くのBPTトークンを獲得する。

最後に、攻撃者は別の利益を上げる取引を利用して流動性を撤回し、追加で得たBPTを使用してプール内の他の基礎資産(cbETHとwstETH)から利益を得ました。

アタックトレーディング:

収益性の高い取引:

参考:

[1]

[2]

[3]

BPT-0.38%
原文表示
このページには第三者のコンテンツが含まれている場合があり、情報提供のみを目的としております(表明・保証をするものではありません)。Gateによる見解の支持や、金融・専門的な助言とみなされるべきものではありません。詳細については免責事項をご覧ください。
  • 報酬
  • コメント
  • リポスト
  • 共有
コメント
0/400
コメントなし
  • ピン
いつでもどこでも暗号資産取引
qrCode
スキャンしてGateアプリをダウンロード
コミュニティ
日本語
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)