[META:TYPE_SECURITY_ADVISORY_CSIRT_PRACTICAL_JS_LIBRARY]
本記事はGeminiの出力をプロンプト工学で整理した業務ドラフト(未検証)です。
jsPDFにおけるPDF注入およびDoS脆弱性への緊急対応ガイド:CVE-2026-24737への実務的対策
【脅威の概要と背景】
クライアントサイドでPDFを生成するライブラリ「jsPDF」において、悪意のある入力がPDF構造を破壊、またはリソースを異常消費させる脆弱性(CVE-2026-24737等)が公表されました。
【攻撃シナリオの可視化】
攻撃者がユーザー入力を介して、PDFオブジェクトの定義を改ざん、あるいは無限ループを誘発するペイロードを送り込むキルチェーンを以下に示します。
graph TD
A["攻撃者"] -->|悪意のある文字列をフォーム入力| B("Webアプリケーション")
B -->|未検証のデータをjsPDFへ渡す| C{"jsPDFエンジンの処理"}
C -->|PDF Injection| D["生成PDF内に悪意あるJS/URIを埋め込み"]
C -->|DoS| E["ブラウザのリソース枯渇・フリーズ"]
D -->|被害者がPDFを開封| F["閲覧環境でのクロスサイトスクリプティング/XSS"]
E -->|サービス利用不可| G["可用性の喪失"]
【安全な実装と設定】
脆弱な実装(直接的なユーザー入力の受け入れ)と、防御的な実装の対比を以下に示します。
1. PDF注入への対策(JavaScript)
脆弱なコード例:
// ユーザー入力をそのままPDFに描画
const doc = new jsPDF();
const userInput = new URLSearchParams(window.location.search).get('name');
doc.text(userInput, 10, 10); // ここでPDF構造が破壊されるリスク
doc.save('report.pdf');
安全な代替案:
import DOMPurify from 'dompurify';
const doc = new jsPDF();
let userInput = new URLSearchParams(window.location.search).get('name') || "";
// 1. 入力のサニタイズ(特にHTML経由で生成する場合)
const cleanInput = DOMPurify.sanitize(userInput);
// 2. 文字列の長さ制限と制御文字の除去
const safeText = cleanInput.replace(/[\x00-\x1F\x7F]/g, "").substring(0, 100);
doc.text(safeText, 10, 10);
doc.save('report.pdf');
2. DoS(リソース枯渇)への対策
jsPDFで大きな画像や複雑なパスを描画する際、メモリ消費を抑える設定が必要です。
// 3. 画像圧縮の強制と解像度の制限 const imgData = '...'; // ユーザーアップロード画像等 doc.addImage(imgData, 'JPEG', 10, 10, 50, 50, undefined, 'FAST'); // 'FAST'オプションや圧縮を利用し、描画負荷を軽減
【検出と緩和策】
EDR/WAFでの検知:
application/pdfのレスポンスに含まれる異常なキーワード(例:/JS,/JavaScript,/OpenAction)の監視。HTTPリクエストパラメータにおける、PDFのシンタックス文字(
>>,<<,obj,endobj)のシグネチャ検知。
応急的な緩和策(Workaround):
Content-Security-Policy (CSP)のobject-src 'none'またはscript-srcの厳格化により、PDF内からのスクリプト実行をブラウザ側で阻止する。信頼できないユーザー入力を伴うPDF生成機能を、修正パッチ適用まで一時的に停止する。
【実務上の落とし穴】
誤検知のリスク: サニタイズ処理を厳格にしすぎると、多言語(非ラテン文字)や特殊な記号を含む正当なレポート出力が文字化けしたり、レイアウトが崩れたりする「可用性とのトレードオフ」が発生します。
クライアントサイドの限界: jsPDFはブラウザ上で動作するため、悪意のあるユーザーが自身のブラウザで意図的にDoSを引き起こすことは防げませんが、他者を標的にした「汚染されたPDFの配布」を防ぐことに主眼を置くべきです。
【まとめ】
組織のセキュリティ担当者は、直ちに以下の3点を確認してください。
依存関係の更新:
npm audit等を用いてjspdfのバージョンを確認し、修正済みバージョン(最新版)へアップデートする。入力バリデーションの再点検: PDF生成関数(
text(),html(),addImage()等)に渡されるデータが、適切にサニタイズ・型検知されているかコードレビューを実施する。CSPの適用確認: 生成されたPDFが悪用された場合に備え、ブラウザ側でスクリプト実行を制限するポリシーが適用されているか確認する。
参考文献:

