テクニカル分析:Balancerが1.2億ドルを盗まれた原因はどこにあるのか?
今回の攻撃の主な問題は、プロトコルが少額取引を処理するロジックにありました。
原文タイトル:《Balancer 被盗$120M 漏洞技术分析》
原文来源:ExVul Security
前書き
2025年11月3日、BalancerプロトコルはArbitrum、Ethereumなど複数のパブリックチェーン上でハッカー攻撃を受け、1.2億ドル(120Mドル)の資産損失が発生しました。攻撃の核心は、精度損失とインバリアント(Invariant)操作の二重脆弱性に起因しています。
Chainlinkのインフラストラクチャは長期にわたりWeb3分野で最高水準を維持しており、そのためX Layerが開発者に機関レベルのツールを提供するための自然な選択肢となっています。
今回の攻撃の重要な問題は、プロトコルが少額取引を処理するロジックにあります。ユーザーが少額のスワップを行う際、プロトコルは_upscaleArray関数を呼び出し、この関数はmulDownを用いて数値を切り捨てます。取引中の残高と入力額が特定の切り捨て境界(例えば8-9 weiの範囲)に同時にある場合、顕著な相対精度誤差が発生します。
精度誤差はプロトコルのインバリアントDの計算過程に伝播し、D値が異常に小さくなります。そしてD値の変動は直接Balancerプロトコル内のBPT(Balancer Pool Token)価格を引き下げ、ハッカーはこの低下したBPT価格を利用し、事前に設計された取引経路でアービトラージを完了し、最終的に巨額の資産損失をもたらしました。
脆弱性利用Tx:
資産移転Tx:
技術分析
攻撃エントリーポイント
攻撃のエントリーポイントはBalancer: Vaultコントラクトであり、対応するエントリ関数はbatchSwap関数で、内部でonSwapを呼び出してトークンスワップを実行します。

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

プールのスワップ計算において:

この中でBPT価格の基準となる部分はインバリアントDであり、BPT価格を操作するにはDを操作する必要があります。以下、Dの計算過程を分析します:

上記コードでは、Dの計算過程はスケーリング後のbalances配列に依存しています。つまり、これらのbalancesの精度を変更する操作が必要であり、それがDの計算ミスにつながります。
精度損失の根源

スケーリング操作:

上記のように_upscaleArrayを通じて、残高が非常に小さい場合(例えば8-9 wei)、mulDownによる切り捨てが顕著な精度損失を引き起こします。
攻撃フロー詳細
フェーズ1:切り捨て境界への調整

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

フェーズ3:低下したBPT価格を利用して利益を得る

上記のように攻撃者はBatch Swapを通じて1つの取引で複数回のスワップを実行します:
1. 1回目のスワップ:BPT → cbETH(残高調整)
2. 2回目のスワップ:wstETH (8) → cbETH(精度損失をトリガー)
3. 3回目のスワップ:基礎資産 → BPT(利益獲得)
これらのスワップはすべて同じbatch swap取引内で行われ、同じ残高状態を共有しますが、各スワップごとに_upscaleArrayが呼び出されbalances配列が変更されます。
Callbackメカニズムの欠如
メインフローはVaultによって開始されますが、どのようにして精度損失が累積されるのでしょうか?答えはbalances配列の伝達メカニズムにあります。

上記コードを分析すると、VaultはonSwapを呼び出すたびに新しいcurrentBalances配列を作成しますが、Batch Swap内では:
1. 1回目のスワップ後、残高が更新されます(ただし精度損失により更新後の値が正確でない可能性があります)
2. 2回目のスワップは1回目の結果に基づいて計算を続けます
3. 精度損失が累積し、最終的にインバリアントDが著しく小さくなります
重要な問題:

まとめ
Balancerの今回の攻撃は、以下のいくつかの原因にまとめられます:
1. スケーリング関数が切り捨てを使用:_upscaleArrayはmulDownでスケーリングを行い、残高が非常に小さい場合(8-9 weiなど)、顕著な相対精度損失が発生します。
2. インバリアント計算が精度に敏感:インバリアントDの計算はスケーリング後のbalances配列に依存し、精度損失がDの計算に直接伝播し、Dが小さくなります。
3. インバリアント変動の検証が欠如:スワップ過程でインバリアントDの変動が合理的範囲内かどうかの検証がなく、攻撃者が精度損失を繰り返し利用してBPT価格を引き下げることが可能でした。
4. Batch Swap内での精度損失の累積:同じbatch swap内で複数回のスワップによる精度損失が累積し、最終的に巨額の財務損失へと拡大しました。
この2つの問題、精度損失+検証の欠如、そして攻撃者による境界条件の巧妙な設計が、今回の損失を引き起こしました。
免責事項:本記事の内容はあくまでも筆者の意見を反映したものであり、いかなる立場においても当プラットフォームを代表するものではありません。また、本記事は投資判断の参考となることを目的としたものではありません。
こちらもいかがですか?
XRP価格がクラシックな「隠れ強気ダイバージェンス」を示す。$5はまだ視野に入っているのか?
ビットコインが101,000ドルを下回る:アナリストは「ファンダメンタルズに基づけばBTCは過小評価されている」と指摘
アナリストは、Stream Financeの9300万ドル損失後、DeFi全体で2億8500万ドルの潜在的なエクスポージャーをマッピング
YieldsAndMoreのアナリストは、Stream Financeの9,300万ドルの損失に関連して2億8,500万ドル以上のエクスポージャーの可能性を指摘しています。Streamの問題は、1億2,800万ドルのBalancerの不正利用やMoonwellの100万ドル規模のオラクル攻撃とともに、DeFiにとって波乱の一週間をさらに悪化させています。

Sequansは負債返済のためにビットコイン保有量の約3分の1を売却、BTCは4ヶ月ぶりの安値に
Quick Take Sequansは970 BTCを売却し、bitcoinの保有量を2,264 BTCに減らし、負債額も半減させました。この売却により、同社はBitcoin Treasuriesのランキングで29位から33位に順位を下げました。

