Modern Frontend CVEs

対象CVE: CVE-2026-83606

[解説] @xmldom/xmldomのReDoS脆弱性 (CVE-2026-83606) とNode.jsへの影響

Node.js環境でXMLを扱う際に広く利用される`@xmldom/xmldom`ライブラリにReDoS脆弱性が発見されました。これにより、特定の悪意あるXMLデータをパースすると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アプリケーションがこの脆弱性の影響を受けないよう、速やかにライブラリのバージョンアップを実施してください。また、日頃から利用しているパッケージのセキュリティ情報をチェックし、定期的なアップデートを心がけることが、安全なシステム運用の鍵となります。

← ブログ一覧に戻る