[解説] brace-expansionの新たなDoS脆弱性 (CVE-2026-69152) とNode.jsプロセスへの影響
はじめに:brace-expansionとは何か、そしてなぜ関心を持つべきか
日本のフロントエンドエンジニアの皆さん、こんにちは!普段の業務で「brace-expansion」というライブラリを直接意識することは少ないかもしれません。しかし、このライブラリはnpmパッケージエコシステムにおいて、ファイルパスのパターンマッチング(globing)や設定ファイルの処理など、多くの人気ライブラリ(例: `glob`, `minimatch`など)の依存関係として広く利用されています。
今回、この`brace-expansion`ライブラリに、深刻なサービス拒否(DoS)につながる新たな脆弱性(GHSA-rgw5-rvv9-x895 / CVE-2026-69152)が発見されました。この脆弱性は、Node.jsプロセスをクラッシュさせたり、イベントループを長時間停止させたりする可能性があり、開発サーバー、ビルドプロセス、あるいはNode.jsベースのバックエンドサービスに影響を与える可能性があります。以前の緩和策(CVE-2026-14257)を迂回するものであるため、特に注意が必要です。
脆弱性の概要:なぜサービス拒否が発生するのか
`brace-expansion`ライブラリは、`{a,b,c}`や`{1..5}`のようなブレース展開(例: `{file1,file2}.txt` -> `file1.txt`, `file2.txt`)を処理するためのものです。このライブラリには、生成される文字列の合計文字数や要素数を制限するための`maxLength`という緩和策が`5.0.8`で導入されていました。しかし、この緩和策が不完全であったことが判明しました。
今回の脆弱性は、主に以下の2つの異なる経路を通じてサービス拒否を引き起こします。
`{a,b,c,...}`のようにカンマで区切られた複数の代替パターンがある場合、各代替パターンは独立して展開され、その結果が単一の`values`配列に結合されます。問題は、この中間的な`values`配列に`maxLength`の制限が適用されていなかったことです。
例えば、`maxLength`のデフォルト値が4,000,000文字、代替パターンが400個あるとします。この場合、`values`配列は最大で「400 * 4,000,000文字」にまで肥大化する可能性があり、Node.jsのヒープメモリを瞬時に使い果たしてプロセスをクラッシュさせます。**このクラッシュは`try/catch`ブロックでも捕捉できないため、アプリケーションは突然停止してしまいます。**
`{0...01..100000}`のような、ゼロパディングされた数値シーケンスを展開する際にも問題があります。この`expandSequence()`関数は、生成される要素数には`max`で制限がかかっていたものの、各要素の文字数に対する`maxLength`を考慮していませんでした。
例えば、非常に長いパディング(例: 400,000文字のパディング)を含むシーケンスの場合、`combine()`関数で最終的に切り捨てられる少数の結果のために、非常に多くの文字列が生成されます。このプロセスはV8のConsString最適化によりメモリを過剰に消費しませんが、**数分間にわたってCPUをブロックし続け、Node.jsのイベントループを停止させてしまいます。**これにより、サーバーが一切のリクエストに応答できなくなる深刻な状況に陥ります。
影響範囲:あなたのアプリケーションは安全ですか?
この脆弱性の影響は非常に広範に及びます。特に以下のようなケースで影響を受ける可能性があります。
「もし、皆さんのアプリケーションが、外部からの入力(例: ユーザーがアップロードするファイルパス、APIリクエストのパラメータなど)を、`brace-expansion`を直接的または間接的に利用するライブラリ(`glob`, `minimatch`など)に渡している場合、攻撃者によってサービス拒否攻撃を受ける可能性があります。Node.jsで動作するCI/CDツール、開発サーバー、Node.jsベースのバックエンドAPIなどが該当するでしょう。」
`brace-expansion`のバージョン`5.0.8`でもこの脆弱性は存在するため、すでに以前のDoS緩和策が適用されている環境でも、依然として危険にさらされています。
対策:今すぐできること
最も効果的な対策は、`brace-expansion`を修正済みのバージョンにアップデートすることです。今回の修正では、中間配列が生成される際にも`max`と`maxLength`の制限が適用されるようになりました。
`brace-expansion`は多くの依存関係の奥底に存在することが多いため、直接`npm install brace-expansion@latest`を行うのではなく、プロジェクト全体の依存関係を更新することをお勧めします。
例えば、`npm update`や`yarn upgrade`コマンドを使用して、プロジェクトの依存関係を最新の状態に保つようにしましょう。`package-lock.json`や`yarn.lock`を更新し、セキュアなバージョンが確実に使用されるようにしてください。
すぐにアップデートが難しい場合、以下の回避策を検討してください。
まとめ
今回の`brace-expansion`のDoS脆弱性は、Node.jsプロセスを不安定にする可能性のある深刻な問題です。フロントエンド開発者は、開発環境やビルドプロセスでこれらのライブラリが使用されていることを認識し、自身のプロジェクトが影響を受けていないか確認し、速やかに適切な対策を講じることが重要です necessitate.
常に依存関係を最新の状態に保ち、セキュリティ情報をチェックする習慣をつけましょう。安全な開発環境を維持するために、この記事が皆さんの助けになれば幸いです。