Pillow TGA编码器漏洞:堆内存越界读取可泄露57KB敏感数据
CVE-2026-59198(中等严重性)揭示了Pillow库在处理TGA RLE压缩保存时的一个堆缓冲区越界读取漏洞。攻击者可通过构造mode '1'大宽度图像,使编码器泄露相邻堆内存中最多约57KB的敏感数据。本文提供技术细节、PoC及缓解措施,建议所有使用Pillow的用户及时升级至12.3.0以上版本。
🔓 Medium 漏洞利用
攻击者可通过诱导用户使用Pillow库将特殊构造的mode '1'图像保存为TGA格式(启用RLE压缩),触发TGA编码器中的堆缓冲区越界读取问题,导致最多约57KB的相邻堆内存数据被序列化到输出的TGA文件中,造成信息泄露。该漏洞无需堆布局修饰或恶意输入文件,仅通过公开API即可利用。
来源:OSV | 2026-07-20 | 原文链接
🔍 关键发现
- Pillow的TGA RLE编码器在处理mode '1'图像时,错误地将每个像素当作1个字节处理,而实际分配的row buffer仅为ceil(width/8)字节,导致读取超出分配边界。
- 最大宽度(65535像素)下,单行图像可泄露约57343字节的相邻堆数据,覆盖率高达99.92%,且泄露数据以最多128字节的小包形式分散在TGA文件内。
- 漏洞存在于公共API `im.save(out, format='TGA', compression='tga_rle')`中,无需特殊权限或用户交互,仅需提供正常图像并调用保存即可触发。
⚔️ 攻击链分析
["攻击者构造一个mode '1'、宽度为65535(或任意大于分配缓冲区长度的宽度)的单行图像。", '诱导受害者(如服务端脚本或图像处理工具)使用Pillow保存该图像为TGA格式并启用RLE压缩。', '在保存过程中,编码器读取超出row buffer的堆内存,并将这些数据作为原始像素块写入输出TGA文件。', '攻击者获取生成的TGA文件后,解析其中超出像素数据部分的字节,即可恢复出相邻堆中的敏感信息(如密钥、会话令牌等)。']
🛡️ 缓解建议
- ✅ 升级Pillow至12.3.0或更高版本(官方已修复此漏洞),也可检查CVE-2026-59198对应补丁。
- ✅ 在无法升级时,避免对mode '1'图像使用TGA RLE压缩保存,或者先转换为其他模式(如'L'或'RGB')再保存。
- ✅ 建议在沙箱或低权限环境中运行依赖Pillow的图像处理服务,并监控异常大的TGA输出文件。
涉及漏洞:["CVE-2026-59198"]
⚠️ 本文仅供安全研究与学习,IOC 信息请勿用于非法目的。
🤖 常见问题解答(FAQ)
❓ 该漏洞如何被触发?
通过调用Pillow的`Image.save(out, format='TGA', compression='tga_rle')`保存mode '1'图像,且宽度大于实际分配的row buffer(ceil(width/8)字节)时触发。
❓ 受影响的Pillow版本有哪些?
所有未打补丁的Pillow版本均可受影响,官方在12.3.0中修复。建议检查使用的Pillow版本是否低于12.3.0。
❓ 如何确认是否已泄露堆数据?
可检查生成的TGA文件是否包含超出预期像素长度的数据,或者利用PoC中的extract_oob_payload函数提取越界字节并分析其非零比例。