Pillow GD图像插件绕过解压炸弹防护:1037字节文件即可导致4.3GB内存耗尽
CVE-2026-55380:Pillow GD图像插件GdImageFile._open()未调用解压炸弹检查,攻击者可用1037字节文件触发4.3GB内存分配导致拒绝服务。该漏洞影响所有调用插件专用open()接口的应用,比标准Image.open()路径更容易被绕过。提供临时缓解与修复建议。
🔓 High 漏洞利用
Pillow图像处理库的GdImageFile插件在解析GD 2.x格式图像时,未调用_decompression_bomb_check()进行安全校验,攻击者可通过构造仅1037字节的恶意.gd文件,触发约4.3GB的C堆内存分配,导致服务进程崩溃(DoS)。该漏洞(CVE-2026-55380)影响所有调用GdImageFile.open()并随后执行load()的应用程序。
来源:OSV | 2026-07-20 | 原文链接
🔍 关键发现
- GdImageFile._open()直接读取GD 2.x头部的宽高字段(最大65535×65535像素),未调用任何解压炸弹检查,而标准Image.open()路径本应阻止此操作。
- 攻击载荷仅需1037字节(仅含GD头,无需像素数据),即可触发load_prepare()→C层分配4.3GB内存,远超默认阈值(约1.79亿像素)24倍。
- 同类插件WalImageFile已在之前正确修复,而GdImageFile未被同步更新,形成防护缺口。
⚔️ 攻击链分析
1. 攻击者构造1037字节的GD 2.x格式文件,头部宽高设置为65535×65535。 2. 受害者应用程序调用GdImageFile.open()处理该文件,无任何校验直接返回Image对象。 3. 应用程序随后调用.load()或任何触发延迟加载的操作。 4. Pillow在底层分配约4.3GB(65535²像素×1字节/像素)的C堆内存,导致内存耗尽或进程崩溃。
🚩 失陷指标 (IOC)
GD 2.x文件头部魔数:0xFFFE或0xFFFF(16位大端),后续宽高字段为0xFFFF 0xFFFF文件大小严格等于1037字节(仅GD头,无像素数据)Content-Type或文件扩展名为.gd,但头部不包含合法调色板以外的内容
🛡️ 缓解建议
- ✅ 立即升级Pillow至包含此修复的版本(检查CVE-2026-55380的补丁状态,或应用上游补丁)。
- ✅ 如无法升级,可在调用GdImageFile.open()后、load()前手动调用Image._decompression_bomb_check(),或使用标准Image.open()路径(但GdImageFile未注册,需另寻替代方案)。
- ✅ 在应用层对用户上传的.gd文件大小和分辨率进行预检查(如拒绝超过1024×1024的图像),并限制进程内存使用量(如使用cgroup/setrlimit)。
涉及漏洞:["CVE-2026-55380"]
⚠️ 本文仅供安全研究与学习,IOC 信息请勿用于非法目的。
🤖 常见问题解答(FAQ)
❓ 哪些应用程序受影响?
所有使用Pillow处理GD 2.x格式(.gd文件)并调用GdImageFile.open()的应用;若仅调用Image.open()则不受影响,因为该路径有检查。
❓ 攻击需要多大带宽?
只需发送1037字节的恶意文件,攻击成本极低,适合大规模分布式DoS。
❓ 临时缓解措施有哪些?
可在加载文件前通过struct/unpack手动解析头部的宽高,若超过安全阈值则拒绝;或使用沙箱/内存限制防范进程崩溃。