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通告。