【緊急警報】Nuxt.js開発者必見! @nuxtjs/mdcに深刻なXSS脆弱性 (CVE-2026-63671)
はじめに:Nuxt.js開発者が知るべきXSSの危険性
Webアプリケーション開発において、クロスサイトスクリプティング(XSS)は常に警戒すべき脆弱性の一つです。特にユーザーが投稿するコンテンツを扱う場合、悪意のあるスクリプトが挿入され、ユーザーのセッションハイジャックや情報漏洩につながる可能性があります。今回、Nuxt.jsのエコシステムで広く使われているマークダウンコンポーネントライブラリ`@nuxtjs/mdc`に、深刻度HighのXSS脆弱性(CVE-2026-63671 / GHSA-mxm6-v9r6-r94c)が発見されました。日本のNuxt.jsフロントエンドエンジニアの皆さんは、速やかにこの情報を把握し、適切な対策を講じる必要があります。
脆弱性の概要:@nuxtjs/mdcのURLサニタイザーの不備
`@nuxtjs/mdc`は、マークダウンコンテンツをHTMLに変換する際に、安全性を確保するためのURLサニタイザーを備えています。しかし、このサニタイザーに不備があり、特定の形式で記述された悪意のあるURLが適切にブロックされず、結果としてXSS攻撃を許してしまうことが判明しました。この脆弱性は、特に外部からの信頼できないマークダウン(生のHTMLを含む可能性があるもの)をデフォルト設定で利用している場合に顕著な影響を及ぼします。
なぜ危険なのか?具体的なXSSのメカニズム
この脆弱性は、主に以下の2つの異なる経路で発生します。
`@nuxtjs/mdc`には、危険なリンクをブロックするための`validateProp`というサニタイザー関数があります。しかし、この関数はHTMLの一般的な`href`属性や`src`属性に焦点を当てており、SVG要素で使われる`xlink:href`属性については、`javascript:`スキームなどの安全性を十分に検証していませんでした。このため、攻撃者はSVGの`<a>`タグ内で例えば`<a xlink:href="javascript:alert('XSS')">Click Me</a>`のようなJavaScriptコードを含むリンクを記述でき、ユーザーがこのリンクをクリックすると、悪意のあるスクリプトが実行されてしまいます。
ライブラリには、危険なリンクのプレフィックスを拒否するリスト(`unsafeLinkPrefix`)があり、`data:text/html`もそのリストに含まれていました。しかし、このチェックはURLのプロトコル部分(例: `http:`、`data:`)のみを比較するロジックになっていました。`data:`URIの場合、プロトコルは常に`"data:"`であるため、`"data:".startsWith("data:text/html")`という比較は常に`false`となり、`data:text/html`形式のデータURIがブロックされませんでした。結果として、攻撃者は`<iframe src="data:text/html,<script>alert('XSS')</script>">`のような要素を挿入でき、このiframeが読み込まれると、その内部でスクリプトが自動的に実行されてしまいます。
あなたのNuxt.jsプロジェクトへの影響度チェック
以下の条件に当てはまる場合、あなたのプロジェクトはこの脆弱性の影響を受ける可能性があります。
<ul><li>`@nuxtjs/mdc`をNuxt.jsプロジェクトで使用している。</li><li>`@nuxtjs/mdc`のデフォルト設定(`allowDangerousHtml: true`)を使用している、またはそれに準ずる設定になっている。</li><li>ユーザー投稿のコンテンツや外部から取得したコンテンツなど、信頼できないマークダウンをレンダリングしている。</li></ul>
これらの条件に一つでも当てはまる場合は、早急な対応を検討してください。
今すぐ取るべき対策と推奨事項
最も推奨される対策は、開発元からパッチが公開され次第、速やかに`@nuxtjs/mdc`を最新バージョンにアップデートすることです。セキュリティアップデートは、脆弱性修正の他にパフォーマンス改善や新機能追加も含まれることが多いため、常に最新の状態を保つことが重要です。
パッチがまだ公開されていない場合や、より強固な対策を講じたい場合は、以下の点を検討してください。
<ul><li><strong>`validateProp`関数の拡張:</strong> カスタムサニタイザーを導入するか、既存のサニタイザーを拡張し、`xlink:href`属性も`href`や`src`と同様に、許可されたスキーム(`http`, `https`, `mailto`など)のみを許可するよう厳しくチェックします。`javascript:`スキームなどは完全にブロックします。</li><li><strong>`isAnchorLinkAllowed`関数の改善:</strong> `data:`URIを検証する際に、プロトコル部分だけでなく、MIMEタイプを含むURL全体を評価するロジックに修正します。特に`data:text/html`のような危険なMIMEタイプを明示的に拒否するようにします。</li><li><strong>`iframe`タグの厳格な制御:</strong> そもそも信頼できないマークダウンから`iframe`タグのレンダリングを許可しない、または`src`属性で許可されるスキームやドメインを極めて厳しく制限します。`sandbox`属性の利用も検討してください。</li><li><strong>`allowDangerousHtml: false`への設定変更の検討:</strong> `@nuxtjs/mdc`の設定で`allowDangerousHtml`を`false`に設定することで、生のHTMLのレンダリングを停止し、セキュリティを向上させることができます。ただし、既存のコンテンツに影響が出る可能性があるため、十分なテストが必要です。</li><li><strong>入力値のサニタイズ強化:</strong> ユーザーからの入力値は、`@nuxtjs/mdc`に渡す前に、常にバックエンドとフロントエンドの両方で厳格にサニタイズすることを習慣にしましょう。信頼できるサニタイズライブラリの導入も有効です。</li></ul>
まとめ
今回の`@nuxtjs/mdc`におけるXSS脆弱性は、マークダウン処理の安全性を再考する良い機会です。フロントエンドエンジニアとして、利用しているライブラリのセキュリティ情報を常にチェックし、迅速かつ的確な対応を行う責任があります。定期的な依存関係のアップデートと、コードレビューにおけるセキュリティ観点の強化を心がけ、安全なWebアプリケーション開発を推進していきましょう。