【翻译】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查看器,广泛应用于:

  1. Firefox浏览器内置PDF查看器(所有版本<126)
  2. Node.js模块pdfjs-dist(每周约270万次下载)
  3. 各种基于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)的处理过程中:

  1. compileGlyph方法初始化cmds数组,包含savetransformscalerestore命令
  2. transform命令使用fontMatrix数组的值
  3. 当从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文件路径
  • 监控用户行为

影响范围

  1. Firefox用户:所有使用内置PDF.js版本低于126的Firefox浏览器
  2. Web应用:使用易受攻击版本PDF.js的网站(如Git托管平台、笔记应用等)
  3. 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)

实施严格的内容安全策略,禁用evalFunction构造函数:

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演示更具破坏性。

开发者建议

  1. 审计应用程序是否直接或间接使用PDF.js
  2. 对于服务器端PDF处理,虽然无头模式可能不受影响,但仍建议更新
  3. 考虑使用PDF.js的沙箱版本或替代方案处理不受信任的PDF文件

总结

CVE-2024-4367是一个严重的客户端代码执行漏洞,影响广泛使用的PDF.js库。通过精心构造的PDF文件,攻击者可以在受害者上下文中执行任意JavaScript代码,可能导致数据泄露、账户接管甚至本地代码执行。及时更新和适当的安全配置是防范此漏洞的关键。

相似文章
相似文章
 全屏