Pillow BDF字体解析漏洞:20000x20000像素绕过炸弹检查,47MB内存无声分配

CVE-2026-55379:Pillow BDF字体解析绕过解压炸弹保护,攻击者用270字节BDF文件分配47MB内存,多字形可达1.95GB,导致拒绝服务。分析漏洞原理、PoC及防御措施。

🔓 High 漏洞利用

攻击者通过构造恶意的BDF字体文件,利用Pillow库中`BdfFontFile.py`在处理空的BITMAP段时直接调用`Image.new()`而绕过`_decompression_bomb_check()`,导致内存无限分配。270字节的BDF即可触发47MB内存分配,多字形可放大至GB级,造成拒绝服务。

来源:OSV | 2026-07-20 | 原文链接

🔍 关键发现

  • PIL/BdfFontFile.py 中 bdf_char() 解析 BBX width/height 后直接传入 Image.new(),未调用 _decompression_bomb_check()
  • Image.open() 路径有 MAX_IMAGE_PIXELS 限制(约 89M 像素),但 BDF 加载路径完全绕过该保护
  • 攻击利用空 BITMAP 段触发 ValueError,随后进入 Image.new() 分配内存,无大小校验
  • 单字形 20000×20000 即可分配 47MB C-heap,256 字形可达约 1.95GB,持续占用直到字体对象被回收

⚔️ 攻击链分析

1. 构造恶意 BDF 文件,设置超大 BBX 宽高(如 20000×20000)并保留空 BITMAP 段 2. 受害者加载该 BDF 文件(如 ImageFont.load 或 BdfFontFile 解析) 3. 解析器进入异常分支调用 Image.new(),绕过炸弹检查分配大内存 4. 多字形攻击可耗尽服务器内存,导致拒绝服务

🚩 失陷指标 (IOC)

  • BDF 文件中 BBX 字段值大于 89478485 像素(如 20000 20000)
  • BDF 文件中 BITMAP 段内容为空(导致 ValueError 进入脆弱路径)

🛡️ 缓解建议

  • ✅ 升级到 Pillow 已修复版本(≥10.x 中合入补丁)或等待官方 CVE 修复
  • ✅ 避免从不可信来源加载 BDF 字体文件;如需加载,增加前置像素检查或内存限制
  • ✅ 在应用层对 BDF 解析结果进行内存监控,限制单字体最大像素数

涉及漏洞:["CVE-2026-55379"]


⚠️ 本文仅供安全研究与学习,IOC 信息请勿用于非法目的。

🤖 常见问题解答(FAQ)

❓ 如何检测是否被此漏洞攻击?

检查服务器内存突然飙升且关联过程加载了BDF字体文件;查看日志中是否有DecompressionBombWarning被抑制或BdfFontFile初始化时未异常退出。

❓ Image.new()为何不检查大小?

Image.new()内部仅调用_check_size()校验大于等于0,未引用MAX_IMAGE_PIXELS;而Image.open()有单独炸弹检查。BDF错误路径遗漏了该检查。

❓ 修复版本何时发布?

截至2026年7月,官方已在Pillow仓库提交补丁,预计下一个安全版本(如10.5.0)修复。建议关注GHSA-45hq-cxwh-f6vc通告。

[!] CONTACT_CHANNELS

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

> PING_AUTHOR (@A1RedTeam)