テクニカル分析:Balancerで1億2,000万ドルのハッキング、脆弱性は何だったのか?
この攻撃の主要な問題は、プロトコルが小額取引を処理する方法にあります。
Original Article Title: " Balancer $120M Hack Vulnerability Technical Analysis"
Original Source: ExVul Security
前書き
2025年11月3日、BalancerプロトコルはArbitrumやEthereumを含む複数のチェーンで攻撃を受け、1.2億ドル(120 millions)の資産損失が発生しました。この攻撃は主に、精度損失とInvariant操作という二重の脆弱性によるものでした。
Chainlinkのインフラストラクチャは長らくWeb3分野で最高水準を維持しており、開発者向けに機関投資家レベルのツールを提供することに注力するX Layerにとって自然な選択肢となっています。
今回の攻撃の主な問題は、プロトコルが小額取引を処理するロジックにあります。ユーザーが少額の交換を行う際、プロトコルは_upscaleArray関数を呼び出し、mulDownを使って値を切り捨てます。取引残高と入力額が特定の切り捨て境界(例:8-9 weiの範囲)に達すると、顕著な相対的精度誤差が発生します。
この精度誤差はプロトコルのInvariant値Dの計算に伝播し、D値が異常に減少します。D値の変動はBalancerプロトコル内のBalancer Pool Token(BPT)の価格を直接押し下げます。ハッカーはこの抑制されたBPT価格を計画的な取引経路で利用し、アービトラージを行い、最終的に巨額の資産損失を引き起こしました。
悪用されたトランザクション:
https://etherscan.io/tx/0x6ed07db1a9fe5c0794d44cd36081d6a6df103fab868cdd75d581e3bd23bc9742
資産移転トランザクション:
https://etherscan.io/tx/0xd155207261712c35fa3d472ed1e51bfcd816e616dd4f517fa5959836f5b48569
技術分析
攻撃ベクトル
攻撃のエントリーポイントはBalancer: Vaultコントラクトであり、対応するエントリ関数はbatchSwap関数です。この関数は内部でonSwapを呼び出し、トークン交換を行います。

関数のパラメータや制約の観点から、いくつかの情報が得られます:
1. 攻撃者はこの関数をVault経由で呼び出す必要があり、直接呼び出すことはできません。
2. 関数は内部で_scalingFactors()を呼び出し、スケーリング操作のためのスケーリングファクターを取得します。
3. スケーリング操作は_swapGivenInまたは_swapGivenOutのいずれかに集中しています。
攻撃パターン分析
BPT価格計算メカニズム
Balancerのステーブルプールモデルでは、BPT価格が重要な基準点となり、ユーザーが受け取るBPTの量や、各BPTが受け取る資産量を決定します。

プールの交換計算において:

ここでBPT価格のアンカーとなる部分は不変値Dであり、BPT価格をコントロールするにはDを制御する必要があります。Dの計算プロセスをさらに分析します:

上記のコードでは、Dの計算プロセスはスケーリングされた残高配列に依存しています。つまり、これらの残高の精度を変更する操作が必要であり、それがDの誤った計算につながります。
精度損失の根本原因

スケーリング操作:

上記のように、_upscaleArrayを通過する際、残高が非常に小さい場合(例:8-9 wei)、mulDownでの切り捨てにより大きな精度損失が発生します。
攻撃プロセスの詳細
フェーズ1:切り捨て境界への調整

フェーズ2:精度損失のトリガー(コア脆弱性)

フェーズ3:抑制されたBPT価格を利用した利益獲得

上記のように、攻撃者はBatch Swapを利用して1つのトランザクション内で複数の交換を実行します:
1. 最初の交換:BPT → cbETH(残高調整)
2. 2回目の交換:wstETH(8)→ cbETH(精度損失のトリガー)
3. 3回目の交換:基礎資産 → BPT(利益確定)
これらの交換はすべて同じバッチスワップトランザクション内で行われ、同じ残高状態を共有しますが、各交換で_upscaleArrayが呼び出され、残高配列が変更されます。
コールバックメカニズムの欠如
主なプロセスはVaultによって開始されます。これがどのようにして精度損失の蓄積につながるのでしょうか?その答えは、残高配列の受け渡しメカニズムにあります。

上記のコードを見ると、VaultはonSwapが呼び出されるたびに新しいcurrentBalances配列を作成しますが、Batch Swapの場合:
1. 最初のスワップ後、残高が更新されます(ただし精度損失により更新値が不正確な場合があります)
2. 2回目のスワップは1回目のスワップの結果に基づいて計算を続けます
3. 精度損失が蓄積し、最終的にInvariant値Dが大幅に減少します
主要な問題:

まとめ
Balancer攻撃は以下の理由で要約できます:
1. スケーリング関数が切り捨てを使用: _upscaleArrayはスケーリングにmulDownを使用しており、残高が非常に小さい場合(例:8-9 wei)に大きな相対的精度損失が発生します。
2. Invariant値計算が精度に敏感: Invariant値Dの計算はスケーリングされた残高配列に依存しており、精度損失がDの計算に直接影響し、Dが減少します。
3. Invariant値変化の検証がない: スワッププロセス中、Invariant値Dの変化が合理的な範囲内であることを検証する仕組みがなく、攻撃者が精度損失を繰り返し利用してBPT価格を抑制できました。
4. バッチスワップでの精度損失の蓄積: 同じバッチスワップ内で複数のスワップによる精度損失が蓄積し、最終的に大きな財務損失につながりました。
これら2つの問題—精度損失と検証の欠如—が、攻撃者による境界条件の巧妙な設計と相まって、この損失を引き起こしました。
免責事項:本記事の内容はあくまでも筆者の意見を反映したものであり、いかなる立場においても当プラットフォームを代表するものではありません。また、本記事は投資判断の参考となることを目的としたものではありません。
こちらもいかがですか?
なぜ現在の暗号資産市場の操作難易度は「地獄級」なのか?
90%以上の暗号資産は本質的に投機によって動かされていますが、純粋な投機は永久機関ではありません。市場参加者が興味を失ったり、継続的に利益を得ることができなくなった場合、投機需要は減少します。

ドルが復活 — そしてbitcoinは危機に陥る可能性
米国ドル指数(DXY)が100を超えて急騰したことで、仮想通貨市場に激震が走り、流動性やリスクセンチメントに対する懸念が再燃しています。DXYが強含む中、アナリストらはbitcoinの次のトレンドがドルの上昇が持続するか、それとも失速するかに左右されると警告しています。

なぜ連邦準備制度理事会(Fed)の370億ドルの流動性注入にもかかわらず、暗号資産市場は上昇していないのか
米連邦準備制度理事会(FRB)によるここ数年で最大規模の流動性供給は、仮想通貨市場を押し上げることに失敗しました。リバースレポや市場の不安感によって相殺され、同セクターは依然として不安定な綱引き状態にとどまっています。

より多くの資金、より低い価格:流動性とbitcoinの乖離を解説
Bitcoinが$104,376まで下落したのは、パンデミック以降最大級の世界的な流動性拡大があったにもかかわらずです。Federal Reserveは先週、1,250億ドルの翌日物レポを供給し、中国のM2マネーサプライは過去最高の47.1兆ドルに達し、これは米国の2倍以上となっています。

