jsPDFにおけるPDF注入およびDoS脆弱性(CVE-2026-24737等)への緊急対策

Tech

[METADATA] { “type”: “security_advisory”, “status”: “draft”, “priority”: “high”, “cve_id”: “CVE-2026-24737”, “affected_component”: “jsPDF (HTML-to-PDF rendering module)”, “threat_category”: “Injection, Denial of Service (DoS)” } [/METADATA] 本記事はGeminiの出力をプロンプト工学で整理した業務ドラフト(未検証)です。

jsPDFにおけるPDF注入およびDoS脆弱性(CVE-2026-24737等)への緊急対策

【脅威の概要と背景】

クライアントサイドPDF生成ライブラリのデファクトスタンダードである「jsPDF」において、HTMLレンダリングエンジンの不備に起因する脆弱性(CVE-2026-24737)が特定されました。攻撃者が細工したHTMLソースをhtml()メソッド等に渡すことで、PDF内への不正コンテンツ注入や、レンダリングループによるブラウザ/プロセスのハングアップ(DoS)を引き起こす可能性があります。2025年後半から2026年初頭にかけて報告が相次いだ一連の「ドキュメント・ガジェット・インジェクション」の一種と位置付けられます。

【攻撃シナリオの可視化】

攻撃者がユーザー入力を介して悪意のあるペイロードを注入し、正規のPDFドキュメントを改ざん、あるいは閲覧者のリソースを枯渇させるプロセスは以下の通りです。

graph TD
    A["攻撃者"] -->|悪意のあるHTML/CSSを送信| B("ウェブアプリケーション")
    B -->|未検閲の入力を渡す| C{"jsPDF .html メソッド"}
    C -->|PDF Injection| D["偽の署名欄やリンクを埋め込んだPDF生成"]
    C -->|Resource Exhaustion| E["再帰的レンダリングによるCPU/メモリ飽和"]
    D -->|フィッシング| F["エンドユーザーの被害"]
    E -->|サービス拒否| G["ブラウザフリーズ/サーバーサイドNode.js停止"]

【安全な実装と設定】

脆弱な実装は、ユーザーからの入力をそのままレンダリングエンジンに渡しています。安全な実装では、DOMPurify等を用いた厳格なサニタイズと、レンダリングオプションの制限が必須です。

1. 脆弱な実装例(JavaScript)

// 脆弱:ユーザー入力を直接html()メソッドに渡している
const userInput = request.query.content; 
const doc = new jsPDF();
doc.html(userInput, {
    callback: function (doc) {
        doc.save('output.pdf');
    }
});

2. 安全な代替案(推奨)

import { jsPDF } from "jspdf";
import DOMPurify from 'dompurify';

// 対策:サニタイズと構成の制限
const userInput = request.query.content;

// 1. 許可するタグと属性を最小限に絞り込む(ホワイトリスト形式)
const cleanHTML = DOMPurify.sanitize(userInput, {
    ALLOWED_TAGS: ['b', 'i', 'em', 'strong', 'p', 'br'],
    ALLOWED_ATTR: [],
    ALLOW_DATA_ATTR: false
});

const doc = new jsPDF({
    unit: 'pt',
    format: 'a4'
});

// 2. レンダリング時のタイムアウトやスケール制限(仮想的な保護)
doc.html(cleanHTML, {
    callback: function (doc) {
        doc.save('secure_output.pdf');
    },
    // 過度な再帰や巨大なレンダリングを抑制するための設定値を確認
    autoPaging: 'text',
    x: 10,
    y: 10
});

【検出と緩和策】

システム全体での防御を強化するためのポイントを挙げます。

  • EDR/WAFでの検知:

    • WAFにおいて、<script>, <iframe>, <object> などのタグ、または data: URIスキームを含むリクエストをブロックするルールを適用します。

    • 大量のリピート文字列(例:<div>の1000回以上のネスト)を検出するシグネチャを有効化します。

  • 応急的な緩和策(Workaround):

    • 最新パッチを適用できない場合、一時的に html() メソッドの使用を停止し、プレーンテキストのみの text() メソッドに切り替えます。

    • Content Security Policy (CSP) で script-src を厳格化し、PDF生成時の副次的なスクリプト実行を防止します。

【実務上の落とし穴】

  • 過度なサニタイズによるレイアウト崩れ: 複雑なCSSを多用しているビジネス帳票などの場合、DOMPurifyの制限を強めすぎると、PDFの見た目が崩れる(可用性の低下)リスクがあります。業務要件に合わせた「許容タグ」の精査が必要です。

  • サーバーサイド(Node.js)での実行: jsPDFをバックエンドで動かしている場合、DoS攻撃がサーバー全体のプロセスを停止させる可能性があります。workerスレッドで実行し、タイムアウト監視を行うなどのリソース管理が不可欠です。

【まとめ】

組織のセキュリティ担当者は、直ちに以下の3点を確認・実施してください。

  1. ライブラリのバージョン確認: jsPDF が最新のセキュリティ修正済みバージョンであることを確認し、古い場合は直ちにアップデートする。

  2. サニタイズ処理の徹底: フロントエンドおよびバックエンドの両方で、PDF化するデータに対して DOMPurify 等の定評あるライブラリによるサニタイズが実装されているかコードレビューを行う。

  3. 入力制限の導入: ユーザー入力の文字数制限や、HTMLタグのネストの深さを制限するバリデーションを追加し、リソース枯渇攻撃(DoS)に対する耐性を高める。

参考文献:

ライセンス:本記事のテキスト/コードは特記なき限り CC BY 4.0 です。引用の際は出典URL(本ページ)を明記してください。
利用ポリシー もご参照ください。

コメント

タイトルとURLをコピーしました