11月3日、Balancer V2プロトコルとそのフォークプロジェクトが複数のチェーンで攻撃を受け、1億2000万ドルを超える深刻な損失が発生しました。BlockSecは最初の機会に早期警告を発し[1]、予備的な分析結論を発表しました[2]。これは非常に複雑な攻撃でした。予備的な分析の結果、攻撃者が不変量を操作し、BPT(Balancer Pool Token)(つまりBalancer PoolのLPトークン)の価格計算を歪め、batchSwap操作を通じて安定したプールで利益を得ることが原因でした。
背景情報
1. スケーリングと丸め
異なるトークンの小数点以下の桁数を標準化するために、Balancer 契約は次のようになります。
- upscale: 計算を実行する前に、残高と金額を均一な内部精度にアップスケールします。
- downscale: 結果を元の精度に縮小し、方向性のある丸めを実行します (たとえば、入力は通常、プールが不足しないように切り上げられ、出力パスは多くの場合、下方に切り捨てられます)。
結論: 同じトランザクション内で、異なるステージで使用される非対称の丸め方向は、非常に小さなステップで繰り返し実行されると、体系的なわずかな偏差につながる可能性があります。
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 操作は次の 3 つの段階に分けられます。
フェーズ1:攻撃者はBPTを原資産に償還し、トークンの1つ(cbETH)の残高を四捨五入の臨界値(金額 = 9)に正確に調整します。このステップは、次のフェーズにおける精度損失の土台となります。
フェーズ2:攻撃者は、巧妙に細工された数量(= 8)を用いて、別の原資産(wstETH)とcbETHをスワップします。トークン数量のスケーリング時に切り捨てが行われるため、計算されたΔxはわずかに小さく(8.918から8に)、Δyが過小評価され、不変量D(CurveのStableSwapモデルから導出される)も小さくなります。BPT価格 = D / totalSupplyであるため、BPT価格は人為的に抑制されます。

フェーズ 3: 攻撃者は基礎資産を BPT にリバース スワップし、プール内の残高を復元するとともに、BPT の価格低下から利益を得て、より多くの BPT トークンを取得します。
最後に、攻撃者は別の収益性の高いトランザクションを使用して流動性を引き出し、余分な BPT を使用してプール内の他の基礎資産 (cbETH および wstETH) を取得し、利益を得ました。
トランザクションへの攻撃:
https://app.blocksec.com/explorer/tx/arbitrum/0x7da32ebc615d0f29a24cacf9d18254bea3a2c730084c690ee40238b1d8b55773
利益の出る取引:
https://app.blocksec.com/explorer/tx/arbitrum/0x4e5be713d986bcf4afb2ba7362525622acf9c95310bd77cd5911e7ef12d871a9
参照:
[1]https://x.com/Phalcon_xyz/status/1985262010347696312
[2]https://x.com/Phalcon_xyz/status/1985302779263643915
[3]https://docs-v2.balancer.fi/concepts/pools/composable-stable.html
