Fomovet/cve-2026-24688
GitHub: Fomovet/cve-2026-24688
针对 pypdf 库循环大纲引用 DoS 漏洞(CVE-2026-24688)的概念验证代码与复现工具。
Stars: 0 | Forks: 0
# CVE-2026-24688 - pypdf - 循环引用 DoS 漏洞
本仓库包含用于触发 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` - 本文件
**警告:** 如果您不密切关注内存消耗并及时取消运行,这些测试可能会导致您的系统崩溃。
### 自动化测试(不安全)
```
# 运行自动化测试脚本(带有 timeout 保护)
chmod +x test_pypdf.sh
./test_pypdf.sh
# 这将:
# 1. 安装存在漏洞的 pypdf 版本
# 2. 运行带有 15 秒 timeout 的测试
# 3. 展示内存消耗行为
```
### 手动测试
#### 测试 1:受控测试(使用 timeout 限制 10 秒)
```
# 安装 pypdf(存在漏洞的版本 6.6.0)
pip install "pypdf==6.6.0"
# 使用 timeout 运行
timeout 10s python3 simple_read_pdf.py malicious_circular_outline.pdf
```
#### 测试 2:完全崩溃测试(不安全)
```
# 安装 pypdf(存在漏洞的版本 6.6.0)
pip install "pypdf==6.6.0"
# 不使用 timeout 运行
python3 simple_read_pdf.py malicious_circular_outline.pdf
```
## 漏洞详情
### 存在漏洞的代码
**位置:** [`pypdf/_doc_common.py` - `_get_outline()` 方法(第 858-873 行)](https://github.com/py-pdf/pypdf/blob/main/pypdf/_doc_common.py#L858-L873)
```
def _get_outline(self, node, outline=None):
while True: # ❌ NO cycle detection!
outline_obj = self._build_outline_item(node)
if outline_obj:
outline.append(outline_obj) # ❌ Heap allocation in loop!
if "/Next" not in node:
break
node = node["/Next"] # ❌ Follows circular references
```
**根本原因:** 没有访问记录集合,没有迭代限制,内存不断分配
## 影响
### 确认的测试结果
**实际测试:**
- 结果:系统崩溃,需要硬重启
- 时间线:约 5 分钟导致系统完全崩溃 ()
- 内存:消耗 30GB+
- CPU:所有核心 100%(系统抖动)
**攻击特征:**
- ✅ 100% CPU(立即触发)
- ✅ 内存线性增长
- ✅ 全系统崩溃
- ✅ 需要硬重启
- ✅ 潜在的数据丢失
## 修复
已在 6.6.2 版本中修复
https://github.com/py-pdf/pypdf/security/advisories/GHSA-2q4j-m29v-hq73
标签:Maven, PDF解析, Python, 应用安全, 拒绝服务攻击, 无后门, 漏洞验证, 逆向工具, 配置错误