Pillow PDF解析器解压炸弹漏洞:950KB文件即可耗尽1GB内存
Pillow库(CVE-2026-59200)存在高危解压炸弹漏洞,PdfParser在解析PDF时未限制FlateDecode解压输出大小,攻击者可用950KB文件耗尽1GB内存导致服务端OOM。本文详细分析漏洞原理、PoC与缓解措施,适合安全运维及开发人员阅读。
🔓 High 漏洞利用
Pillow库的PdfParser模块在处理PDF文件时,未对FlateDecode解压输出大小进行上限控制。攻击者可通过构造包含高度压缩数据的恶意PDF文件(约950KB),触发zlib解压后膨胀至1GB以上,导致服务端内存耗尽(OOM),造成拒绝服务。此漏洞影响所有使用Pillow解析不可信PDF的应用。
来源:OSV | 2026-07-20 | 原文链接
🔍 关键发现
- PdfStream.decode()将PDF字典中的Length字段直接作为zlib.decompress()的bufsize参数,而bufsize仅为初始缓冲区提示,并非大小上限。
- 攻击者利用约950KB的PDF文件即可触发1GB内存分配,压缩比高达1028倍。
- 漏洞独立于pdfminer.six中的同类问题,属于Pillow自身代码缺陷。
⚔️ 攻击链分析
1. 攻击者构造恶意PDF,包含一个FlateDecode压缩流,实际内容为大量零字节(1GB原始数据),压缩后仅约950KB。 2. 受害者应用通过Pillow的PdfParser解析该PDF。 3. PdfStream.decode()调用zlib.decompress()时仅传递压缩流Length(实际压缩后大小),无上限检查。 4. zlib解压出1GB数据,导致服务器内存耗尽、OOM终止或服务降级。
🚩 失陷指标 (IOC)
PDF文件大小约950KB,但实际解压后内容为大量重复零字节(1GB)。PDF字典中Filter为/FlateDecode,Length字段与压缩后大小一致(例如约97KB)。
🛡️ 缓解建议
- ✅ 升级Pillow至修复版本,或应用官方建议的补丁:在decode()返回前检查解压结果是否超过200MB上限,超限则抛出ValueError。
- ✅ 对不可信的PDF文件进行预处理,使用沙箱或资源限制(如内存配额)隔离解析过程。
涉及漏洞:["CVE-2026-59200"]
⚠️ 本文仅供安全研究与学习,IOC 信息请勿用于非法目的。
🤖 常见问题解答(FAQ)
❓ 这个漏洞需要用户交互吗?
不需要。攻击者只需提交恶意PDF文件,应用自动解析即触发,无需用户点击或额外操作。
❓ 影响哪些Pillow版本?
影响所有使用Pillow PdfParser模块解析PDF的版本,包括12.1.1及更早。需关注官方后续补丁。
❓ 与其他解压炸弹漏洞有何区别?
该漏洞位于Pillow自身的PdfParser.py,而非pdfminer.six。且攻击者通过控制Length字段绕过简单校验,关键缺陷在于bufsize语义误解。