Anthropic buffaライブラリのゼロデイ脆弱性、攻撃者によるメモリ増幅型DoS攻撃を可能に

Anthropicが開発したRust製プロトコルバッファライブラリ「buffa」に、ゼロデイのメモリ増幅型サービス拒否(DoS)脆弱性が発見されました。この欠陥により、攻撃者は比較的小さな入力データだけでシステムメモリを枯渇させることができます。

Endor Labsがこの問題を発見したのは、同社のAI搭載静的アプリケーションセキュリティテスト(SAST)エンジンによるもので、現在はCVE-2026-55407として追跡されています。この事例は、メモリ安全なプログラミング言語においても、ロジックの欠陥が深刻なリソース枯渇につながり得ることを改めて示しています。

Anthropic buffaライブラリのゼロデイ脆弱性

この脆弱性は、buffaの未知フィールドデコードロジック、具体的にはdecode_unknown_field関数内に存在します。Rustはメモリ破損を本質的に防止しますが、制御されていないリソース割り当てに対する保護は備えていません。

今回のケースでは、攻撃者が制御する入力がヒープ割り当てサイズに直接影響を与えるため、過剰なメモリ消費を引き起こすことが可能です。この欠陥は、デフォルト設定であるpreserve_unknown_fields=trueで信頼されていないプロトコルバッファメッセージをデコードする際、バージョン0.8.0より前のすべてのバージョンに影響します。

Endor LabsのAI SASTエンジンは当初、信頼されていないワイヤデータから解析された長さの値が、上限なしでベクターの割り当てに使用されているデータフローを検出しました。

この「フラット割り当て」パスでは、メモリ使用量が入力のほぼ2倍になります。制約のある環境では単独でも問題になり得ますが、さらなる詳細分析により、プロトコルバッファの「StartGroup」フィールド処理においてより深刻な増幅ベクターが潜んでいることが判明しました。

この2番目の実行パスでは、デコーダがループ内でネストされた未知フィールドを処理し、解析された各フィールドを動的に拡張するベクターに追加します。varintを表すわずか2バイトという最小限の入力要素1つにつき、約40バイトのヒープ割り当てが発生します。これにより、メモリ増幅係数はほぼ22倍に達します。

例えば、細工された64 MBのペイロードを送り込むだけで、アプリケーションに約1.4 GBのメモリ割り当てを強制でき、適度にプロビジョニングされた環境でもメモリ不足(OOM)による強制終了が発生します。

注目すべき点は、この攻撃が入力サイズ制限の回避を必要としないことです。リクエストサイズの制限といった従来の緩和策は、増幅がデコード処理中に発生するため効果がありません。

標準的な4 MBのgRPCメッセージ上限が設けられていても、悪意あるリクエストを同時多発的に送信することでメモリを急速に枯渇させることができます。このため、高並行性サービス、ファイル取り込みパイプライン、または厳格なランタイムメモリ制御が存在しないシステムにおいて、この脆弱性は特に危険です。

脆弱なコードパスはMessage::decodedecode_from_sliceといったデフォルトのデコーディングAPIを通じて到達可能であり、悪用に特殊な条件は必要ありません。

buffaを使用して信頼されていないプロトコルバッファ入力を処理するサービスは、潜在的なリスクにさらされています。研究者が開発した概念実証(PoC)では、コンテナ環境でのOOMクラッシュが再現性高く実証され、256 MBという低いメモリ制限下でもプロセスが強制終了することが確認されました。

Anthropicはこの開示に迅速に対応し、研究者と連携して問題を検証するとともに、各種デプロイシナリオにおける影響を評価しました。

この脆弱性のCVSS v4.0スコアは6.3(中程度)ですが、研究者はシステムアーキテクチャ、並行性、リカバリメカニズムによっては実際の深刻度が中程度から重大レベルまで変動し得ると指摘しています。

監視が不十分な環境やシングルインスタンスのデプロイメントでは、繰り返しの悪用が持続的なクラッシュループと長期にわたるサービス停止につながる恐れがあります。

この問題はbuffaおよびconnectrpcバージョン0.8.0でパッチが適用されています。今回の修正により、メッセージごとに処理される未知フィールド数に設定可能な上限が導入され、メモリ増大を効果的に制限できるようになりました。

デフォルト設定では、この上限によりメッセージごとの割り当てオーバーヘッドが約40 MBに制限されます。すぐにアップグレードできない開発者は、preserve_unknown_fields=falseを指定してプロトコルバッファコードを再生成することをお勧めします。これにより、脆弱なコードパスを完全に無効化できます。

この脆弱性は、より広いセキュリティ上の教訓を示しています。メモリ安全性はリソース安全性と同義ではないということです。Rustのような言語においても、信頼されていないデータを処理する際に無制限の割り当てロジックが存在すれば、サービス拒否のリスクが生じ得ます。

また、この発見は、従来の静的解析では見落とされがちな複雑な多段階データフロー脆弱性の特定において、AIを活用したセキュリティツールの役割が高まっていることも示しています。

翻訳元: https://gbhackers.com/anthropic-buffa-library-zero-day/

ソース: gbhackers.com