[解説] @xmldom/xmldomのReDoS脆弱性 (CVE-2026-83606) とNode.jsへの影響
はじめに:フロントエンドエンジニアとXML、そしてNode.js
ウェブ開発において、フロントエンドエンジニアが直接XMLをパースする機会は以前に比べて減っているかもしれません。しかし、Node.js製のBFF(Backend for Frontend)やマイクロサービス、APIゲートウェイなどを構築・運用している場合、Webhooks、SOAP/SAMLベースのAPI、または古いシステムとの連携などで、サーバーサイドでXMLデータを扱うことは依然としてあります。
今回ご紹介する脆弱性は、そのようなNode.js環境でXMLを扱う際に広く利用されている`@xmldom/xmldom`ライブラリに関するものです。この脆弱性は、サーバーを一時的に応答不能に陥れる「サービス運用妨害(Denial of Service; DoS)」を引き起こす可能性があり、速やかな対応が求められます。
脆弱性の概要とGHSA/CVE情報
この脆弱性は、`@xmldom/xmldom`ライブラリに存在する「ReDoS(Regular expression Denial of Service)」攻撃の一種です。深刻度は「High」と評価されており、以下のIDで公開されています。
GHSA-ID: `GHSA-g53g-w8rj-fmg7`
CVE-ID: `CVE-2026-83606`
具体的には、攻撃者が巧妙に作成した特定のXML文書を`@xmldom/xmldom`でパースさせると、正規表現エンジンの処理が極端に遅くなり、Node.jsのイベントループがブロックされます。これにより、サーバーが応答を停止し、結果的にサービスが利用できなくなる状態に陥ります。データの漏洩や改ざんのリスクはなく、サービスの可用性にのみ影響します。
詳細解説:ReDoS(Regular expression Denial of Service)とは?
ReDoSとは、正規表現の処理に内在する問題を利用したDoS攻撃の一種です。特定の構造を持つ入力文字列が正規表現エンジンに与えられると、バックトラックなどの処理が指数関数的、または多項式的に増大し、マッチングに要する時間が異常に長くなることがあります。
今回の`@xmldom/xmldom`のケースでは、閉じられていない「処理命令(Processing Instruction; PI)」というXML要素と大量の空白文字を含むXML文書がターゲットとなります。この悪意あるXML文書を`DOMParser.parseFromString`でパースしようとすると、内部の正規表現処理が入力の長さの二乗(O(N²))に比例して計算時間が増大します。
例えば、入力が10倍になると処理時間は100倍になり、ごく短い時間で処理されるはずのXMLパースが、数秒から数十秒、あるいはそれ以上に及ぶ可能性があります。
Node.jsのイベントループへの影響
Node.jsは、そのパフォーマンスの高さから多くのWebアプリケーションで利用されていますが、その根幹にはシングルスレッドで動作する「イベントループ」があります。イベントループは非同期処理を効率的に管理することで、高いスループットを実現しています。
しかし、今回のReDoS攻撃のように、イベントループをブロックするような長時間かかる同期処理が発生すると、Node.jsは他のリクエストやタスクを処理できなくなります。つまり、サーバー全体が応答不能な状態に陥り、他のユーザーからのリクエストも処理されなくなってしまうのです。
影響を受けるバージョンとシステム
この脆弱性の影響を受けるのは、`@xmldom/xmldom`ライブラリの以下のバージョンです:
`v0.9.0-beta.9` から `v0.9.10` まで
特に、以下の条件に合致する場合、影響を受けやすいと考えられます:
1. `DOMParser.parseFromString` メソッドをデフォルトオプションで使用している。
2. Webhooks、XML API、SOAP/SAMLサービスなどを通じて、ネットワーク経由で信頼できないソースからのXMLデータを受け取り、それをパースしている。
なお、`@xmldom/xmldom`の`0.8.x`系や、古い`xmldom`パッケージ(`@xmldom/xmldom`とは別のパッケージ)は、異なるXMLパースロジックを使用しているため、この特定のReDoS脆弱性の影響は受けません。
今すぐ取るべき対策:速やかなアップデートを!
この脆弱性に対処するための最も重要かつ推奨される対策は、`@xmldom/xmldom`ライブラリを速やかにアップデートすることです。
**`@xmldom/xmldom`をバージョン0.9.11以降にアップデートしてください。**
バージョン0.9.11では、正規表現が修正され、悪意ある入力パターンに対しても計算時間が不必要に増大しないようになっています。
アップデートは、プロジェクトのパッケージマネージャーを使用して簡単に行えます。例えば、npmを使用している場合は以下のコマンドを実行します。
`npm update @xmldom/xmldom`
または、yarnを使用している場合は、
`yarn upgrade @xmldom/xmldom`
プロジェクトの依存関係ツリーを確認し、間接的な依存関係として`@xmldom/xmldom`が使用されていないかも念のため確認してください。`npm ls @xmldom/xmldom`や`yarn why @xmldom/xmldom`コマンドが役立ちます。
まとめ
今回の`@xmldom/xmldom`のReDoS脆弱性は、Node.jsベースのアプリケーションにおいて、外部からの入力処理がサービス可用性に大きな影響を与えうることを改めて示しています。特に、XMLのような複雑な構造を持つデータを扱う際には、パースライブラリのセキュリティに細心の注意を払う必要があります。
フロントエンドエンジニアの皆さんも、ご自身の開発するNode.jsアプリケーションがこの脆弱性の影響を受けないよう、速やかにライブラリのバージョンアップを実施してください。また、日頃から利用しているパッケージのセキュリティ情報をチェックし、定期的なアップデートを心がけることが、安全なシステム運用の鍵となります。