[緊急] xmldomのXMLインジェクション脆弱性(CVE-2026-41672)とフロントエンドエンジニアが取るべき対策
はじめに:xmldomと今回の脆弱性について
日本のフロントエンドエンジニアの皆さん、こんにちは。今回は、JavaScript環境でXMLドキュメントをパース・シリアライズするために広く利用されているライブラリ「xmldom」に発見された、深刻な脆弱性について解説します。
CVE-2026-41672 (GHSA-j759-j44w-7fr8) は、xmldomがXMLコメントを不適切に処理することで、悪意のあるXML要素が挿入され、XMLの構造が改ざんされる可能性のある「XMLインジェクション」に分類される脆弱性です。この脆弱性は深刻度Highと評価されており、迅速な対応が求められます。
「フロントエンドでXMLを直接扱う機会は少ないのでは?」と感じる方もいるかもしれません。しかし、ビルドツール、特定のバックエンドサービスとの連携、または何らかのシステムで間接的にxmldomに依存しているケースも考えられます。この機会に依存関係を確認し、対策を講じることが重要です。
脆弱性のメカニズム:なぜXMLが改ざんされるのか?
この脆弱性は、xmldomの `createComment()` 関数でXMLコメントを作成し、その後 `XMLSerializer.serializeToString()` でXMLを文字列化するプロセスで発生します。
具体的には、`createComment()` でXMLコメントを作成する際、コメント内容として入力された文字列が、コメントデータとしてそのまま保存されます。問題は、このコメントデータがXMLとしてシリアライズされる際に、コメントを終了させる特殊な文字列(`-->` など)が適切に検証・無害化されない点にあります。
もし攻撃者が `createComment()` に `--><悪意のある要素/><!--` のような文字列をコメント内容として挿入するとどうなるでしょうか? シリアライズ時に、本来コメントとして扱われるべき部分が途中の `-->` で強制的に終了してしまい、その後ろに続く `<悪意のある要素/>` が「生きたXML要素」としてパースされてしまいます。これにより、本来コメントとして無視されるべき内容が、予期せずXMLドキュメントの構造を変更してしまうのです。
あなたのプロジェクトは影響を受ける?
この脆弱性の影響を受けるのは、主に以下の条件を満たすアプリケーションです。
1. `@xmldom/xmldom` ライブラリを使用している。
2. ユーザーからの入力など「信頼できないデータ」を元にXMLドキュメントを生成し、その中にコメントノードを含めている。
3. 生成したXMLドキュメントを `XMLSerializer.serializeToString()` で文字列としてシリアライズしている。
XMLの構造が重要な意味を持つ設定ファイル、ポリシー文書、または他のシステムに渡すメッセージ形式などでこれを行っている場合、深刻な問題となる可能性があります。攻撃者はXMLの構造を改ざんすることで、情報漏洩、不正な設定変更、または他の脆弱性を引き起こす可能性があります。
必須の対応策:コード監査とオプション設定
この脆弱性に対する修正は、残念ながら自動的には適用されず、「オプトイン」形式となっています。既存のコードは脆弱なままですので、以下の対応を速やかに行ってください。
1. **ライブラリのアップデート**: `@xmldom/xmldom` を最新バージョンにアップデートしてください。少なくともLTS版の `0.8.13` 以上、推奨は `0.9.10` 以上です。
2. **`serializeToString()` のオプション設定**: `XMLSerializer.serializeToString()` を呼び出す際、第二引数に `{ requireWellFormed: true }` オプションを明示的に渡すようにコードを変更してください。このオプションを有効にすると、不正な形式のXMLを生成するコメントデータが含まれている場合に `InvalidStateError` がスローされ、インジェクションを防ぐことができます。
**例:** `new XMLSerializer().serializeToString(doc, { requireWellFormed: true });`
**注意点**: W3Cの仕様上、この `requireWellFormed` フラグのデフォルトは `false` であり、主要なブラウザの実装も同様のため、ライブラリ側でデフォルトを強制的に変更することは避けられています。そのため、開発者自身が明示的にこのオプションを設定することが必須となります。
3. **コード監査**: `createComment()` を使ってコメントを作成している箇所や、信頼できない入力でコメントノードの内容(`appendData`, `insertData`, `replaceData`, `.data =`, `.textContent =` など)を操作しているすべての箇所を特定してください。そして、関連する `serializeToString()` 呼び出しに上記のオプションが確実に適用されていることを確認してください。コメントノードの作成時には不正なデータのチェックが行われないため、シリアライズ時に確実にオプションを適用することが重要です。
まとめ
今回のxmldomの脆弱性は、XMLコメントの処理における見落としが、深刻なXMLインジェクションに繋がることを示しています。特に、脆弱性への対応が「オプトイン」形式であるため、ライブラリをアップデートしただけでは不十分であり、コードの修正が必須です。
日頃から利用しているライブラリの脆弱性情報にアンテナを張り、迅速かつ適切な対応を心がけることが、セキュアなアプリケーション開発には不可欠です。この解説が皆さんのプロジェクトのセキュリティ強化の一助となれば幸いです。