Modern Frontend CVEs

対象CVE: CVE-2026-83617

[重要] xmldomの深刻な脆弱性GHSA-jxjr-3g7g-3944(CVE-2026-83617)解説:`requireWellFormed`をすり抜けるXSSリスク

xmldomライブラリにおいて、`requireWellFormed: true`設定が有効であっても、要素名や属性名に改行コードが含まれるとセキュリティチェックを回避し、XSSなどの深刻なセキュリティリスクを引き起こす脆弱性が発見されました。日本のフロントエンドエンジニアの皆さんは、速やかなアップデートと設定の見直しが必要です。

はじめに:xmldomに潜む新たなXSSリスク

日本のフロントエンドエンジニアの皆さん、こんにちは。今回は、XMLおよびHTMLのパースとシリアライズによく利用される`xmldom`ライブラリに、高い深刻度(high)を持つ新たな脆弱性(GHSA-jxjr-3g7g-3944 / CVE-2026-83617)が発見されましたので、その詳細と対応策について解説します。この脆弱性は、これまでセキュリティ対策として導入してきた`requireWellFormed: true`の設定を巧妙に回避し、WebアプリケーションをXSS(クロスサイトスクリプティング)やXML構造改ざんの危険に晒す可能性があります。現在`xmldom`を使用しているプロジェクトは、速やかに対応を検討してください。

脆弱性の詳細:`requireWellFormed: true`をすり抜ける改行コードの脅威

この脆弱性の核心は、`xmldom`ライブラリの`XMLSerializer`がXMLを文字列化する際に、`requireWellFormed: true`オプションが有効であっても、特定の条件でセキュリティチェックを回避してしまう点にあります。具体的には、要素名や属性名に改行コード(`\n`, `\r`, `\u2028`, `\u2029`など)が含まれている場合、このチェックが機能しません。

問題の原因は、内部で使用されている正規表現がマルチラインモード(`m`フラグ)で動作することにあります。これにより、文字列全体ではなく行単位でXML名の検証が行われてしまいます。結果として、「最初の行が有効なXML名であれば、その後に続く改行コードや不正なHTML/XMLコードがチェックを通過してしまう」という状況が発生します。

攻撃者はこの脆弱性を悪用し、たとえばユーザー入力に`myElement\n><script>alert(1)</script`のような文字列を含めることで、シリアライズされたXML出力に意図しないHTMLタグやスクリプトを挿入できます。これにより、ブラウザ上で悪意のあるスクリプトが実行され、XSS攻撃が成功したり、XML構造が改ざんされたりする危険性があります。

フロントエンド開発への影響:どんなプロジェクトが危険に晒されるのか?

フロントエンド開発において、直接ブラウザ上で`xmldom`を使用するケースは稀かもしれませんが、Node.js環境でのサーバーサイドレンダリング(SSR)や、サーバーサイドでXML/HTMLコンテンツを生成し、それをクライアントに送信するようなアプリケーションでは注意が必要です。

例えば、以下のようなシナリオが考えられます。<ul><li>ユーザーからの入力を基にDOM要素や属性名を動的に生成し、`xmldom`でXML/HTML文字列としてシリアライズして表示する場合。</li><li>外部APIからのデータや信頼できないソースからの情報をXMLとしてパースし、加工後に再度シリアライズしてWebページの一部として埋め込む場合。</li></ul>

以前、`xmldom`には類似の脆弱性(GHSA-w2rr-34g9-rvrjやGHSA-4w3w-2rp5-g8jm)が報告されており、その対策として多くのプロジェクトで`requireWellFormed: true`オプションが導入されてきました。しかし、今回の脆弱性は、その対策を導入済みのアプリケーションも影響を受けるため、これまで安全だと思われていた環境でも再度セキュリティリスクに直面する可能性があります。ユーザーが制御可能な入力データをDOM要素名や属性名として扱う場合は、特に警戒が必要です。

今すぐ取るべき対応策

この深刻な脆弱性からアプリケーションを保護するためには、以下の2点に速やかに対応してください。<ol><li><strong>`@xmldom/xmldom`ライブラリのアップデート:</strong><p>直ちに最新バージョン(執筆時点では`^0.7.0`以上)にアップデートしてください。この脆弱性に対する修正は、最新バージョンに含まれています。</p><pre><code>npm install @xmldom/xmldom@latest</code></pre><pre><code>yarn add @xmldom/xmldom@latest</code></pre></li><li><strong>`requireWellFormed: true`の明示的な指定の徹底:</strong><p>ライブラリのアップデート後も、<strong>全ての</strong>`XMLSerializer().serializeToString()`の呼び出し箇所で、<strong>明示的に</strong>`{ requireWellFormed: true }`オプションを渡すことが不可欠です。このオプションを有効にしない限り、改行コードを含む不正な名前は引き続きそのまま出力され、脆弱なままとなります。</p><p><strong>誤った例(脆弱なまま):</strong><pre><code>const serializer = new XMLSerializer(); const xmlString = serializer.serializeToString(domNode); // requireWellFormed: true が指定されていない</code></pre></p><p><strong>正しい例(修正後):</strong><pre><code>const serializer = new XMLSerializer(); const xmlString = serializer.serializeToString(domNode, { requireWellFormed: true });</code></pre></p><p>`requireWellFormed: true`オプションは、W3C DOMの仕様に基づく互換性維持のため、デフォルトでは無効です。そのため、信頼できない入力を扱う場合は、<strong>必ず</strong>このオプションを有効にすることを忘れないでください。</p></li></ol>

まとめ:継続的なセキュリティ対策の重要性

今回の`xmldom`の脆弱性は、一見対策済みと思える設定でも、その実装の詳細によっては思わぬ抜け穴が存在する可能性を示しています。特に、ユーザーからの入力を処理する部分では、常にサニタイズやバリデーションを徹底し、信頼できないデータをそのままDOM要素や属性名として使用しないよう心がけることが重要です。

フロントエンド開発においても、依存ライブラリの脆弱性情報は継続的にウォッチし、定期的なアップデートと適切な設定の見直しを行うことで、アプリケーションのセキュリティレベルを維持していきましょう。

← ブログ一覧に戻る