[緊急解説] js-yamlのCPU枯渇脆弱性 (CVE-2026-84375) に備える
はじめに:なぜフロントエンドエンジニアも注目すべきか?
普段、JavaScriptのフロントエンド開発を行っている皆さんにとって、「YAMLパーサーの脆弱性」と聞くと、直接的な関係が薄いと感じるかもしれません。しかし、現在のフロントエンド開発はWebpack、Vite、Rollupなどのビルドツール、Lintツール、CI/CDパイプライン、Node.jsで構築されたBFF(Backend For Frontend)など、Node.jsエコシステムに深く依存しています。
これらのツールやサービスが設定ファイルやデータフォーマットとしてYAMLを利用している場合、`js-yaml`が内部的に使用されている可能性があります。この脆弱性が悪用されると、開発環境のビルドプロセスが停止したり、BFFが応答不能になったりするリスクがあり、開発・運用に大きな影響を及ぼす可能性があります。今回は、この深刻度Highの脆弱性(GHSA-2883-xcg3-v3hh / CVE-2026-84375)について深掘りし、対策を講じるための情報を提供します。
脆弱性の概要:`maxTotalMergeKeys`の落とし穴
この脆弱性は、`js-yaml`ライブラリにおけるYAMLマージ処理の効率的な設計上の欠陥に起因します。`js-yaml`には、悪意のある大量のキーを持つYAMLドキュメントによるCPU枯渇を防ぐため、`maxTotalMergeKeys`というオプションでマージされるキーの総数を制限する仕組みがあります。しかし、この制限メカニズムが「空のマッピング(`{}`)」を正しくカウントしないという問題がありました。
攻撃者は、この盲点を利用して、`maxTotalMergeKeys`の制限に達することなく、大量の空のマッピングを繰り返しマージさせることで、`js-yaml`がYAMLをパースする際のCPU使用率を異常に高めることが可能になります。結果として、サービス拒否(DoS)状態に陥るリスクが生じます。
脆弱性のメカニズムを深掘り:O(N*K)の処理負荷
具体的な攻撃のメカニズムを見ていきましょう。YAMLには、アンカー(`&`)とエイリアス(`*`)という機能があります。これにより、共通のデータ構造を一度定義し、複数の場所で再利用できます。この脆弱性では、このアンカーとエイリアスが巧妙に利用されます。
攻撃者はまず、多数の空のマッピング `{}` を含む配列をアンカーとして定義します。例えば、`arr: &arr [{}, {}, {}, ...]` のように、`N`個の空マッピングを持つ配列です。次に、このアンカーを複数回マージ(`<<: *arr`)させます。これを`K`回繰り返すことで、以下のようになります。
`js-yaml`がこのYAMLドキュメントをパースする際、`targets`の各要素を処理するために、`arr`内の`N`個の要素を繰り返し走査します。この処理が`K`回行われるため、結果として`O(N * K)`という指数関数的な計算量が発生します。しかし、`maxTotalMergeKeys`は「空のマッピング」をカウントしないため、この膨大な処理量にもかかわらず、設定された制限値に達することがありません。
提供されたPoCでは、以下のような結果が示されています。
| N (空マッピング数) | YAMLサイズ | 処理時間 |
|---:|---:|---:|
| 800 | ~13 KB | ~20 ms |
| 3200 | ~50 KB | ~180 ms |
| 20000 | ~500 KB | ~13 s |
わずか500KB程度のYAMLドキュメントで、13秒もの処理時間がかかっていることがわかります。これは、サーバーやビルド環境のリソースを容易に枯渇させることが可能です。
対策と予防策
この脆弱性に対する最も効果的な対策は、使用している`js-yaml`ライブラリを修正版にアップデートすることです。
脆弱性情報によると、修正は「各マージソースマッピングを、そのキーをカウントするのに加えて、1つの予算単位としてカウントする」という形で実装されます。これにより、空のマッピングであっても`maxTotalMergeKeys`によって適切に制限されるようになります。
**🚨 重要な注意点**: `js-yaml`の`v3`および`v4`では、YAMLマージ機能がデフォルトで有効になっています。そのため、これらのバージョンを使用している場合は、より高い深刻度でこの脆弱性の影響を受けます。修正済みの最新バージョンへの速やかなアップグレードが推奨されます。
プロジェクトの`package.json`を確認し、`js-yaml`が直接的または間接的に依存関係に含まれている場合は、以下のコマンドなどで最新の修正済みバージョンに更新してください。
```bash npm update js-yaml # または yarn upgrade js-yaml ```
ユーザー入力や外部システムから受け取るYAMLドキュメントをパースする際は、常に検証とサニタイズを徹底してください。今回の脆弱性のように、一見無害に見える入力が深刻な問題を引き起こす可能性があります。
一般的なDoS対策として、Node.jsアプリケーションでは以下のような対策も検討してください。
まとめ
`js-yaml`のCPU枯渇脆弱性(CVE-2026-84375)は、比較的小さな悪意のあるYAMLドキュメントによって、サーバーやビルド環境のCPUを長時間消費させ、サービス停止につながる深刻な問題です。フロントエンドエンジニアの皆さんも、利用しているツールチェーンやバックエンドサービスがこの脆弱性の影響を受けないか、早急に確認し、`js-yaml`を最新の修正済みバージョンにアップデートすることが不可欠です。
日頃から利用しているライブラリのセキュリティ情報を常にチェックし、迅速な対応を心がけることが、安全な開発とサービス運用への第一歩となります。