Pillow EPS解析器负字节计数引发无限循环DoS漏洞(CVE-2026-59203)
Pillow图像库CVE-2026-59203拒绝服务漏洞分析:EPS解析器因未校验%%BeginBinary负字节计数导致无限循环CPU耗尽。影响版本12.0.0-12.2.0。攻击者无需Ghostscript即可通过Image.open()触发。提供修复建议及缓解措施。
🔓 Medium 漏洞利用
Pillow图像库的EPS解析器在处理恶意构造的EPS文件时,因未验证%%BeginBinary指令中的字节计数是否为负值,导致文件指针向后回退并反复解析同一指令,造成无限循环和CPU耗尽。攻击者无需执行Ghostscript或调用Image.load(),仅通过Image.open()即可触发拒绝服务。
来源:OSV | 2026-07-20 | 原文链接
🔍 关键发现
- Pillow 12.0.0至12.2.0版本中的EpsImagePlugin.py存在漏洞,解析%%BeginBinary指令时未校验bytecount非负性。
- 攻击者提供负字节计数(如%%BeginBinary:-18)可使文件指针回退至同一行,陷入无限解析循环,导致CPU资源耗尽。
- 该漏洞不依赖Ghostscript执行或Image.load()调用,仅需Image.open()即可触发,影响依赖Pillow处理用户上传EPS文件的Web服务、后台任务等场景。
⚔️ 攻击链分析
['攻击者构造包含%%BeginBinary:-18指令的恶意EPS文件。', '目标应用调用Image.open()解析该文件。', 'EpsImagePlugin读取负数bytecount后执行fp.seek(-18, SEEK_CUR),使指针回退至指令行起始。', '解析器重复读取同一行,形成无限循环,耗尽CPU资源。']
🚩 失陷指标 (IOC)
POC文件特征:%%BeginBinary:-18 或任意负数值进程行为:Image.open()调用后CPU使用率持续100%且不返回
🛡️ 缓解建议
- ✅ 立即升级Pillow至12.3.0或更高版本(官方已修复,添加了负值校验)。
- ✅ 若无法升级,在调用Image.open()前增加超时机制或进程隔离(如使用subprocess限制CPU时间)。
- ✅ 对上传的EPS文件进行预处理:扫描%%BeginBinary字段并拒绝负字节计数。
涉及漏洞:["CVE-2026-59203"]
⚠️ 本文仅供安全研究与学习,IOC 信息请勿用于非法目的。
🤖 常见问题解答(FAQ)
❓ 此漏洞影响哪些Pillow版本?
Pillow 12.0.0至12.2.0版本受影响;11.3.0及更早版本不受影响。
❓ 触发漏洞是否需要用户交互?
不需要。攻击者仅需将恶意EPS文件提供给目标应用,应用通过Image.open()解析即可触发。
❓ 官方修复方案是什么?
官方在EpsImagePlugin.py中增加对bytecount < 0的检查,若为负则触发解析异常而非执行seek。