Pillow PCF字体解析漏洞:1KB文件可触发1GB内存分配,绕过解压炸弹检测
Pillow库PCF字体解析漏洞CVE-2026-54059:_load_bitmaps()缺少解压炸弹检查,攻击者用148字节文件即可触发高达1.07GB内存分配,绕过现有保护。PoC已公开,影响所有加载不可信PCF字体的应用,属高危拒绝服务漏洞。修复需升级Pillow或实施外部尺寸校验。
🔓 High 漏洞利用
攻击者利用Pillow库中PcfFontFile._load_bitmaps()函数未调用_decompression_bomb_check()的缺陷,通过构造特制PCF字体文件(仅148字节),声明超大字符尺寸(如65535×131070像素),导致Image.frombytes()分配高达1.07GB内存,完全绕过现有的解压炸弹保护机制,造成拒绝服务。
来源:OSV | 2026-07-20 | 原文链接
🔍 关键发现
- _load_bitmaps()直接从PCF METRICS节读取攻击者控制的宽高值,未经过解压炸弹检查
- 最大可利用像素数达8,589,734,450,是DecompressionBombError阈值的48倍
- PcfFontFile从未通过Image.open()加载,因此完全缺失现有炸弹检查保护
- 存在持久攻击(匹配位图数据)和瞬态攻击(空数据触发分配后异常)两种路径
⚔️ 攻击链分析
1. 攻击者构造包含超大METRICS字段的恶意PCF字体文件(最小148字节) 2. 受害者服务调用PcfFontFile()加载该字体 3. _load_bitmaps()读取攻击者指定的宽高值,直接调用Image.frombytes()分配C堆内存(无炸弹检测) 4. 内存分配峰值可达1.07GB,导致服务内存耗尽或响应延迟,引发拒绝服务
🚩 失陷指标 (IOC)
PCF文件中METRICS节包含异常大的right-left或ascent+descent值(如>10000)文件体积极小(<200字节)但声明的字符尺寸极大(如14000x14000)PCF文件可能通过未经验证的用户上传、邮件附件或恶意网站传播
🛡️ 缓解建议
- ✅ 升级Pillow至包含补丁的版本(关注官方GitHub release)
- ✅ 对PCF字体文件来源进行严格信任控制,避免从不可信来源加载
- ✅ 在加载PcfFontFile前实施外部预处理校验,手动检查尺寸是否超过安全阈值
- ✅ 监控内存异常分配行为,设置进程内存限制(如ulimit)缓解单次大分配影响
涉及漏洞:["CVE-2026-54059"]
⚠️ 本文仅供安全研究与学习,IOC 信息请勿用于非法目的。
🤖 常见问题解答(FAQ)
❓ 为什么PcfFontFile不会走Image.open()保护路径?
PcfFontFile是独立加载器,直接解析PCF二进制格式,而Image.open()仅处理图像文件。因此原有的_decompression_bomb_check()从未被调用。
❓ 该漏洞需要用户交互吗?
不需要。只要服务调用PcfFontFile(io.BytesIO(pcf_data))加载攻击者提供的PCF数据即可触发,无需额外交互。
❓ 攻击能产生多大内存压力?
最大单个字符可分配1.07GB(65535×131070像素,1位/像素),且一个字体文件可包含多字符,总分配无限制。