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语义误解。

[!] CONTACT_CHANNELS

如需商务合作、技术咨询或漏洞反馈,请通过以下离岸节点联系作者。

> PING_AUTHOR (@A1RedTeam)