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手动解析头部的宽高,若超过安全阈值则拒绝;或使用沙箱/内存限制防范进程崩溃。

[!] CONTACT_CHANNELS

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

> PING_AUTHOR (@A1RedTeam)