漏洞概述:CVE-2026-31938
CVE ID:CVE-2026-31938
漏洞名称:jsPDF 输出方法中的 HTML 注入(HTML Injection in output methods)
发布日期:2026年3月17日(NVD/Mitre 记录于 2026-03-18)
发现者:sofianeelhor(GitHub 用户)
修复者:jsPDF 项目维护者
受影响库:jsPDF(npm 包 jspdf),一款广泛用于浏览器端生成 PDF 的 JavaScript 库。
该漏洞于 2026 年 3 月 17 日公开披露,目前尚未见公开的在野利用报告,但因严重性高,建议立即修复。
影响分析
该漏洞允许攻击者通过控制 output 函数的 options 参数,将任意 HTML 代码(例如恶意脚本)注入到打开所创建 PDF 文件的浏览器上下文中。这为 HTML注入攻击打开了大门。
受影响的重载方法和选项包括:
”pdfobjectnewwindow”:pdfObjectUrl 选项以及整个 options 对象,该对象会以 JSON 序列化的方式原封不动地包含在生成的 HTML 字符串中。
”pdfjsnewwindow”:pdfJsUrl 和 filename 选项。
”dataurlnewwindow”:filename 选项。
攻击场景与原理
攻击可能在以下场景成立:
- 应用程序将
output 方法的选项暴露给用户控制(常见于报告生成、动态 PDF 下载等 Web 界面)。
- 这些用户提供的值未经充分过滤,就被直接传递给存在漏洞的
output 方法重载。
- 受害者在其浏览器中使用该重载方法创建并打开 PDF 文件。
- 浏览器在解析生成的 HTML 内容时,会执行攻击者注入的脚本。
这样一来,攻击者就能在受害者的浏览器上下文中运行恶意代码,窃取 Cookie、LocalStorage、会话密钥,甚至修改页面内容,为进一步攻击铺平道路。
攻击向量示例
以下是一个简化的攻击代码示例,展示了如何通过控制 filename 参数注入脚本:
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’
});
漏洞利用与攻击链
利用前提:
- 应用暴露
output 方法的选项给用户(常见于报告生成、动态 PDF 下载等 Web 界面)。
- 受害者必须在浏览器中实际“打开”生成的 PDF(新窗口模式)。
典型攻击流程:
- 注入:攻击者通过 Web 接口或 API 提交恶意的
filename 或 pdfJsUrl 等参数。
- 触发:受害者执行生成 PDF 的操作,并在浏览器中打开该 PDF 文件。
- 执行:浏览器解析嵌入 PDF 查看器的 HTML 时,执行了攻击者注入的恶意脚本,导致敏感信息泄露或后续攻击。
当前,虽然尚未有公开的 PoC(概念验证代码)或 Exploit(漏洞利用程序),但由于构造原理简单,理论上可被立即利用。目前该漏洞尚未被列入 CISA KEV(已知被利用漏洞)目录。
修复方案
官方补丁:
- 此漏洞已在
jspdf@4.2.1 版本中得到修复。强烈建议所有使用 jsPDF 的项目立即升级至此版本或更高版本。
临时变通方法:
如果暂时无法升级,应在将任何用户输入传递给 output 方法之前,对其进行严格的清理和验证,确保其中不包含可执行的 HTML 或 JavaScript 代码。
总结与建议
CVE-2026-31938 是一个典型的客户端 HTML注入漏洞,它提醒我们,即使是在处理 PDF 生成这类看似“安全”的输出时,对用户输入的处理也绝不能掉以轻心。前端开发者应时刻保持安全意识,对来自用户或外部接口的所有数据保持怀疑态度。
对于此类安全问题,及时关注官方通告、更新依赖库是最有效的防御手段。如果你在项目中遇到了类似的安全挑战,欢迎到 云栈社区 与更多开发者交流探讨。
|