#3 Balancer V2インシデント:丸め誤差が不変条件を破り、クロスチェーンに波及

#3 Balancer V2インシデント:丸め誤差が不変条件を破り、クロスチェーンに波及

#3 Balancer V2 インシデント:丸め処理の不整合が不変条件を破り、クロスチェーンに波及

2025年11月3日、Balancer V2のComposable Stable Poolおよび複数のチェーンにフォークされたプロジェクトが、連携されたエクスプロイトの標的となり、総額1億2500万ドル以上の損失が発生しました。そのうち約4500万ドルは回収されたと報告されています。根本原因は、アップスケーリングとダウンスケーリング処理間での丸め処理の不整合に起因する不変条件計算における精度損失による価格操作であり、最終的にBPT(Balancer Pool Token)の価格設定ロジックを歪めました。

このインシデントは、損失の規模だけでなく、根本的なバグの巧妙さから、2025年におけるトップ10のセキュリティインシデントの一つとして際立っています。さらに、エクスプロイトは複数のチェーンに迅速に波及し、Balancer本体とフォークプロジェクトの両方に影響を与え、共有コードベースとコンポーザブルなDeFiインフラストラクチャがシステムリスクをいかに大幅に増幅させるかを浮き彫りにしました。

詳細な技術的分析を提供した包括的なレポート、「詳細分析:Balancer V2エクスプロイト」[1] を公開しました。以下に、インシデントの簡潔な解説を示します。

背景

Balancer V2のComposable Stable Pool

この攻撃で影響を受けたコンポーネントは、Balancer V2プロトコルのComposable Stable Pool [2] です。これらのプールは、ほぼ1:1のパリティ(または既知の為替レートで取引される)を維持することが期待される資産向けに設計されており、価格インパクトを最小限に抑えつつ大量のスワップを可能にすることで、同種または相関性の高い資産間の資本効率を大幅に向上させます。各プールには独自のBalancer Pool Token(BPT)があり、これはプールへの流動性提供者のシェアを表すとともに、対応する基軸資産も保持します。

  • このプールはStable Math(CurveのStableSwapモデルに基づく)を採用しており、不変条件Dはプールの仮想総価値を表します。

  • BPTの価格は以下のように近似できます。

Price(BPT)DtotalSupplyPrice(BPT) \approx \frac{D}{totalSupply}

上記の式から、Dが(実際の資金損失なしでも)理論上小さくなる場合、BPTの価格は安く見えるようになります。

`batchSwap()`および`onSwap()`

Balancer V2は、Vault [3] 内でのマルチホップスワップを可能にするbatchSwap()関数を提供しています。この関数に渡されるパラメータによって、2つのスワップタイプが決定されます。

  • GIVEN_IN(「提示額」):呼び出し元は入力トークンの正確な金額を指定し、プールは対応する出力金額を計算します。
  • GIVEN_OUT(「希望額」):呼び出し元は希望する出力金額を指定し、プールは必要な入力金額を計算します。

通常、batchSwap()は、onSwap()関数を介して実行される複数のトークン間スワップで構成されます。このプロセスには、必然的に不変条件D [1] に関連する金額計算が含まれます。

スケーリングと丸め処理

異なるトークン残高間での計算を正規化するために、Balancerは以下の2つの操作を実行します。

  • アップスケーリング:計算を実行する前に、残高と金額を統一された内部精度にスケーリングします。
  • ダウンスケーリング:結果をネイティブ精度に戻し、方向性のある丸め処理を適用します(例:プールが過少請求しないように、入力金額は通常切り上げられ、出力金額はしばしば切り捨てられます)。

アップスケーリングとダウンスケーリングは理論上、それぞれ乗算と除算という対になる操作です。しかし、これらの2つの操作の実装には不整合が存在します。 具体的には、ダウンスケーリング操作にはdivUpdivDownの2つのバリアント(方向)があります。対照的に、アップスケーリング操作にはmulDownという1つの方向しかありません。

脆弱性分析

根本的な問題は、BaseGeneralPool._swapGivenOut()関数におけるアップスケーリング中に実行される丸め下処理に起因します。特に、_swapGivenOut()_upscale()関数を通じてswapRequest.amountを誤って切り捨てます。結果として得られた丸められた値は、_onSwapGivenOut()を介してamountInを計算する際にamountOutとして使用されます。この動作は、丸め処理はプロトコルに有利な方法で適用されるべきであるという標準的な慣行に反しています。

したがって、特定のプール(wstETH/rETH/cbETH)に対して、計算されたamountInは実際の必要入力量を過小評価します。これにより、ユーザーは一方の基軸資産(例:wstETH)の少量と引き換えに別の一方(例:cbETH)を交換できるようになり、実効流動性の低下の結果として不変条件Dが減少します。結果として、対応するBPT(wstETH/rETH/cbETH)の価格は、BPT価格 = D / totalSupply であるため、人工的に切り下げられます。

攻撃分析

攻撃者は、検出リスクを最小限に抑えるために、2段階の攻撃を実行しました。

  • 第1段階では、コアとなるエクスプロイトは単一のトランザクション内で実行され、即時の利益は得られませんでした。
  • 第2段階では、攻撃者は別のトランザクションで資産を引き出すことで利益を上げました。

第1段階は、さらにパラメータ計算バッチスワップの2つのフェーズに分けることができます。以下に、Arbitrum上の攻撃トランザクション例(TX)を使用してこれらのフェーズを説明します。

パラメータ計算フェーズ

このフェーズでは、攻撃者はオフチェーン計算とオンチェーンシミュレーションを組み合わせて、次の(バッチスワップ)フェーズの各ホップのパラメータを、Composable Stable Poolの現在の状態(スケーリング係数、増幅係数、BPTレート、スワップ手数料、その他のパラメータを含む)に基づいて正確に調整しました。攻撃者は、計算を支援するために補助コントラクトもデプロイしました。これは、フロントランニングへの露出を減らすことを意図していた可能性があります。詳細については、[1]を参照してください。

バッチスワップフェーズ

次に、batchSwap()操作は3つのステップに分解できます。

ステップ1:攻撃者はBPT(wstETH/rETH/cbETH)を基軸資産にスワップして、1つのトークン(cbETH)の残高を丸め境界の端(amount = 9)に正確に調整します。これにより、次のステップでの精度損失の条件が整います。

ステップ2:攻撃者は、細工された金額(= 8)を使用して、別の基軸資産(wstETH)とcbETHの間でスワップします。トークン金額のスケーリング時に丸め下処理が行われるため、計算されたΔxはわずかに小さくなり(8.918から8)、Δyの過小評価につながり、結果として不変条件(CurveのStableSwapモデルからのD)が小さくなります。BPT価格 = D / totalSupply であるため、BPT価格は人工的に切り下げられます。

ステップ3:攻撃者は、基軸資産をBPTに戻してスワップし、バランスを回復させながら、切り下げられたBPT価格から利益を得ます。

まとめ

このインシデントでは、Balancer V2のComposable Stable Poolと、さまざまなチェーンにわたる複数のフォークデプロイメントを標的とした連携された一連のエクスプロイトトランザクションが含まれ、多大な損失が発生しました。最初の攻撃の後、模倣トランザクションが急速に出現し、攻撃パターンが公開されるといかに迅速に波及するかを示しました。

主な教訓:

  • 丸め処理と精度処理:トークン金額に対するあらゆるスケーリングおよび精度操作は、プロトコルに有利な方向に丸められるべきです。_upscale()(切り捨てのみ)とダウンスケーリング操作(方向性のある丸め)間の単一の不整合でも、悪用可能な価格歪みを生み出すのに十分でした。
  • セキュリティにおける軍拡競争:攻撃者は検出を回避するために、操作と利益抽出を別々のトランザクションに分割しました。検出システムは、個々のトランザクションだけでなく、関連するトランザクションを相関させるべきです。
  • 運用セキュリティ:エクスプロイトパターンが公開されると、模倣者は数分以内にチェーン全体でそれを再現しました。コードベースを共有するプロトコルは、連携した監視と迅速なクロスチェーン一時停止機能が必要です。

参照

  1. https://blocksec.com/blog/in-depth-analysis-the-balancer-v2-exploit

  2. https://docs-v2.balancer.fi/concepts/pools/composable-stable.html

  3. https://docs-v2.balancer.fi/reference/swaps/batch-swaps.html


BlockSecについて

BlockSecは、フルスタックのブロックチェーンセキュリティおよび暗号コンプライアンスプロバイダーです。私たちは、顧客がコード監査(スマートコントラクト、ブロックチェーン、ウォレットを含む)、リアルタイムでの攻撃傍受、インシデント分析、不正資金の追跡、およびAML/CFT義務の履行を、プロトコルおよびプラットフォームのライフサイクル全体にわたって実行できるようにする製品とサービスを構築しています。

BlockSecは、主要なカンファレンスで複数のブロックチェーンセキュリティ論文を発表し、DeFiアプリケーションの数多くのゼロデイ攻撃を報告し、複数のハッキングを阻止して2000万ドル以上を救済し、数十億ドル相当の暗号通貨を保護してきました。

Sign up for the latest updates