Back to Blog

#3 Balancer V2インシデント:丸め誤差による不変条件の破綻とチェーン間への波及

Code Auditing
February 10, 2026
7 min read

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

2025年11月3日、Balancer V2のComposable Stable Pools および複数のチェーンにフォークされたプロジェクトが、組織的なエクスプロイトの被害に遭い、総額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) と、対応する基盤資産があります。

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

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

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

上記の式から、D を(実際の資金損失なしでも)帳面上小さくできれば、BPT の価格は安く見えます。

batchSwap() および onSwap()

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

  • GIVEN_IN ("Given In"): 呼び出し元は入力トークンの正確な金額を指定し、プールが対応する出力金額を計算します。
  • GIVEN_OUT ("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 は実際の必要入力量を過小評価します。これにより、ユーザーは1つの基盤資産(例: wstETH)を別の資産(例: cbETH)と交換する際に、より少ない数量で交換できるようになり、実効流動性の減少により不変式 D が減少します。結果として、BPT の価格(BPT price = D / totalSupply)は、BPT 価格が人工的に切り下げられるため、デフレを起こします。

攻撃分析

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

  • 第1段階では、単一のトランザクション内でコアとなるエクスプロイトが実行され、即時の利益は発生しませんでした。
  • 第2段階では、攻撃者は別のトランザクションで資産を撤回することにより利益を実現しました。

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

パラメータ計算フェーズ

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

バッチスワップフェーズ

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

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

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

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

まとめ

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

主な教訓:

  • 丸め処理と精度処理: トークン金額に対するすべてのスケーリングおよび精度操作は、プロトコルに有利な方向に丸められるべきです。 _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
Newsletter - April 2026
Security Insights

Newsletter - April 2026

In April 2026, the DeFi ecosystem experienced three major security incidents. KelpDAO lost ~$290M due to an insecure 1-of-1 DVN bridge configuration exploited via RPC infrastructure compromise, Drift Protocol suffered ~$285M from a multisig governance takeover leveraging Solana's durable nonce mechanism, and Rhea Finance incurred ~$18.4M following a business logic flaw in its margin-trading module that allowed circular swap path manipulatio

~$7.04M Lost: GiddyDefi, Volo Vault & More | BlockSec Weekly
Security Insights

~$7.04M Lost: GiddyDefi, Volo Vault & More | BlockSec Weekly

This BlockSec weekly security report covers eight attack incidents detected between April 20 and April 26, 2026, across Ethereum, Avalanche, Sui, Base, HyperLiquid, and MegaETH, with total estimated losses of approximately $7.04M. The highlighted incident is the $1.3M GiddyDefi exploit, where the attacker did not break any cryptography or use a flash loan but simply replayed an existing on-chain EIP-712 signature with the unsigned `aggregator` and `fromToken` fields swapped out for a malicious contract, demonstrating how partial signature coverage turns any historical signature into a generic permit. Other incidents include a $3.5M Volo Vault operator key compromise on Sui, a $1.5M Purrlend privileged-role takeover, a $413K SingularityFinance oracle misconfiguration, a $142.7K Scallop cross-pool index injection, a $72.35K Kipseli Router decimal mismatch, a $50.7K REVLoans (Juicebox) accounting pollution, and a $64K Custom Rebalancer arbitrary-call exploit.

Weekly Web3 Security Incident Roundup | Apr 13 – Apr 19, 2026
Security Insights

Weekly Web3 Security Incident Roundup | Apr 13 – Apr 19, 2026

This BlockSec weekly security report covers four attack incidents detected between April 13 and April 19, 2026, across multiple chains such as Ethereum, Unichain, Arbitrum, and NEAR, with total estimated losses of approximately $310M. The highlighted incident is the $290M KelpDAO rsETH bridge exploit, where an attacker poisoned the RPC infrastructure of the sole LayerZero DVN to fabricate a cross-chain message, triggering a cascading WETH freeze across five chains and an Arbitrum Security Council forced state transition that raises questions about the actual trust boundaries of decentralized systems. Other incidents include a $242K MMR proof forgery on Hyperbridge, a $1.5M signed integer abuse on Dango, and an $18.4M circular swap path exploit on Rhea Finance's Burrowland protocol.

Best Security Auditor for Web3

Validate design, code, and business logic before launch. Aligned with the highest industry security standards.

BlockSec Audit