メインコンテンツまでスキップ

開発者のコメントが 1 億 2800 万ドルの大惨事に:Balancer の丸め誤差の脆弱性を読み解く

· 約 14 分
Dora Noda
Software Engineer

Balancer のスマートコントラクトコードの中に埋もれていた、最終的に 1 億 2800 万ドルの流出を招くことになる関数のすぐ上に、開発者のコメントが添えられていました。「この丸め(rounding)の影響は最小限にとどまると予想される」と。彼らは間違っていました。9 桁もの誤差で。

2025 年 11 月 3 日、攻撃者が Balancer V2 の Composable Stable Pools における微細な丸め誤差を悪用し、30 分足らずの間に 9 つのブロックチェーンネットワークにわたって資金を流出させました。それは派手なリエントランシー攻撃や秘密鍵の漏洩ではありませんでした。それは算術的な問題でした。一見しただけでは分からない場所に潜み、複数の監査を通過し、誰か賢明な者がそれを武器化するのを静かに待っていたようなバグでした。

丸め誤差エクスプロイトの解剖学

脆弱な関数

Balancer V2 の batchSwap 機能により、ユーザーは単一のトランザクションで複数のトークンスワップを実行できます。内部では、_upscaleArray と呼ばれる内部関数が、計算前にトークン残高を共通の精度に正規化します。この関数は「スケーリングファクター(scaling factors)」を使用します。これは、各トークンの小数点以下の桁数と内部レートを考慮した乗数です。

問題は何だったのでしょうか?スケーリングファクターが整数ではない値(トークンレートが組み込まれるたびに発生します)の場合、Solidity の整数演算は切り捨て(round down)を行います。ほとんどのシナリオでは、精度の損失は数 wei(1 セントの何分の一か)にすぎません。しかし、リキッド・ステーキング派生商品(LSD)のような相関性の高い資産を保持する Composable Stable Pools では、StableSwap インバリアント(不変量)計算を通じて、わずかな丸め誤差でさえ増幅されてしまいます。

3 段階の攻撃

攻撃者の戦略は、そのシンプルさにおいて優雅なものでした:

  1. 境界まで押し込む。 大量の BPT(Balancer Pool Tokens)を原資産トークンにスワップし、あるトークンの内部残高をクリティカルな 8 〜 9 wei の範囲まで低下させます。これは、Solidity の整数除算が最大の精度損失を生み出す正確な閾値です。

  2. 誤差を複利化する。 境界に配置されたトークンを含む高速なマイクロ・スワップを実行します。各スワップは _upscaleArray をトリガーし、EXACT_OUT 操作中に切り捨てが発生します。この丸めにより、プールの不変量 D が系統的に過小評価され、BPT 価格が人為的に抑制されます。

  3. 差額を抽出する。 抑制された価格で BPT をミントまたは購入し、即座にフルバリューで原資産に還元します。これを繰り返します。

攻撃者は、コンストラクタが 65 回以上のマイクロ・スワップを実行するスマートコントラクトをデプロイし、精度の損失を壊滅的なインバリアント操作へと複利的に増大させました。個々の丸め誤差は無視できるものでしたが、それらが合わさることでプールから資金を搾り取ったのです。

30 分間で 9 つのチェーンにわたり 1 億 2800 万ドルが流出

このエクスプロイトは、Ethereum、Base、Arbitrum、Avalanche、Optimism、Gnosis、Polygon、Berachain、Sonic で同時に発生しました。Ethereum が約 9900 万ドルと最大の被害を受け、小規模なチェーンではそれぞれ 100 万ドルから 1200 万ドルの損失となりました。

Hypernative の自動監視システムは数分以内に攻撃を検知しましたが、その時にはすでに被害がネットワーク全体に連鎖していました。このエクスプロイトのマルチチェーン性(すべてのネットワークに同一の脆弱なコードがデプロイされていたこと)により、単一チェーンのインシデントで済んだはずのものが DeFi 全体の危機へと発展しました。

チェーンレベルの緊急対応

対応はネットワークによって劇的に異なり、分散化の哲学のスペクトラムを浮き彫りにしました:

  • Berachain はネットワーク全体を停止し、緊急ハードフォークを実行。ユーザーの預金 1280 万ドルを回収するためにエクスプロイトをロールバックしました。この決定は物議を醸しました。メインネット稼働からわずか数ヶ月のチェーンであり、ユーザー保護と不変性のどちらかを選択しなければなりませんでした。

  • Gnosis Chain は当初、より慎重なアプローチをとり、クロスチェーンの資金移動を防ぐためにブリッジ活動を制限しました。Monerium は影響を受けたボルト内の 130 万 EURe を凍結しました。その後、12 月 22 日に Gnosis はハードフォークを実行して 940 万ドルを回収。チェーンの状態を書き換え、攻撃者のウォレットから DAO が管理するリカバリーアドレスへと強制的に資金を移動させました。

  • StakeWise DAO は、Balancer の Safe Harbor フレームワーク(2024 年に制定された BIP-726)を活用して、ホワイトハットによる回収活動を法的に承認し、約 1900 万ドルの osETH と 170 万ドルの osGNO を取り戻しました。

合計で、約 4300 万ドルが回収または凍結されました。これは総損失額の約 3 分の 1 に相当します。

監査のパラドックス

Balancer のエクスプロイトにおいておそらく最も不安な側面は、それが複数の専門的なセキュリティ監査を通過していたことです。

Trail of Bits は Balancer V2 のコードを監査し、実際に丸めに関連する懸念事項を特定していました。2021 年の Linear Pools のレビューにおいて、彼らは丸めの挙動を指摘しましたが、それが悪用可能かどうかを明確に判断することはできませんでした。彼らは、「すべての算術演算の丸め方向が期待通りであることを確認するために、包括的なファズテスト(fuzz testing)」を行うことを推奨していました。

Trail of Bits が後に 2022 年 9 月に Composable Stable Pools をレビューした際、脆弱性を含んでいた正確なコードである Stable Math ライブラリは、明示的に対象外(out of scope)とされていました。

業界の脅威状況は変化していました。2021 年当時、丸めや算術の問題は重大なリスクカテゴリとは見なされていませんでした。しかし 2025 年までに、丸め誤差は秘密鍵の盗難に次いで、DeFi で 2 番目に多く悪用される脆弱性となっていました。監査基準が時代の変化に追いついていなかったのです。

Balancer V3 の形式検証(formal verification)を実施した Certora は、後に V2 の検証プロパティが「個別のスワップ間の関係や丸めの挙動を制約していなかった」ことを認めました。そのプロパティは高いレベルでのソルベンシー(支払余力)を保証していましたが、反復的な操作が丸めの偏りを通じて系統的に価値を蓄積できるシナリオを見落としていたのです。

異常事態ではなく、繰り返されるパターン

Balancer の脆弱性攻撃は、何もないところから突如として現れたわけではありません。DeFi における丸め精度攻撃(Rounding precision attacks)には、長い歴史があります。

  • Hundred Finance (2023): 攻撃者は WBTC を寄付することで hWBTC コントラクト内の交換レートを操作しました。redeemUnderlying 関数における丸め誤差を悪用し、不当に多額の資金を引き出しました。

  • Raft Finance (2023): ステーブルコインプロトコルにおける精度損失を突いたフラッシュローン攻撃により、360 万ドルが流出しました。

  • Compound V2 のフォークプロジェクト (継続中): 空または空に近いレンディングプールは依然として脆弱です。totalSupply の値が低いため、攻撃者は寄付攻撃を通じて交換レートを吊り上げ、整数の除算による丸めを悪用できます。

  • Balancer 自身の 2023 年の事案: 210 万ドル規模の比較的小さな丸め脆弱性攻撃が、同様の算術的想定を標的にしました。これは、2025 年 11 月の壊滅的な侵害を予兆する警告でした。

根本的な原因は常に同じです。Solidity にはネイティブな浮動小数点サポートがありません。すべての除算操作は切り捨てられ、すべての乗算はオーバーフローの可能性があり、すべての正規化ステップで誤差が混入する可能性があります。これらの誤差が反復的な操作(特に AMM のインバリアント計算)を通じて蓄積されると、その結果は壊滅的なものになる可能性があります。

なぜ監査で丸めバグが見逃され続けるのか

従来のスマートコントラクト監査は、ロジックの欠陥、アクセス制御、リエントランシー、オラクルの操作に焦点を当てています。丸め誤差には、根本的に異なるアプローチが必要です。

数学的に微細である。 たった 1 wei を失う単一の丸め操作はバグではありません。脆弱性が顕在化するのは、攻撃者が 1 回のトランザクションでその操作を数千回繰り返し、無視できる程度の誤差を実質的な価値の抽出へと蓄積できた時だけです。

文脈に依存する。 同じ丸め動作でも、あるプールの構成では無害であり、別の構成では悪用可能になることがあります。Trail of Bits が Linear Pools の問題を特定できなかったのは、悪用するための特定の条件がそのプールタイプに存在しなかったためです。

静的解析を回避する。 自動化ツールは既知の脆弱性パターンをチェックします。丸め攻撃の悪用を理解するには、反復操作とプールのインバリアントの間の数学的関係を理解する必要があり、これには深い専門知識とプロパティベースのテストが要求されます。

形式検証は役立つが、適切なプロパティ設定が必要。 Certora による V3 の検証には、V2 には欠けていた重要なプロパティである swappingBackAndForth が含まれていました。これは、トークン A から B へ、そして元に戻すスワップを行っても純利益が発生しないことを検証するものです。このルール一つあれば、Balancer V2 の脆弱性は防げたはずです。教訓:検証の強さは、チェックするプロパティの質に左右されます。

脆弱性攻撃の後に何が変わったか

Balancer V3 のセキュリティ刷新

この脆弱性の影響を受けなかった Balancer V3 は、Certora と協力して広範な再評価を受けました。V3 アーキテクチャは、以下を通じて特定の丸め脆弱性を排除しています。

  • 精度損失なしで非整数係数を処理する再設計されたスケーリングロジック
  • ラウンドトリップスワップのインバリアントを特に標的としたプロパティによる形式検証
  • すべての算術操作における明示的な丸め方向の強制

業界全体への影響

この脆弱性攻撃は、DeFi セキュリティにおけるいくつかのトレンドを加速させました。

  • **ランタイムエンフォースメント(実行時強制)**が、監査を補完するものとして注目を集めました。A16z crypto は、トランザクション実行中の数値異常を検出するランタイムチェックの使用に関する研究を発表しました。これにより、展開前の分析だけに頼るのではなく、リアルタイムで攻撃をキャッチできるようになります。

  • 丸めを考慮したテストが標準的な監査要件となりました。主要な監査法人は現在、反復的な丸めの蓄積を特に標的としたプロパティベースのファジングを導入しています。

  • Balancer の BIP-726 のようなセーフハーバー(免責)枠組みがその価値を証明しました。これにより、ホワイトハットの対応者が訴追を恐れることなく迅速に資金を回収するための法的保護が提供されました。

より深い教訓

Balancer の脆弱性攻撃は、DeFi セキュリティに関する不都合な真実を浮き彫りにしました。最も危険なバグは、劇的なものではないということです。リエントランシー攻撃はよく理解されています。フラッシュローン操作には確立された防御策があります。しかし、開発者が // この丸めの影響は最小限であると予想される と書いて先に進んでしまうこと、それこそがあらゆる防御層をすり抜ける脆弱性なのです。

DeFi プロトコルが 1,000 億ドルを超える TVL(預かり資産総額)を管理している現状では、「最小限であると予想される」許容範囲はゼロです。1 操作につき 1 wei を失う丸め誤差であっても、攻撃者が 1 回のコンストラクタ呼び出しで 65 回の操作を実行できれば、1 億 2,800 万ドルの流出事件に発展します。

Balancer の事案は、私たちが無視できると考えるものと、攻撃者が破滅的な事態へと蓄積できるものとの間のギャップを示すケーススタディです。DeFi において、無害な丸め誤差などというものは存在しません。


BlockEden.xyz は、セキュリティ第一のアーキテクチャを備えたエンタープライズグレードのブロックチェーン API インフラストラクチャを構築しています。DeFi プロトコルが Balancer のような事案から学ぶにつれ、堅牢なノードインフラはより安全なオンチェーンインタラクションの基盤となります。API マーケットプレイスを探索して、信頼性のために設計されたインフラ上で構築を開始してください。