Critical jsPDF flaw lets hackers steal secrets via generated PDFs

JavaScript アプリケーションで PDF 文書を生成するための jsPDF ライブラリには、 攻撃者が生成されたファイルに機密データを含めることで、 ローカルファイルシステムから機密データを盗むことを可能にする重大な脆弱性があります。

この脆弱性は、4.0より前のバージョンのjsPDFにおいて、ファイル読み込みメカニズム(loadFile)にサニタイズされていないパスを渡すことを許す、ローカルファイルのインクルードおよびパストラバーサルです。これはCVE-2025-68428として追跡され、深刻度スコアは 9.2 です。

jsPDF ライブラリは広く採用されているパッケージで、npm レジストリでは毎週 350 万以上のダウンロードがあります。

Wiz

jsPDFのNode.jsビルドでは、’loadFile’関数がローカルファイルシステムの読み込みに使用されている。問題は、ユーザー制御の入力がファイルパスとして渡され、jsPDFが生成されたPDF出力にファイルの内容を取り込んでしまう場合に発生します。

Exploitation example
悪用例
ソースParallax

addImage’、’html’、’addFont’など、他のファイル読み込みメソッドも影響を受けます。

jsPDFのセキュリティ速報によると、この問題はライブラリのNode.jsビルド、すなわちdist/jspdf.node.jsファイルとdist/jspdf.node.min.jsファイルのみに影響する。

アプリケーション・セキュリティ企業のEndor Labsは、詳細な技術レポートの中で、ファイルパスがハードコードされているか、信頼できる設定から取得されているか、入力に厳密な許可リストが使用されている場合、悪用のリスクは低いか、存在しないと述べている。

CVE-2025-68428は、jsPDFのバージョン4.0.0で、デフォルトでファイルシステムへのアクセスを制限し、代わりにNode.jsのパーミッションモードに依存することで修正された。

しかし、Endor Labsの研究者は、このモードはNode 20では実験的であるため、バージョン22.13.0、23.5.0、または24.0.0以降が推奨されると指摘している

考慮すべきもう1つの注意点は、開発者によって提案された回避策である’–permission’フラグを有効にすると、jsPDFだけでなくNode.jsプロセス全体に影響することである。

Endor Labsはまた、’–allow-fs-read’設定フラグに追加された過度に広範なファイルシステムパーミッションが、この修正を無効にすることを強調している。

Overly permissive configuration
過度に寛容な設定
:Endor Labs

jsPDFチームは、古いバージョンのNodeでは、ユーザーが提供したパスをjsPDFに渡す前にサニタイズすることを推奨しています。

数多くのプロジェクトでjsPDFが広く展開されていることを考えると、CVE-2025-68428は積極的な悪用の良い候補です。

.ia_ad { background-color:#width: 95%; max-width: 800px; margin: 15px auto; border-radius: 8px; border:1px solid #d6ddee; display: flex; align-items: stretch; padding: 0; overflow: hidden; }:0; overflow: hidden; } .ia_lef { flex: 1; max-width: 200px; height: auto; display: flex; align-items: stretch; } .ia_lef a { display: flex; width: 100%; height: 100%; } .ia_lef a img { width: 100%; height: 100%; border-radius: 8px 0 0 8px; margin: 0; display: block; } .ia_rig { flex: 2; padding:display: flex; flex-direction: column; justify-content: center; } .ia_rig h2 { font-size: 17px !important; font-weight: 700; color:#line-height: 1.4; font-family:margin: 0 0 14px 0; } .ia_rig p { font-weight: bold; font-size: 14px; margin: 0 0 clamp(6px, 2vw, 14px) 0; } .ia_button { background-color:#border:1px solid #3b59aa; color: black; text-align: center; text-decoration: none; border-radius: 8px; display: inline-block; font-size: 16px; font-weight: bold; cursor: pointer; padding:width: fit-content; } .ia_button a { text-decoration: none; color: inherit; display: block; } @media (max-width: 600px) { .ia_ad { flex-direction: column; align-items: center; } .ia_lef { max-width: 100%; } .ia_lef a img { border-radius: 8px 8px 0 0; } .ia_rig { padding:15px;
width: 100%;
}

.ia_button {
width: 100%;
margin: 0px auto;
}
}

秘密 セキュリティ・チートシート:スプロールからコントロールへ

古いキーのクリーンアップでも、AIが生成するコードのガードレールの設定でも、このガイドはチームが最初からセキュアに構築するのに役立ちます。

チートシートを入手して、秘密管理の手間を省きましょう。