[緊急速報] xmldomに高深刻度DoS脆弱性!Node.jsサーバー応答停止のリスクと対応策
はじめに:今回の脆弱性の概要
フロントエンド開発の現場でも、Node.jsはサーバーサイドレンダリング(SSR)やAPIルーティング(Next.js/Nuxt.jsなど)、あるいはビルドツールやBFF(Backend For Frontend)など、様々な形で活用されています。今回、Node.js環境で広く使われるXMLパースライブラリ「`xmldom`」(および旧パッケージ`xmldom`)において、高深刻度(High Severity)のサービス拒否(DoS)脆弱性(ID: GHSA-93r5-fhx6-vmg9 / CVE: CVE-2026-83614)が発見されました。この脆弱性により、不正に細工されたわずか数十KBのXMLドキュメントを処理するだけで、Node.jsアプリケーションのイベントループが数秒間完全に停止し、サーバー全体の応答が停止する恐れがあります。
なぜフロントエンドエンジニアがこの脆弱性を知るべきか?
「XMLなんて最近あまり使わないのでは?」と感じるかもしれません。しかし、XMLはAPI連携、WebHookのペイロード、旧来のシステムとのデータ交換など、依然として多くの場面で利用されています。もし皆さんの開発しているアプリケーションがNode.jsをサーバーサイドで利用しており、何らかの形で外部からXMLデータを受け付けている場合、この脆弱性の影響を受ける可能性があります。例えば、Next.jsのAPI Routesやサーバーコンポーネント、またはAWS LambdaなどのFaaS環境で動作するバックエンドロジックで`xmldom`が直接的、あるいは間接的な依存関係として使われているかもしれません。特に、認証を必要としない公開エンドポイントでXMLを処理している場合は、より高いリスクに晒されます。
技術的詳細:なぜ処理が極端に遅くなるのか?
この脆弱性は、主に以下の二つの異なるメカニズムによって発生し、どちらも入力サイズに対して処理時間が二乗で増加する(O(n²))という非効率な挙動を引き起こします。
1. **不正なタグ名の再スキャン (`parseElementStartPart`)**<br>XMLの開始タグを解析する際、例えば「`<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<...>`」のように連続する`<`文字と、その後に遠く離れた`>`が存在する不正な形式のXMLが入力されると、`xmldom`のエラー回復パスが起動します。この回復処理が、タグ名をスキャンするたびに入力文字列全体を再検証し直してしまうため、結果として処理回数が入力の長さに比例して増え、全体でO(n²)のパフォーマンス低下が発生します。
2. **隣接テキストノードの結合 (`normalize()`)**<br>DOMツリーを正規化する`document.normalize()`メソッドにも問題があります。DOMには隣接する複数のテキストノードを一つに結合する機能がありますが、もしK個のテキストノードが隣接して存在する場合、`xmldom`の実装では各ノードの結合処理で子ノードのインデックス再構築や文字列の再構築に非効率な時間がかかり、これがK回繰り返されることで全体でO(K²)の処理時間が発生します。この問題は、不正なXMLパース時に多数のテキストノードが生成されることで引き起こされるだけでなく、**JavaScriptコードから明示的にDOMツリーを構築し、多くの隣接テキストノードを作成した後に`normalize()`を呼び出すケースでも発生**します。この点には特に注意が必要です。
この脆弱性がもたらす影響
この脆弱性の最も直接的な影響は、アプリケーションの可用性への深刻な打撃です。わずか数十KB程度の小さなXMLでも、前述の処理遅延によってNode.jsのイベントループが数秒間、場合によってはそれ以上完全に停止してしまいます。これにより、その間に処理中の他のリクエストもすべて停止し、Webサーバーであればサービス拒否状態に陥ります。攻撃は認証を必要とせず、外部から巧妙に作られたXMLを送りつけるだけで可能なため、誰でも攻撃者になり得ます。幸いにも、この脆弱性はメモリ消費の異常な増加やデータ漏洩といった問題は引き起こしませんが、サービスの継続性にとって極めて危険な問題です。
対象バージョンと対応策
この脆弱性は、現在メンテナンスされている`@xmldom/xmldom`の全てのバージョン(`0.8.x`および`0.9.x`を含む)と、古い`xmldom`ライブラリの全バージョンに存在します。特に、`normalize()`に関する問題は、XMLパーサーを経由せずにプログラムでDOMを構築・正規化するアプリケーションでも発生するため、影響範囲は広範です。
この脆弱性を解決するための唯一かつ最善の方法は、**`xmldom`ライブラリを速やかにアップデートすること**です。修正版では、不正なタグ名スキャン処理が線形時間(O(n))で終了するように改善され、`normalize()`における隣接テキストノードの結合処理も効率化(O(K))されています。プロジェクトの依存関係を確認し、最新のセキュリティ修正が適用されたバージョンへ更新しましょう。
まとめ
今回ご紹介した`xmldom`のDoS脆弱性は、Node.jsベースのアプリケーションにおいてサービス停止という深刻な事態を引き起こす可能性があります。フロントエンドエンジニアの皆さんには、自身のプロジェクトが直接的・間接的に`xmldom`を利用していないか確認し、もし利用している場合は速やかにアップデートを実施することを強く推奨します。日頃から依存ライブラリのセキュリティ情報をチェックし、定期的なアップデートと脆弱性スキャンを行う習慣が、安全なアプリケーション開発には不可欠です。