[解説] @xmldom/xmldomに潜むReDoS脆弱性(GHSA-x4fp-j954-r2f4)とその対策
はじめに:@xmldom/xmldomのReDoS脆弱性とは?
日本のフロントエンドエンジニアの皆さん、こんにちは!Node.js環境でXMLを扱う際に、`@xmldom/xmldom`ライブラリを利用している方も多いのではないでしょうか。今回は、この`@xmldom/xmldom`の特定のバージョンで発見された、**GHSA-x4fp-j954-r2f4(CVE-2026-83619)**として識別されている高深刻度の脆弱性について解説します。
この脆弱性は、「ReDoS(Regular expression Denial of Service)」と呼ばれるもので、悪意のあるXMLデータが正規表現の処理を極端に遅くさせ、結果としてNode.jsサーバーのイベントループを長時間ブロックし、サービス全体を停止させる可能性があります。
脆弱性の概要と仕組み
`@xmldom/xmldom`ライブラリの`0.8.x`系(および一部`0.7.x`系)に存在するReDoS脆弱性は、XMLの終了タグをパースする際に問題が発生します。具体的には、`</タグ名 長い空白文字...X>`のように、タグ名の後に非常に長い空白文字が続き、その後に何らかの非空白文字が続く形式のXMLに対して、ライブラリ内部で使用されている正規表現が非効率な処理を行ってしまうことに起因します。
この特殊な入力パターンに対して、正規表現の処理時間が入力された空白文字の長さに応じて二次関数的に(非常に急激に)増加します。これにより、Node.jsのノンブロッキングI/Oという特性にもかかわらず、イベントループが長時間にわたってブロックされ、アプリケーションが他のリクエストに応答できなくなります。結果として、システム全体が応答不能な状態に陥り、サービス停止という最悪のシナリオを引き起こす可能性があります。
影響を受ける条件とバージョン
このReDoS脆弱性の影響を受けるのは、`@xmldom/xmldom`パッケージの以下のバージョンを使用している場合です。
特に、**`0.7.0`から`0.8.14`までの`0.8.x`系**が主要な影響範囲となります。`DOMParser.parseFromString`メソッドをデフォルトオプションで使用している場合に発生し、認証されていない状態でも、悪意のあるXMLデータを送信されるだけで攻撃が成立するリスクがあります。
一方で、**`0.9.x`系はこの脆弱性の影響を受けません**。また、`@xmldom`というスコープがついていない古い`xmldom`パッケージ(例: npmで`xmldom`と検索して出てくる`0.6.0`のようなバージョン)も影響を受けませんのでご安心ください。影響があるのは、`@xmldom/xmldom`という名前のパッケージの特定のバージョンである点を改めてご確認ください。
具体的な影響とリスク
この脆弱性の具体的な影響として、悪意を持って作成されたわずかなサイズのXMLドキュメント一つをパースするだけで、Node.jsサーバーが数秒から数十秒、あるいはそれ以上完全に停止する可能性があります。イベントループがブロックされている間は、他のすべての処理(HTTPリクエストの処理、データベース操作、非同期タスクなど)が停止するため、ユーザーからのリクエストに応答できなくなり、サービスが麻痺してしまいます。
メモリが急激に消費されたり、データが外部に漏洩したりする直接的なリスクはありませんが、システムの可用性(Availability)に壊滅的な影響を与えます。特に、外部の信頼できないソースからXMLデータを受け取って処理しているウェブサービスやAPIなどは、注意が必要です。例えば、サードパーティからのWebhookでXMLを受け取るシステムや、ユーザーがXMLファイルをアップロードできる機能を持つサービスなどが該当します。
推奨される対応策
`@xmldom/xmldom`ライブラリを使用している場合は、**直ちに最新の修正済みバージョンにアップデート**することを強く推奨します。
具体的な対策としては、以下のいずれかを検討してください。
<ul><li>`0.8.x`系を利用している場合は、修正パッチが適用されたバージョン(例: `0.8.15`以降、またはLTS版の最新)へのアップデートを検討してください。</li><li>`0.9.x`系への移行も有効な対策ですが、`0.9.x`系は一部APIに変更がある可能性があるため、互換性の確認とテストが必要になる場合があります。</li></ul>
また、脆弱性対策とは直接関係ありませんが、不明なXMLデータを処理する際には、セキュリティベストプラクティスとして、パースする前にXMLのサイズに上限を設けるなど、入力検証を強化することも併せて検討することをお勧めします。これにより、ReDoS以外のXML爆弾攻撃など、様々なDoS攻撃のリスクを軽減できます。
まとめ
`@xmldom/xmldom`のReDoS脆弱性は、Node.jsベースのアプリケーションにとって深刻なサービス停止リスクをもたらします。自身のプロジェクトが影響を受けるバージョンを使用していないか確認し、もし該当する場合は速やかにアップデートを行い、安全な環境を確保してください。継続的なライブラリの依存関係管理とセキュリティアップデートの適用が、安定したサービス運用には不可欠です。