本仓库包含用于触发 CVE-2026-24688 的概念验证代码。
pypdf 的大纲(书签)解析逻辑中存在严重的拒绝服务漏洞。当处理包含循环大纲引用的 PDF 时,解析器会进入无限循环,持续分配内存,在我的机器(TM)上每秒消耗数百 MB 内存,并导致整个系统崩溃。
这是系统级 DoS,而不仅仅是应用程序挂起。
malicious_circular_outline.pdf - 带有循环大纲的利用 PDF(754 字节)create_malicious_pdf.py - 用于生成利用 PDF 的脚本simple_read_pdf.py - 用于复现漏洞的简单测试脚本test_pypdf.sh - 自动化测试脚本(安装 pypdf 并运行测试)README.md - 本文件警告: 如果您不注意内存消耗并及时取消,这些测试可能会导致系统崩溃。
# 运行自动化测试脚本(带超时保护)
chmod +x test_pypdf.sh
./test_pypdf.sh
# 这将:
# 1. 安装存在漏洞的 pypdf 版本
# 2. 使用 15 秒超时运行测试
# 3. 显示内存消耗行为
# 安装 pypdf(存在漏洞的版本 6.6.0)
pip install "pypdf==6.6.0"
# 带超时运行
timeout 10s python3 simple_read_pdf.py malicious_circular_outline.pdf
# 安装 pypdf(存在漏洞的版本 6.6.0)
pip install "pypdf==6.6.0"
# 不带超时运行
python3 simple_read_pdf.py malicious_circular_outline.pdf
位置: pypdf/_doc_common.py - _get_outline() 方法(第 858-873 行)
def _get_outline(self, node, outline=None):
while True: # ❌ 没有循环检测!
outline_obj = self._build_outline_item(node)
if outline_obj:
outline.append(outline_obj) # ❌ 循环中堆分配!
if "/Next" not in node:
break
node = node["/Next"] # ❌ 跟随循环引用
根本原因: 没有访问集合,没有迭代限制,持续内存分配
真实世界测试:
攻击特征:
已在 6.6.2 版本中修复
https://github.com/py-pdf/pypdf/security/advisories/GHSA-2q4j-m29v-hq73