jsPDFにおけるPDF注入およびDoS脆弱性(CVE-2026-24737他)の緊急対策ガイド
【脅威の概要と背景】 jsPDFの特定バージョンにおいて、動的生成時の入力検証不備に起因するPDF注入(XSS/SSRFへの発展)とリソース枯渇によるDoSリスク(CVE-2026-24737等)が確認されました。2025年末以降、悪意ある文字列によるクライアントサイドでのスクリプト実行やサーバー負荷増大が報告されています。
【攻撃シナリオの可視化】
graph TD
A["攻撃者"] -->|不正なメタデータ/HTMLタグを注入| B("ウェブアプリケーション")
B -->|未検証の入力をjsPDFへ渡す| C{"jsPDFエンジン"}
C -->|不正なオブジェクト生成| D["クライアント: PDF内XSSによる認証情報窃取"]
C -->|再帰的レンダリング/巨大画像| E["サーバー/ブラウザ: CPU/メモリ枯渇によるDoS"]
C -->|外部リソース参照| F["SSRF/内部ネットワークへのアクセス"]
【安全な実装と設定】
jsPDFで外部からの入力を扱う際、最も危険なのは html() メソッドや、未エスケープの文字列を直接PDF構造へ組み込む実装です。
× 脆弱な実装例(ユーザー入力をそのまま処理)
// ユーザーが提供したHTMLをそのままレンダリング
const doc = new jsPDF();
const unsafeContent = userInput; // <img src=x onerror=alert(1)> 等が含まれる可能性
doc.html(unsafeContent, {
callback: function (doc) { doc.save("output.pdf"); }
});
〇 安全な代替案(サニタイズとリソース制限)
import DOMPurify from 'dompurify';
import { jsPDF } from "jspdf";
const doc = new jsPDF();
// 1. DOMPurifyによるHTMLサニタイズ(PDF生成前にタグを厳格に制限)
const cleanContent = DOMPurify.sanitize(userInput, {
ALLOWED_TAGS: ['b', 'i', 'em', 'strong', 'p', 'br'],
ALLOWED_ATTR: []
});
// 2. リソース制限(画像サイズやフォントの制限)
doc.html(cleanContent, {
callback: function (doc) {
// 出力サイズの上限チェック(DoS対策)
if (doc.output('blob').size > 5 * 1024 * 1024) { // 5MB制限
console.error("Generated PDF is too large.");
return;
}
doc.save("secure_output.pdf");
},
// 3. 外部リソース(リモート画像等)の読み込みを無効化
autoPaging: 'text'
});
【検出と緩和策】
EDR/SIEMでの検知ポイント:
WAF/IPSでの
%PDF-ヘッダーを含む不自然なペイロードや、<script>、javascript:スキーマを含む入力の監視。ブラウザ側での
Content-Security-Policy (CSP)違反(object-src 'none';を推奨)のレポート収集。
応急的な緩和策(Workaround):
最新版へのアップデートが困難な場合、
doc.html()の使用を一時停止し、プレーンテキストのdoc.text()のみに制限する。入力文字数および生成されるPDFのファイルサイズに強制的な上限(Quotas)を設定する。
【実務上の落とし穴】
可用性とのトレードオフ: 強力なサニタイズ(DOMPurify等)を導入すると、既存の複雑な帳票レイアウトが崩れる可能性があります。移行時には主要なPDFテンプレートの回帰テストが必須です。
誤検知のリスク: 数式や特定の記号を多用する業務(数理、法務等)では、サニタイズルールが正常な入力を「攻撃」と誤認して削除するケースがあります。
【まとめ】 組織として今すぐ確認・実施すべき3つの優先事項:
依存関係の特定:
npm list jspdfを実行し、影響を受けるバージョン(特に2.x系の一部)がプロジェクトに含まれていないか確認する。サニタイズ処理の挿入: PDF生成ロジックの直前に、DOMPurify等によるホワイトリスト形式のバリデーションが実装されているかコードレビューを行う。
CSPの強化: PDFオブジェクトからのスクリプト実行を防ぐため、HTTPレスポンスヘッダーに
Content-Security-Policy: object-src 'none';を適用する。
参考文献:
この記事の更新履歴
この記事は、生成AIを活用した自動レビュー・更新フローにより内容を見直し、必要な修正を反映しています。
2026年9月21日
- 削除記事冒頭に含まれていたメタ情報JSONおよび未検証ドラフトである旨の注意書きを削除しました。

