[解説] `xmldom`ライブラリにおける深刻なサービス停止脆弱性(GHSA-2v35-w6hq-6mfw)と対策
はじめに:普段使いのXMLパーサーに潜む危険
JavaScript環境でXMLドキュメントをパース・操作するために広く利用されているライブラリ`xmldom`に、深刻度「High」の脆弱性(GHSA-2v35-w6hq-6mfw / CVE-2026-41673)が発見されました。この脆弱性を悪用されると、サービス全体が停止する恐れがあります。フロントエンドエンジニアの皆さんも、ビルドツールやNode.jsベースのバックエンドAPI、Web Workerなどで`xmldom`を間接的・直接的に利用している可能性があるため、その仕組みと対策を理解することが重要です。
一体何が問題なのか? 脆弱性の概要と仕組み
`xmldom`ライブラリは、XMLドキュメントツリーを操作する際に再帰的な関数を使用しています。ご存知の通り、JavaScriptエンジンのコールスタックには上限があり、この上限を超える深い再帰呼び出しが発生すると、`RangeError: Maximum call stack size exceeded`というエラーが発生し、アプリケーションがクラッシュしてしまいます。
今回の脆弱性は、攻撃者が作成した「非常に深くネストされたXML」を`xmldom`で処理しようとした際に、このコールスタックオーバーフローが意図せず発生することに起因します。XML自体のパースは成功しますが、その後のDOM操作の段階で問題が顕在化します。
特に以下の7つのDOM操作が影響を受けることが確認されています。
<ul><li>`Node.prototype.normalize()`</li><li>`XMLSerializer.serializeToString()`</li><li>`Element.getElementsByTagName()` / `getElementsByTagNameNS()` / `getElementsByClassName()` / `getElementById()`</li><li>`Node.cloneNode(true)`</li><li>`Document.importNode(node, true)`</li><li>`node.textContent` (getter)</li><li>`Node.isEqualNode(other)`</li></ul>
Node.js 18環境では、約5,000〜10,000レベルのネストでクラッシュが確認されています。`xmldom`は純粋なJavaScript実装であるため、ブラウザ環境で`xmldom`をバンドルして使用した場合でも、同様にクラッシュするリスクがあります。例えば、Web Worker内でXMLを処理しているようなケースでは、Workerプロセスが停止し、アプリケーションの機能が損なわれる可能性があります。
どのような影響を受けるのか? 攻撃シナリオ
この脆弱性の最も深刻な影響は、サービス停止(Denial of Service, DoS)攻撃に利用される可能性がある点です。攻撃者は、認証を必要とせず、また特別なオプションや無効なXMLを用いることなく、ただ有効かつ深くネストされたXMLドキュメントを対象のサービスに送信するだけで、アプリケーションを強制的に停止させることが可能です。
具体的な影響範囲は、`xmldom`がどこで利用されているかによって異なりますが、一般的には以下のシナリオが考えられます。
<ul><li><b>Node.jsベースのバックエンドAPI:</b> XMLデータを受け付けて処理するAPIが攻撃を受けると、そのAPIをホストするNode.jsプロセス全体が停止し、サービス全体の可用性が損なわれる恐れがあります。</li><li><b>フロントエンド(ブラウザ環境)での利用:</b> Web WorkerなどでユーザーがアップロードしたXMLや、外部から取得したXMLを`xmldom`で処理している場合、クラッシュによりそのWorkerやアプリケーションの一部が機能不全に陥る可能性があります。</li><li><b>ビルドツールやCI/CD環境:</b> ビルドプロセスやテスト中にXMLを処理するツールが`xmldom`に依存している場合、悪意のあるXMLが混入することでビルドが失敗するなどの影響も考えられます。</li></ul>
ユーザー入力や外部システムからのXMLデータを受け入れるサービスは、特に注意が必要です。
いますぐ取るべき対策:迅速なアップデートを!
この脆弱性に対処するための最も効果的かつ推奨される方法は、`xmldom`ライブラリを<b>修正済みのバージョンに直ちにアップデートする</b>ことです。
修正では、影響を受ける全てのDOM走査処理が、再帰的な実装から、明示的なスタック(ヒープメモリを使用)を用いた反復的な実装に変換されました。これにより、深いXMLツリーでもコールスタックを使い果たすことなく処理できるようになり、`RangeError`によるクラッシュを防ぐことができます。
ご自身のプロジェクトで`xmldom`を直接、または間接的な依存関係として利用しているかどうかを確認し、最新バージョンへの更新を強く推奨します。`package.json`を確認し、`npm audit`や`yarn audit`などのコマンドを実行して、脆弱性がないかチェックしましょう。
脆弱性が修正されたバージョンに関する具体的な情報は、`xmldom`の公式リポジトリやリリースノートで確認してください。
まとめ
オープンソースライブラリは開発を加速させますが、同時に潜在的なリスクも伴います。今回の`xmldom`の脆弱性は、深くネストされたデータ構造の処理において、基本的なJavaScriptエンジンの制約がいかに大きな影響を及ぼすかを示しています。
この情報を参考に、ご自身のプロジェクトの依存関係を見直し、セキュリティアップデートを怠らないよう心がけましょう。常に最新のセキュリティ情報にアンテナを張り、迅速な対応をすることが、安全なサービス提供への第一歩となります。