jsPDF 本地文件包含/路径遍历(CVE-2025-68428)漏洞分析
字数 1329
更新时间 2026-01-09 12:08:42

jsPDF 本地文件包含/路径遍历漏洞(CVE-2025-68428)教学文档

漏洞概述

CVE-2025-68428是jsPDF库(Node.js构建版)中存在的一个本地文件包含/路径遍历漏洞。该漏洞源于jsPDF的部分方法未对用户传入的文件路径进行严格过滤与校验,导致攻击者可以读取服务器上的敏感文件。

漏洞详情

受影响版本

  • 受影响版本:<= 3.0.4
  • 已修复版本:>= 4.0.0

漏洞原理

jsPDF的以下方法存在路径遍历漏洞:

  • loadFile
  • addImage
  • html
  • addFont

这些方法未对用户输入的文件路径进行充分验证,攻击者可以通过构造包含路径遍历序列(如../)的恶意路径,绕过预期的资源目录限制,读取系统上的任意文件。

漏洞复现(PoC)

import { jsPDF } from "jspdf";

const doc = new jsPDF();
// 通过路径遍历读取系统敏感文件
doc.addImage("../secret.txt", "JPEG", 0, 0, 10, 10);
doc.save("test.pdf");

在此示例中,攻击者通过../secret.txt路径遍历序列,成功读取了位于jsPDF工作目录上级的secret.txt文件,并将其内容嵌入到生成的PDF文档中。

漏洞分析

攻击流程

  1. 路径解析:jsPDF未对用户输入的文件路径进行验证,直接将其解析为绝对路径
  2. 文件读取:通过readFileSync函数读取目标文件内容
  3. 内容嵌入:将读取到的文件内容嵌入到生成的PDF文档中
  4. 文件保存:通过writeFileSync将包含敏感信息的PDF保存到本地

修复方案

官方提供了两种解决方案:

方案一:Node.js权限控制

运行Node.js时添加权限控制标志:

node --permission --allow-fs-read=<allowed_directory>

方案二:代码层面配置

在jsPDF中设置allowFsRead属性,限制可读取的文件和目录:

// 新版本修复后的安全用法
import { jsPDF } from "jspdf";

const doc = new jsPDF();
// 必须显式启用文件系统读取权限
doc.allowFsRead = true; // 或设置特定允许的目录
// 或者通过构造函数配置
const doc = new jsPDF({ allowFsRead: true });

补丁分析

修复commit:a688c8f479929b24a6543b1fa2d6364abb03066d

关键修复点:

  1. 添加了对process.permission的检查
  2. 引入了this.allowFsRead属性进行权限控制
  3. 在文件读取操作前进行权限验证

安全影响评估

风险等级

高危 - 可导致敏感信息泄露

受影响资源

攻击者可读取的敏感文件包括:

  • 配置文件(如.envconfig.json
  • 密钥文件(如SSH密钥、API密钥)
  • 系统文件(如/etc/passwd
  • 应用程序源代码
  • 数据库凭证文件

防护建议

对于开发者

  1. 立即升级jsPDF到4.0.0及以上版本
  2. 如无法立即升级,实施严格的输入验证和路径规范化
  3. 遵循最小权限原则,限制应用程序的文件系统访问权限

对于系统管理员

  1. 使用容器化部署,限制应用程序的文件系统访问范围
  2. 实施文件系统权限控制,确保应用程序只能访问必要的目录
  3. 定期进行安全审计和漏洞扫描

测试验证

漏洞存在性测试

使用受影响版本(<=3.0.4)运行PoC代码,检查是否能够成功读取系统文件。

修复验证

升级到修复版本(>=4.0.0)后:

  1. 未配置权限时,相关操作应抛出安全异常
  2. 正确配置权限后,功能应正常运作但仅限于允许的目录

总结

CVE-2025-68428是一个典型的不安全直接对象引用(IDOR)漏洞,强调了在文件操作中对用户输入进行严格验证的重要性。开发人员应当始终遵循安全编码实践,对所有的用户输入实施严格的验证和过滤机制。

相似文章
相似文章
 全屏