jsPDFにおけるPDF注入およびDoS脆弱性(CVE-2026-24737)への緊急対策ガイド
【脅威の概要と背景】
jsPDFの特定バージョンにおいて、外部入力の検証不備に起因するPDF注入(PDF Injection)と、リソース枯渇によるDoSの脆弱性が確認されました。攻撃者が悪意のあるメタデータや制御文字を注入することで、生成されたPDFの閲覧者へのフィッシング攻撃や、ブラウザのフリーズを引き起こす恐れがあります。
【攻撃シナリオの可視化】
攻撃者がユーザー入力フォームを介して、jsPDFの内部構造を破壊するペイロードを送り込むプロセスを以下に示します。
graph TD
A["攻撃者"] -->|悪意のある文字列を送信| B("Webアプリケーション")
B -->|未検閲の入力を渡す| C{"jsPDFエンジン"}
C -->|PDFオブジェクトの不正終了| D["PDF注入: 偽のリンク/スクリプト挿入"]
C -->|再帰的描画/巨大オブジェクト生成| E["DoS: クライアントのリソース枯渇"]
D -->|被害者がPDFを開封| F["資格情報の窃取/マルウェア感染"]
E -->|ブラウザクラッシュ| G["サービス利用不能"]
【安全な実装と設定】
脆弱な実装では、ユーザーからの入力をそのままPDF描画メソッドに渡しています。特にhtml()メソッドや、メタデータ設定関数が悪用される傾向にあります。
1. 脆弱な実装例(アンチパターン)
ユーザー入力をエスケープせずに直接PDF構造に組み込むケースです。
// 脆弱な例:ユーザーが入力したタイトルをそのままメタデータやHTMLとして処理
const doc = new jsPDF();
const userTitle = "My Document) /Title (Hacked!) >>"; // PDF構造を破壊する入力
doc.setProperties({
title: userTitle
});
doc.html(userInputHtml); // 悪意のあるスクリプトが含まれる可能性
2. 安全な実装案(代替案)
入力値のホワイトリスト検証と、文字数制限、およびサニタイズを徹底します。
// 安全な例:サニタイズとバリデーションの適用
import DOMPurify from 'dompurify';
function generateSafePDF(userInput) {
const doc = new jsPDF();
// 1. 入力値のサニタイズ(HTML注入対策)
const cleanHtml = DOMPurify.sanitize(userInput.htmlContent);
// 2. メタデータの検証(注入対策)
// 特殊文字 () \ をエスケープ、または削除
const safeTitle = userInput.title.replace(/[()\\\r\n]/g, '').substring(0, 100);
doc.setProperties({
title: safeTitle
});
// 3. DoS対策:極端に長い文字列や複雑な構造を拒否
if (cleanHtml.length > 50000) {
throw new Error("Input size exceeds safety limits.");
}
doc.html(cleanHtml, {
callback: function (doc) {
doc.save("output.pdf");
}
});
}
【検出と緩和策】
直ちにアップデートが困難な場合、以下の緩和策を検討してください。
WAFでの検知: PDFの内部構文に関連するキーワード(
obj,endobj,stream,>>)が入力フォームに含まれている場合にブロックするルールを追加。EDR/SIEMでの監視: 特定のページでブラウザのメモリ使用量が急増し、クラッシュが多発しているログを相関分析。
入力長制限: サーバーサイドおよびクライアントサイドで、PDF生成に利用する入力フィールドに厳格な文字数制限(例:1,000文字以内)を設ける。
【実務上の落とし穴】
誤検知(False Positive): 数学記号や特定の言語(タイ語やヒンディー語など)の複雑なグリフが、DoS対策の複雑性チェックに抵触し、正当なユーザーのPDF生成が失敗する可能性があります。
互換性: 脆弱性修正済みの最新版jsPDFへアップデートする際、古いブラウザ(IE11等)のサポートが完全に切れている場合があり、レガシーシステムではポリフィルの追加導入が必要になることがあります。
【まとめ】
組織のセキュリティ担当者は、以下の3点を優先的に実施してください。
資産棚卸: 自社Webサービス内で
jspdfパッケージを利用しているプロジェクトを特定(npm list jspdf等)。緊急アップデート: jsPDFを修正済みバージョン(本例ではCVE対応済みの最新版)へ昇格。
入力バリデーションの再定義: PDF生成に渡す全ての動的データに対し、サニタイズ処理が介在しているかコードレビューを実施。
参考文献:

