Modern Frontend CVEs

対象CVE: CVE-2026-41674

[重要] xmldomライブラリのXMLインジェクション脆弱性 (CVE-2026-41674) - フロントエンド開発者が知るべき対応策

`xmldom`ライブラリを使用してXMLを生成する際、ユーザー入力に起因するXMLインジェクションの脆弱性が発見されました。意図しないXML要素の挿入やXXE攻撃につながるリスクがあるため、早急な対応が求められます。

はじめに:`xmldom`ライブラリの潜在的リスク

フロントエンド開発の現場では、直接XMLを扱う機会は少ないかもしれません。しかし、WebRTCのSDP(Session Description Protocol)やSAML認証、あるいは一部のAPI連携など、バックグラウンドでXMLが利用されるケースは存在します。今回ご紹介するのは、JavaScriptでXMLを操作するための人気ライブラリ`xmldom`に発見された、深刻度「High」のXMLインジェクション脆弱性(CVE-2026-41674 / GHSA-f6ww-3ggp-fr8h)です。本脆弱性は、安全でないXML生成によって、システムに重大な影響を及ぼす可能性があります。

脆弱性の概要:`DocumentType`ノードを狙ったインジェクション

この脆弱性は、`xmldom`ライブラリを使って新しいXMLドキュメントをプログラム的に生成し、特に`DOMImplementation.createDocumentType`メソッドで`DocumentType`ノードを作成し、それを`XMLSerializer.serializeToString`で文字列にシリアライズする際に発生します。問題は、`DocumentType`ノードの`publicId`、`systemId`、`internalSubset`という3つのフィールドに設定された文字列が、適切にエスケープや検証が行われずにXML出力に挿入されてしまう点にあります。これにより、悪意のあるユーザー入力がこれらのフィールドに含まれていた場合、DOCTYPE宣言が途中で閉じられたり、宣言の外部に任意のXMLマークアップが挿入されたりする「XMLインジェクション」が可能になります。

具体的な攻撃シナリオ

脆弱性の悪用は、主に以下の3つのフィールドを通じて行われます。

**1. `internalSubset`インジェクション**

`internalSubset`フィールドに`]>`のような文字列が含まれると、DOCTYPE宣言が途中で強制的に閉じられます。その結果、`]]>`に続く攻撃者が指定した任意のXML要素が、正規のDOCTYPE宣言の外部に挿入されてしまいます。

**2. `publicId`インジェクション**

`publicId`フィールドは、XML出力時に引用符なしで出力される特性があります。このフィールドに`" SYSTEM "evil"`のような巧妙な文字列が挿入されると、本来の引用符の構造が破壊され、攻撃者が偽の`SYSTEM`エンティティをDOCTYPE宣言内に注入することが可能になります。

**3. `systemId`インジェクション**

`systemId`フィールドに`>`のような文字が含まれていると、DOCTYPE宣言が早期に終了させられます。これにより、その後に続く攻撃者が指定したXML要素が、まるで正当なXMLの一部であるかのように挿入されてしまいます。

もたらされるリスク:なぜ危険なのか?

この脆弱性が悪用されると、攻撃者は生成されるXMLの構造を不正に操作できます。これにより、以下のような深刻なリスクが発生する可能性があります。

* **意図しないXML要素の挿入**: Webサイトの表示を改ざんしたり、予期せぬ機能を発動させたりする可能性があります。

* **XMLファイルの破損**: 生成されるXMLが不正な形式となり、それを処理するアプリケーションがエラーを起こす可能性があります。

* **XXE (XML External Entity) 攻撃**: 最も危険なリスクの一つです。特に、生成されたXMLを処理するバックエンドシステムが外部実体参照の拡張を有効にしている場合、攻撃者はこれを利用してシステム内の機密ファイルを読み取ったり、ネットワークリソースにアクセスしたり、さらにはリモートコード実行につながる可能性もあります。これはサーバーサイドの脆弱性ですが、フロントエンドで悪意のあるXMLが生成される起点となるため、注意が必要です。

いますぐ対応を!必要な対策

この深刻な脆弱性からアプリケーションを保護するためには、以下の2つのステップを必ず実行してください。

**1. `xmldom`ライブラリのバージョンを更新**

まず、`xmldom`ライブラリを脆弱性が修正された最新バージョンに更新してください。これにより、セキュリティ修正が適用される準備が整います。

**2. `XMLSerializer.serializeToString`で`{ requireWellFormed: true }`オプションを有効にする**

**ここが最も重要です。** ライブラリを更新しただけでは自動的に安全にはなりません。コード内で`XMLSerializer.serializeToString`メソッドを呼び出している箇所をすべて特定し、以下の例のように**明示的に`{ requireWellFormed: true }`オプションを渡す必要があります。**

```javascript // 修正前のコード例 (脆弱性あり) const xmlString = new XMLSerializer().serializeToString(doc); // 修正後のコード例 (安全) const xmlString = new XMLSerializer().serializeToString(doc, { requireWellFormed: true }); ```

このオプションを有効にすると、`publicId`、`systemId`、`internalSubset`フィールドの内容がXMLの仕様に沿って厳格に検証されます。不正な文字や構造が検出された場合は`InvalidStateError`がスローされ、安全でないXMLが生成されるのを防ぎます。**これは「オプトイン」の変更であるため、手動でのコード修正が必須です。**

まとめ

`xmldom`におけるXMLインジェクション脆弱性(CVE-2026-41674)は、特にユーザー入力からXMLを生成しているアプリケーションにとって、無視できない重大なセキュリティリスクです。ライブラリの更新と、`serializeToString`メソッドにおける`{ requireWellFormed: true }`オプションの適用を徹底し、安全なWebアプリケーション開発を心がけましょう。もし、ご自身のプロジェクトで`xmldom`を使用しており、ユーザー入力から`DocumentType`ノードを生成している可能性がある場合は、今すぐにコードの確認と修正を行ってください。

← ブログ一覧に戻る