[高深刻度] xmldomのXMLインジェクション脆弱性 (GHSA-x6wf-f3px-wcqx) と対策
脆弱性の概要 (GHSA-x6wf-f3px-wcqx / CVE-2026-41675)
皆さんのプロジェクトでXMLのパースや生成に`@xmldom/xmldom`ライブラリを使用していますか? この度、このライブラリにXMLドキュメントをシリアライズする際の「処理命令 (Processing Instruction; PI)」の扱いに、高深刻度な脆弱性 (GHSA-x6wf-f3px-wcqx) が発見されました。この脆弱性を悪用されると、意図しないXML要素がドキュメントに注入される「XMLインジェクション」が発生する可能性があります。
具体的には、`createProcessingInstruction(target, data)`メソッドでPIを作成する際、`data`引数に渡された文字列が一切検証されずにノードに格納されます。その後、XMLドキュメントをシリアライズする際に、この`data`文字列にPIの終了シーケンスである`?>`が含まれていた場合、シリアライザがそれをエスケープせずにそのまま出力してしまいます。これにより、XMLパーサーはPIが途中で終了したと誤認識し、`?>`以降の文字列を「有効なXMLマークアップ」として解釈してしまうのです。結果として、攻撃者は任意のXML要素を文書内に注入できるようになります。これは、以前に修正されたCDATAセクションでのXMLインジェクション脆弱性(GHSA-wh4c-j3r5-mjhp)と類似した問題です。
あなたのアプリケーションへの影響
この脆弱性が悪用された場合、攻撃者はアプリケーションが生成するXMLドキュメントの構造を自由に改ざんできるようになります。例えば、Node.jsのバックエンドで、設定ファイル、APIレスポンス、レポート、メッセージ形式などのXMLドキュメントを生成しており、それが下流のシステムによって信頼されて処理されるようなシナリオを想像してみてください。攻撃者は、意図しない要素を挿入したり、既存の要素を改変したりすることで、システムの動作に影響を及ぼし、最悪の場合、セキュリティポリシーのバイパス、データの破壊、サービス拒否などに繋がる可能性があります。
今すぐ取るべき対策
この脆弱性への対策は、大きく分けて2つのステップで構成されます。
まず、脆弱性が修正されたバージョンにライブラリをアップデートしてください。具体的には、`@xmldom/xmldom` をバージョン **0.9.10 以降**(LTS版の場合は **0.8.13 以降**)に更新する必要があります。
プロジェクトのpackage.jsonを更新後、以下のコマンドでアップデートできます。 `npm update @xmldom/xmldom` または `yarn upgrade @xmldom/xmldom`
ライブラリのアップデートだけでは、この修正は自動的に適用されません。XMLドキュメントをシリアライズする際、`XMLSerializer.serializeToString()` メソッドの第2引数に、**`{ requireWellFormed: true }` オプションを明示的に渡す必要があります。**
以下のようにコードを修正してください。 ```javascript const { XMLSerializer } = require('@xmldom/xmldom'); // ... doc の構築(DOMオブジェクト) ... const safeXml = new XMLSerializer().serializeToString(doc, { requireWellFormed: true }); ``` このオプションを有効にすると、PIのデータに不正な`?>`シーケンスが含まれていた場合、XMLシリアライズ前に`InvalidStateError`がスローされ、不正なXMLの生成が防止されます。このチェックは、`createProcessingInstruction`でPIを作成した時だけでなく、後から`.data =`などを使ってPIのデータが変更された場合にも適用されます。
なぜ`requireWellFormed: true`がデフォルトではないのか?
`XMLSerializer.serializeToString()` のデフォルト動作は、W3CのDOM仕様に準拠しており、`requireWellFormed: false`の場合は`?>`を含むPIデータをそのまま出力することが許可されています。そのため、後方互換性維持の観点から、`{ requireWellFormed: true }`オプションを明示的に指定しない限り、デフォルトでは脆弱な状態が維持されることになります。`createProcessingInstruction`メソッド自体は、依然としてPI作成時に`data`を検証しません。したがって、**`{ requireWellFormed: true }`オプションをシリアライズ時に必ず適用する**ことが、現在の最善策となります。
まとめ
このxmldomの脆弱性は高深刻度であり、XMLを用いるアプリケーションにとって重大なリスクとなります。しかし、ライブラリのバージョンアップと`{ requireWellFormed: true }`オプションの適用という、シンプルな2ステップでこの脅威からシステムを防御することが可能です。
自身のプロジェクトで`@xmldom/xmldom`を使用しているか、またXMLシリアライズを行っている箇所がないか、今一度コードベースを確認し、速やかに対応を完了することをお勧めします。セキュリティ意識を高め、安全なWebアプリケーション開発を心がけましょう。