本記事はGeminiの出力をプロンプト工学で整理した業務ドラフト(未検証)です。
jsPDFにおけるPDF注入およびDoS脆弱性(CVE-2024-24737)への緊急対応ガイド
【脅威の概要と背景】
jsPDFの入力検証不備に起因し、悪意あるコードをPDF内に埋め込む注入攻撃や、リソースを枯渇させるDoS攻撃が可能です(CVE-2024-24737)。ブラウザ上でPDFを動的生成する多くのWebサービスが影響を受けます。
【攻撃シナリオの可視化】
graph TD
A["攻撃者"] -->|悪意あるペイロードを送信| B["Web入力フォーム/API"]
B -->|サニタイズなしの文字列| C["jsPDFエンジン"]
C -->|不正なオブジェクト構造を構築| D{"脆弱性の発現"}
D -->|PDF注入| E["XSS実行・データ漏洩"]
D -->|計算負荷の増大| F["ブラウザフリーズ・DoS"]
この攻撃は、PDF生成時にユーザー入力をエスケープせずに直接PDF構文として解釈してしまうことで発生します。攻撃者はPDFの内部構造(ブラケットや特殊なキーワード)を操作し、PDFビューアのJavaScript実行機能を悪用します。
【安全な実装と設定】
1. 脆弱な実装例(アンチパターン)
ユーザーからの入力をそのままPDF生成関数に渡しているケースです。
// 脆弱な例:ユーザー入力を直接textメソッドに渡している
const userInput = req.body.comment;
const doc = new jsPDF();
doc.text(userInput, 10, 10); // ここでPDF構文の注入が可能
doc.save("output.pdf");
2. 安全な実装案(ベストプラクティス)
入力値のバリデーションと、ライブラリの最新化、およびContent Security Policy (CSP) の適用を組み合わせます。
import { jsPDF } from "jspdf";
import DOMPurify from "dompurify";
// 対策1: 入力値のサニタイズ(HTML経由での出力の場合)
const cleanInput = DOMPurify.sanitize(userInput);
// 対策2: jsPDFの最新バージョンへのアップデート(必須)
// npm install jspdf@latest
// 対策3: 文字列の適切なエスケープ(PDF構文破壊の防止)
const doc = new jsPDF();
// textメソッド内部での自動エスケープを信頼せず、必要に応じて
// 入力値から PDF の特殊文字 ( ) \ 等を制限または除去する
const safeText = cleanInput.replace(/[()\\\r\n]/g, "");
doc.text(safeText, 10, 10);
【検出と緩和策】
EDR/SIEMでの検知ポイント:
Webサーバのログにおいて、入力パラメータに
/JS,/JavaScript,/OpenActionなどのPDFアクションを示すキーワードが含まれているリクエストを監視。クライアントサイドで、特定のブラウザプロセスがPDF生成時に異常なCPU/メモリ使用率(DoSの兆候)を示していないか監視。
応急的な緩和策 (Workaround):
WAFの活用: ペイロードに含まれるPDF構文特有の記号をブロックする。
CSPの設定:
script-srcを制限し、PDF内から外部ドメインへのリクエストやインラインスクリプトの実行を抑止する。
【実務上の落とし穴】
可用性への影響: 厳格すぎるサニタイズ(記号の全面禁止など)を導入すると、正当なユーザーが住所や特殊な名称を入力できなくなり、PDFのレイアウトが崩れる可能性があります。
誤検知(False Positive): 履歴書生成ツールなどで、技術用語(プログラミングコード等)をPDF化しようとする正規の動作が、インジェクション攻撃として検知されるケースがあります。コンテキストに応じた除外設定が必要です。
【まとめ】
組織のセキュリティ担当者は、直ちに以下の3点を確認してください。
依存関係の確認: プロジェクトで使用している
jsPDFのバージョンが脆弱な範囲(最新版未満)か確認。サニタイズの徹底: サーバーサイド、クライアントサイド双方でユーザー入力のバリデーションが実装されているか点検。
CSPの更新: 生成されたPDFがブラウザ上で実行される際、不適切なスクリプトが動作しないようContent Security Policyを強化。
参考文献:

