
0x00 前言
jsPDF 是一个使用 JavaScript 创建 PDF 文档的开源库,它允许开发者直接在浏览器或 Node.js 环境中生成、操作 PDF 文件,无需依赖服务器端处理或额外插件。该库功能全面,支持添加文本、图像、图形、表格,并允许设置字体、颜色和布局。通过其丰富的 API,用户可以轻松实现复杂文档的生成,如报告、发票和表单,并能以多种方式输出,包括浏览器内预览、下载或作为数据流传输。
0x01 漏洞描述
用户对输出函数的options参数的控制允许攻击者将任意HTML(如脚本)注入到打开创建的PDF的浏览器上下文中。受影响的重载和选项包括:
“pdfojectnewwindow”:pdfObjectUrl选项和整个选项对象,它是JSON序列化的,并逐字包含在生成的HTML字符串中。
“pdfjsnewindow”:pdfJsUrl和文件名选项
“dataurlnewwindow”:文件名选项
在以下情况下可以利用该漏洞:攻击者为输出选项提供值,例如通过web界面。然后,这些值未经消毒(自动或半自动)传递给攻击受害者。受害者使用浏览器中的一种易受攻击的方法重载创建并打开带有攻击向量的PDF。因此,攻击者可以注入在受害者浏览器上下文中运行的脚本,并从该上下文中提取或修改机密。
0x02 CVE编号
CVE-2026-31938
0x03 影响版本
jsPDF <=4.2.0
0x04 漏洞详情
POC:
import { jsPDF } from 'jspdf';
const doc = new jsPDF();
const payload = 'x\"></iframe><script>window.__n=1</script><iframe src="';
doc.output('pdfjsnewwindow', {
filename: payload,
pdfJsUrl: 'viewer.html'
});0x05 参考链接
https://github.com/parallax/jsPDF/security/advisories/GHSA-wfv2-pwc8-crg5