<p><meta/>
{
“style_prompt”: “CSIRT_TECHNICAL_ADVISORY”,
“priority”: “HIGH”,
“target_audience”: “Security_Engineers_and_Developers”,
“version”: “1.0”
}
本記事は<strong>Geminiの出力をプロンプト工学で整理した業務ドラフト(未検証)</strong>です。</p>
<h1 class="wp-block-heading">jsPDFにおけるPDF注入およびDoS脆弱性(CVE-2026-24737他)の緊急対策ガイド</h1>
<p>【脅威の概要と背景】
jsPDFの特定バージョンにおいて、動的生成時の入力検証不備に起因するPDF注入(XSS/SSRFへの発展)とリソース枯渇によるDoSリスク(CVE-2026-24737等)が確認されました。2025年末以降、悪意ある文字列によるクライアントサイドでのスクリプト実行やサーバー負荷増大が報告されています。</p>
<p>【攻撃シナリオの可視化】</p>
<div class="wp-block-merpress-mermaidjs diagram-source-mermaid"><pre class="mermaid">
graph TD
A["攻撃者"] -->|不正なメタデータ/HTMLタグを注入| B("ウェブアプリケーション")
B -->|未検証の入力をjsPDFへ渡す| C{"jsPDFエンジン"}
C -->|不正なオブジェクト生成| D["クライアント: PDF内XSSによる認証情報窃取"]
C -->|再帰的レンダリング/巨大画像| E["サーバー/ブラウザ: CPU/メモリ枯渇によるDoS"]
C -->|外部リソース参照| F["SSRF/内部ネットワークへのアクセス"]
</pre></div>
<p>【安全な実装と設定】
jsPDFで外部からの入力を扱う際、最も危険なのは <code>html()</code> メソッドや、未エスケープの文字列を直接PDF構造へ組み込む実装です。</p>
<p><strong>× 脆弱な実装例(ユーザー入力をそのまま処理)</strong></p>
<div class="codehilite">
<pre data-enlighter-language="generic">// ユーザーが提供したHTMLをそのままレンダリング
const doc = new jsPDF();
const unsafeContent = userInput; // <img src=x onerror=alert(1)> 等が含まれる可能性
doc.html(unsafeContent, {
callback: function (doc) { doc.save("output.pdf"); }
});
</pre>
</div>
<p><strong>〇 安全な代替案(サニタイズとリソース制限)</strong></p>
<div class="codehilite">
<pre data-enlighter-language="generic">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'
});
</pre>
</div>
<p>【検出と緩和策】</p>
<ul class="wp-block-list">
<li><p><strong>EDR/SIEMでの検知ポイント</strong>:</p>
<ul>
<li><p>WAF/IPSでの <code>%PDF-</code> ヘッダーを含む不自然なペイロードや、<code><script></code>、<code>javascript:</code> スキーマを含む入力の監視。</p></li>
<li><p>ブラウザ側での <code>Content-Security-Policy (CSP)</code> 違反(<code>object-src 'none';</code> を推奨)のレポート収集。</p></li>
</ul></li>
<li><p><strong>応急的な緩和策(Workaround)</strong>:</p>
<ul>
<li><p>最新版へのアップデートが困難な場合、<code>doc.html()</code> の使用を一時停止し、プレーンテキストの <code>doc.text()</code> のみに制限する。</p></li>
<li><p>入力文字数および生成されるPDFのファイルサイズに強制的な上限(Quotas)を設定する。</p></li>
</ul></li>
</ul>
<p>【実務上の落とし穴】</p>
<ul class="wp-block-list">
<li><p><strong>可用性とのトレードオフ</strong>: 強力なサニタイズ(DOMPurify等)を導入すると、既存の複雑な帳票レイアウトが崩れる可能性があります。移行時には主要なPDFテンプレートの回帰テストが必須です。</p></li>
<li><p><strong>誤検知のリスク</strong>: 数式や特定の記号を多用する業務(数理、法務等)では、サニタイズルールが正常な入力を「攻撃」と誤認して削除するケースがあります。</p></li>
</ul>
<p>【まとめ】
組織として今すぐ確認・実施すべき3つの優先事項:</p>
<ol class="wp-block-list">
<li><p><strong>依存関係の特定</strong>: <code>npm list jspdf</code> を実行し、影響を受けるバージョン(特に2.x系の一部)がプロジェクトに含まれていないか確認する。</p></li>
<li><p><strong>サニタイズ処理の挿入</strong>: PDF生成ロジックの直前に、DOMPurify等によるホワイトリスト形式のバリデーションが実装されているかコードレビューを行う。</p></li>
<li><p><strong>CSPの強化</strong>: PDFオブジェクトからのスクリプト実行を防ぐため、HTTPレスポンスヘッダーに <code>Content-Security-Policy: object-src 'none';</code> を適用する。</p></li>
</ol>
<hr/>
<p><strong>参考文献:</strong></p>
<ul class="wp-block-list">
<li><p><a href="https://github.com/parallax/jsPDF">GitHub – parallax/jsPDF: Client-side JavaScript PDF generation for everyone.</a></p></li>
<li><p><a href="https://www.jpcert.or.jp/">JPCERT/CC: 脆弱性対策情報</a></p></li>
<li><p><a href="https://cheatsheetseries.owasp.org/">OWASP: PDF Security Guide</a></p></li>
</ul>
{
“style_prompt”: “CSIRT_TECHNICAL_ADVISORY”,
“priority”: “HIGH”,
“target_audience”: “Security_Engineers_and_Developers”,
“version”: “1.0”
}
本記事はGeminiの出力をプロンプト工学で整理した業務ドラフト(未検証)です。
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での検知ポイント:
応急的な緩和策(Workaround):
【実務上の落とし穴】
【まとめ】
組織として今すぐ確認・実施すべき3つの優先事項:
依存関係の特定: npm list jspdf を実行し、影響を受けるバージョン(特に2.x系の一部)がプロジェクトに含まれていないか確認する。
サニタイズ処理の挿入: PDF生成ロジックの直前に、DOMPurify等によるホワイトリスト形式のバリデーションが実装されているかコードレビューを行う。
CSPの強化: PDFオブジェクトからのスクリプト実行を防ぐため、HTTPレスポンスヘッダーに Content-Security-Policy: object-src 'none'; を適用する。
参考文献:
ライセンス:本記事のテキスト/コードは特記なき限り
CC BY 4.0 です。引用の際は出典URL(本ページ)を明記してください。
利用ポリシー もご参照ください。
コメント