jsPDFにおけるPDF注入およびDoS脆弱性(CVE-2026-24737等)の脅威と実務的対策
【脅威の概要と背景】
jsPDFにおける入力検証不備に起因するPDF注入やDoSの脆弱性(CVE-2026-24737等)が特定され、即時対応が推奨されています。
本脆弱性は、ユーザー入力値がサニタイズされずにPDF描画処理(text()やhtml()メソッド等)へ引き渡されることで発生します。攻撃者は特製した文字列や悪意あるHTML/JavaScriptタグを挿入することで、生成されたPDF内での任意構造注入(PDF Injection)、フィッシングリンクの埋め込み、あるいは複雑な解析処理を誘発させることによるリソース枯渇(DoS)を引き起こす可能性があります。
【攻撃シナリオの可視化】
graph TD
A["攻撃者"] -->|悪意ある制御文字/HTMLを入力| B["Webアプリケーション"]
B -->|未検証データの引き渡し| C["jsPDF ライブラリ"]
C -->|PDF構造の破損/解析ループ| D["DoS: CPU/メモリ枯渇"]
C -->|悪意あるオブジェクト注入| E["PDF Injection: 任意コンテンツ描画"]
E -->|生成されたPDF| F["被害者ユーザー/内部システム"]
【安全な実装と設定】
誤用例(脆弱な実装)
ユーザー入力をそのまま jsPDF の描画関数に渡している場合、制御文字やPDF構文の解釈が崩れ、注入攻撃や処理の制限回避が起きます。
// 【脆弱なコード】未検証の入力を直接PDFに出力
import { jsPDF } from "jspdf";
function generateReport(userInput) {
const doc = new jsPDF();
// ユーザー入力に含まれる特殊文字や制御コードが検証されていない
doc.text(userInput, 10, 10);
doc.save("report.pdf");
}
安全な代替案(対策実装)
ライブラリの最新版へのアップデートを実施した上で、入力値の厳格な型チェックとサニタイズ、描画制限を行います。
// 【安全なコード】パッチ適用ライブラリと入力検証の導入
import { jsPDF } from "jspdf";
import DOMPurify from "dompurify"; // HTML経由の場合
function sanitizeInput(input) {
if (typeof input !== 'string') return '';
// 改行コードや制御文字、PDF構文を不適切に破綻させる文字の削除/エスケープ
return input.replace(/[\x00-\x1F\x7F-\x9F]/g, "").trim();
}
function generateReportSafe(userInput) {
const doc = new jsPDF();
const cleanInput = sanitizeInput(userInput);
// 入力長の制限によるDoS緩和
const truncatedInput = cleanInput.slice(0, 1000);
doc.text(truncatedInput, 10, 10);
doc.save("safe_report.pdf");
}
パッケージ依存関係の更新(Bash)
# npm による依存関係の更新と監査 npm update jspdf npm audit fix
【検出と緩和策】
検出ポイント
SCA(ソフトウェア構成分析)ツールによる検知: CI/CDパイプライン上で
npm auditや Dependabot、Snyk 等を実行し、影響を受けるバージョンのjsPDFが含まれていないかを自動検出します。WAF / アプリケーションログ:
jsPDFに引き渡されるAPIパラメータ内で、異常に長い文字列や不自然な制御文字(%\r\nや PDFオブジェクト構文の断片)が含まれているリクエストを監視・ブロックします。
応急的な緩和策(Workaround)
入力長制限の導入: フロントエンドおよびバックエンド側で、PDF生成用に入力される文字列の長さを厳格に制限し、リソース枯渇攻撃を抑止します。
制御文字の除去: 描画処理直前にヌルバイト(
\0)や不可視の制御コードを一括除去するインターセプターを配置します。
【実務上の落とし穴】
誤検知(False Positive)リスク: 記号や改行を多用する多言語テキスト(数式、特殊表記、制御コードを含むログデータ等)を厳しく制限しすぎると、正常なPDF生成処理が破壊されるリスクがあります。
可用性(パフォーマンス)とのトレードオフ: バックエンド(Node.js環境)で
jsPDFを使用してPDFを動的生成している場合、CPU集中型のDoS攻撃を受けるとサーバー全体の処理速度が低下します。生成処理をワーカープロセスに分離し、タイムアウト値を設定することが不可欠です。
【まとめ】
組織として優先して実施すべき3つのアクション:
依存関係の即時特定と更新: プロジェクト内で使用されている
jsPDFのバージョンを確認し、修正パッチが適用された最新バージョンへアップデートする。サニタイズ処理と入力制限の徹底: 描画処理へ渡されるすべての入力値に対し、制御文字の除去および最大長制限を適用する。
リソース孤立化と監視の強化: サーバーサイドでPDF生成を行う場合、メイン処理から隔離された環境で実行し、タイムアウトとリソース制限を設定する。
参考文献
JPCERT/CC: https://www.jpcert.or.jp/
National Vulnerability Database (NVD): https://nvd.nist.gov/
jsPDF GitHub Repository: https://github.com/parallax/jsPDF

