Modern Frontend CVEs

対象CVE: CVE-2026-83607

[緊急対応] `@xmldom/xmldom`における深刻なXSS脆弱性 (CVE-2026-83607)とフロントエンド対策

`@xmldom/xmldom`ライブラリにおいて、`createElement()`で生成した要素名が適切に検証されず、XSS攻撃などを引き起こす深刻な脆弱性が見つかりました。既存のセキュリティ対策を迂回するため、修正版への更新に加え、**明示的な対策オプションの適用が必須**となります。

はじめに:`@xmldom/xmldom`における深刻なXSS脆弱性

日本のフロントエンドエンジニアの皆さん、こんにちは。今回は、XMLおよびHTML DOMの操作に広く利用されているライブラリ`@xmldom/xmldom`において報告された、重大なセキュリティ脆弱性(GHSA-w2rr-34g9-rvrj / CVE-2026-83607)について解説します。この脆弱性は高い深刻度と評価されており、適切な対応を怠ると、皆さんが開発・運用しているウェブアプリケーションがクロスサイトスクリプティング(XSS)攻撃などの標的となる可能性があります。特に、フロントエンドでユーザー入力を扱うケースでは、早急な対策が求められます。

脆弱性の概要とメカニズム:なぜ危険なのか

この脆弱性の根本原因は、`@xmldom/xmldom`の`Document.createElement()`メソッドが、要素名(tagName)として渡された文字列を一切検証せずに受け入れてしまう点にあります。通常、XMLやHTMLの要素名には特定の文字規則がありますが、`createElement()`はこの規則を無視します。そして、問題は`XMLSerializer.serializeToString()`でドキュメントがHTML/XMLとして出力される際に発生します。検証されなかった要素名がそのまま出力されてしまうため、攻撃者は悪意のあるコードを要素名に仕込むことが可能になるのです。

さらに深刻なのは、これまでのセキュリティ対策として推奨されてきた`requireWellFormed: true`オプションが、この脆弱性に対しては効果がなかったという点です。これにより、開発者が既存の対策で安全だと考えていたアプリケーションも、この脆弱性に対しては無防備なままでした。

具体的な攻撃シナリオ:フロントエンドアプリケーションへの影響

この脆弱性を悪用されると、主に以下のような攻撃がフロントエンドアプリケーション上で実行される可能性があります。

1. **クロスサイトスクリプティング (XSS)**: 最も一般的な脅威です。攻撃者はユーザー入力などを介して、`<img onerror="alert(document.cookie)">`のような悪意のある要素名を注入することができます。これが`XMLSerializer`によってシリアライズされ、ブラウザでレンダリングされると、`onerror`イベントハンドラが実行され、ユーザーのセッションクッキーが盗まれたり、任意のスクリプトが実行されたりする可能性があります。

2. **XMLインジェクション**: 要素名に閉じタグや新しい要素を注入することで、XMLドキュメントの構造を破壊したり、意図しない情報を挿入したりすることも可能です。

3. **既存セキュリティ対策の迂回**: 過去の脆弱性に対する`requireWellFormed: true`オプションによる対策を導入していたとしても、今回の脆弱性では無力でした。これは、開発者のセキュリティ意識に対する誤解を生み出す可能性もあります。

特に、ユーザーからの入力や外部の信頼できないデータを`@xmldom/xmldom`でDOMツリーに変換し、それを再びHTML/XMLとしてレンダリングするような処理を行っているアプリケーションは、直接的な影響を受けるため注意が必要です。

今すぐ実施すべき対策:あなたのアプリケーションを守るために

この脆弱性は、以下のバージョンで修正されています。まずは使用している`@xmldom/xmldom`ライブラリを最新の修正版へアップデートしてください。

<ul><li>`0.9.x`系をご利用の場合: **`0.9.11`** 以降</li><li>`0.8.x`系をご利用の場合: **`0.8.14`** 以降</li></ul>

しかし、**これだけでは対策は完了しません。** 修正を完全に有効にするためには、**明示的な対応が必須**となります。

`XMLSerializer.serializeToString()`を呼び出す際、**必ず`{ requireWellFormed: true }`オプションを渡してください**。

このオプションが渡されると、シリアライザーは各要素の要素名をXMLのQName規則に照らして検証し、無効な場合は`InvalidStateError`をスローしてシリアライズを中断します。これにより、悪意のある要素名がHTML出力として書き出されることを防ぎます。

**コード例(イメージ):**

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

皆さんのアプリケーション内で`XMLSerializer.serializeToString()`を使用している箇所をすべて監査し、`{ requireWellFormed: true }`オプションが適用されていることを確認・追加してください。**このオプションを渡さない場合、デフォルトのシリアライズ処理では依然として無効な要素名がそのまま出力され、脆弱性が残ります**ので、特に注意が必要です。

まとめ:安全なウェブアプリケーションのために

`@xmldom/xmldom`の今回の脆弱性は、ライブラリのアップデートだけでなく、コードレベルでの明示的なオプション適用が求められる点で特殊です。フロントエンドエンジニアとして、ユーザーからの入力は常に信頼できないものとみなし、適切なサニタイズやバリデーションを行うことが不可欠です。今回の件は、サードパーティライブラリを使用する際にも、その挙動を深く理解し、提供されるセキュリティ機能やオプションを適切に活用することの重要性を改めて教えてくれます。

早急にアプリケーションのレビューと修正を行い、ユーザーに安全なウェブ体験を提供し続けましょう。

← ブログ一覧に戻る