Modern Frontend CVEs

対象CVE: CVE-2026-44990

[緊急解説] sanitize-htmlのXSS脆弱性(CVE-2026-44990)とその対策

人気ライブラリ`sanitize-html`のデフォルト設定にXSS脆弱性が発見されました。`<xmp>`タグを利用した攻撃により、ユーザーのブラウザで悪意あるスクリプトが実行される危険性があります。早急な対応を推奨します。

はじめに:あなたのアプリケーションは安全ですか?

ウェブアプリケーションにおいて、ユーザーからの入力を安全に処理し表示することは、フロントエンドエンジニアにとって最も重要なセキュリティタスクの一つです。特に、HTMLコンテンツの入力を扱う際には、クロスサイトスクリプティング(XSS)を防ぐために、サニタイズライブラリの利用が不可欠となります。今回は、JavaScript環境で広く利用されているHTMLサニタイズライブラリ`sanitize-html`に発見された深刻なXSS脆弱性(GHSA-rpr9-rxv7-x643 / CVE-2026-44990)について解説します。

この脆弱性はCritical(高深刻度)と評価されており、適切な対策を講じなければ、ユーザーのセッションハイジャックや悪意のあるコンテンツの表示など、甚大な被害につながる可能性があります。日本のフロントエンドエンジニアの皆さんは、ぜひ本記事を読み進め、自身のプロジェクトへの影響を確認し、迅速な対応を行ってください。

脆弱性の概要:`<xmp>`タグが引き起こすXSS

`sanitize-html`ライブラリのバージョン`2.17.3`以前のデフォルト設定において、クロスサイトスクリプティング(XSS)の脆弱性が発見されました。

この脆弱性の核心は、`sanitize-html`が`<xmp>`タグの扱いを誤る点にあります。通常、サニタイズライブラリは許可されていないタグや危険なスクリプトを無害化または除去しますが、`<xmp>`タグの場合、その中身が「無害化すべきテキスト」ではなく「そのまま出力すべきテキスト」として扱われてしまうという不具合があります。結果として、攻撃者が仕込んだHTMLやJavaScriptがエスケープされずに表示され、ユーザーのブラウザで実行される危険性があるのです。

例えば、攻撃者がアプリケーションの入力欄に`<xmp><script>alert('XSS!')</script></xmp>`のような文字列を投稿した場合、`sanitize-html`による処理後も`<script>alert('XSS!')</script>`が残ってしまい、これを表示したユーザーのブラウザ上でJavaScriptが実行されてしまいます。

さらに問題なのは、ライブラリのREADMEドキュメントには`<xmp>`タグが例外リストに記載されておらず、実装とドキュメントの間で矛盾があることも指摘されています。これにより、開発者が意図せず脆弱な設定を導入してしまうリスクがありました。

なぜエスケープされないのか?具体的なメカニズム

この脆弱性がどのように発生するかをもう少し技術的に見てみましょう。

HTMLパーサーは、`<xmp>`タグの中身を特殊なテキストブロックとして認識します。通常、この中のコンテンツは生のテキストとして扱われ、そのままレンダリングされるべきです。しかし、`sanitize-html`の特定のバージョン(v2.17.3以前)では、この「テキスト」として認識された内容を、再度HTMLとして解釈し出力する際に、適切なエスケープ処理を行わないという不具合がありました。

つまり、パーサーが`<xmp><script>...</script></xmp>`を見たとき、`<script>...</script>`をただの文字列と解釈します。しかし、`sanitize-html`が最終的なHTMLを構築する段階で、この文字列をエスケープせずにHTMLとして出力してしまったため、ブラウザはそれを「実行可能なスクリプト」として認識してしまうのです。これは、サニタイズライブラリの根本的な目的(危険なコードを無害化する)に反する重大な欠陥と言えます。

あなたのアプリケーションは影響を受けますか?確認すべき条件

以下の条件に一つでも当てはまる場合、あなたのアプリケーションはこの脆弱性の影響を受ける可能性があります。すぐに確認し、対応を検討してください。

1. **`sanitize-html`ライブラリのバージョンが古い**:`2.17.3`以前のバージョンを使用している場合が該当します。

2. **`sanitize-html`をデフォルト設定または類似の設定で使用している**:特に、`disallowedTagsMode: 'discard'`が適用され、`<xmp>`タグが明示的に処理されていない場合にリスクが高まります。

3. **ユーザーがHTMLコンテンツを投稿でき、それが他のユーザーのブラウザに表示される可能性がある**:コメント欄、フォーラム、プロフィール編集など、ユーザーがリッチテキストを投稿できる機能を持つアプリケーションは特に注意が必要です。

4. **`sanitize-html`によって無害化された出力を「信頼できる安全なHTML」として扱い、そのままDOMに挿入したり、データベースに保存して後でレンダリングしたりしている**。

今すぐ取るべき対策

この脆弱性への対応は緊急を要します。以下の対策を速やかに実施してください。

最も推奨される対策は、`sanitize-html`を最新の安定版にアップデートすることです。この脆弱性は、すでに新しいバージョンで修正されている可能性が高いです。npmやYarnを使って、プロジェクトの依存関係を更新しましょう。

`npm install sanitize-html@latest` または `yarn upgrade sanitize-html`

アップデートがすぐに難しい場合や、より厳密な制御が必要な場合は、`sanitize-html`の設定を明示的に見直してください。`<xmp>`タグを危険な要素として扱い、確実に除去されるように設定を調整することが重要です。

具体的な設定例としては、`nonTextTags`オプションに`<xmp>`を追加するか、`disallowedTags`に含めるなどの方法が考えられます。これにより、`<xmp>`タグとその中身が削除されるか、適切にエスケープされるようになります。

`const sanitizedHtml = sanitizeHtml(dirtyHtml, { disallowedTags: ['xmp', 'script', 'style'], nonTextTags: ['xmp'] });`

また、許可するタグをホワイトリスト形式で厳密に指定する`allowedTags`オプションの利用も検討しましょう。例えば、`allowedTags: ['b', 'i', 'em', 'strong', 'a']`のように、本当に必要なタグのみを許可します。

サニタイズは重要ですが、それだけに頼るのは危険です。フロントエンドのセキュリティを多層的に強化することを検討してください。

• **追加のエスケープ処理**:信頼できないデータをDOMに挿入する前には、Reactの`dangerouslySetInnerHTML`などを使用する場合でも、追加のエスケープ処理(例: DOMPurifyなどの利用、ただし併用には注意が必要)を検討してください。DOMPurifyは`sanitize-html`とは異なるアプローチで強力なサニタイズを提供します。

• **Content Security Policy (CSP) の強化**:`script-src`ディレクティブを厳しく設定し、インラインスクリプトの実行を制限することで、XSS攻撃による被害を軽減できます。

• **HTTP Only Cookie**:セッションIDなどの重要な情報はHTTP Only属性を持つCookieに保存し、JavaScriptからのアクセスを防止します。

まとめ

今回の`sanitize-html`のXSS脆弱性(CVE-2026-44990)は、人気ライブラリのデフォルト設定に潜む危険性を示しています。フロントエンドエンジニアとして、利用しているライブラリのセキュリティ情報を常にチェックし、脆弱性が発見された際には迅速に対応する責任があります。

この機会に、ご自身のプロジェクトにおける`sanitize-html`のバージョンと設定、そして一般的なセキュリティ対策を見直し、ユーザーの安全を確保してください。最新の情報にアンテナを張り、継続的に学習していくことが、安全なウェブアプリケーション開発の鍵となります。

← ブログ一覧に戻る