Pillow图像库高危漏洞:ImageCmsTransform堆越界写入可致任意代码执行

Pillow图像库被披露一个高危堆越界写入漏洞(CVE-2026-59205),位于ImageCmsTransform.apply()方法。当输出图像模式不匹配时,LittleCMS写入超出分配缓冲区的数据,攻击者可通过源像素控制溢出内容。该漏洞影响所有使用Pillow处理ICC色彩变换的应用,可能导致内存破坏和代码执行。建议立即升级或实施模式验证缓解措施。

🔓 High 漏洞利用

Pillow的ImageCmsTransform.apply()接口缺失对输出图像模式的校验,攻击者可通过提供模式不匹配的输出图像(如L模式)诱使LittleCMS写入超出分配行大小的数据,造成可控的堆越界写入。该漏洞可被利用实现内存破坏甚至远程代码执行,影响使用ICC色彩变换的Python应用。

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

🔍 关键发现

  • Pillow未对ImageCmsTransform.apply()的输入/输出图像模式进行验证,允许RGBA→RGBA变换作用于L模式输出图像。
  • LittleCMS根据变换声明每像素写入4字节,而L模式每像素仅分配1字节,导致堆缓冲区溢出(如宽4096像素时写入16384字节但仅分配4096字节)。
  • 攻击者可控制源像素内容,进而精确控制越界写入的数据(如写入特定指针值),可能触发任意地址读写或代码执行。

⚔️ 攻击链分析

1. 攻击者创建RGBA→RGBA的ICC变换对象。2. 构造相同尺寸但模式为L的输出图像。3. 调用transform.apply(im, out),底层C函数仅检查尺寸未检查模式。4. LittleCMS按4字节/像素写入到仅1字节/像素的行缓冲区,导致堆越界写入,损坏堆元数据或覆盖关键指针。

🚩 失陷指标 (IOC)

  • 崩溃日志中出现'free(): invalid next size (normal)'或类似glibc堆错误。
  • 异常指针值如0x4443424144434241(来自源像素ABCD的LE编码)

🛡️ 缓解建议

  • ✅ 升级Pillow至已修复版本(如>=12.4.0,需确认官方发布),或手动打补丁:在apply()方法中增加模式校验。
  • ✅ 在调用apply()前主动验证im.mode==self.input_mode以及imOut.mode==self.output_mode,拒绝不匹配的输入。

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


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

🤖 常见问题解答(FAQ)

❓ 如何判断我的Pillow版本是否受影响?

检查版本:Pillow < 修复版本(如12.4.0前的所有版本均受影响)。可通过pip show pillow查看,或运行PoC代码观察是否触发堆错误。

❓ 攻击者如何利用此漏洞实现远程代码执行?

通过精心构造源像素(如输入RGBA值对应攻击者控制的指针),利用越界写入覆盖堆中的函数指针或对象元数据,在后续处理中劫持控制流。需要结合堆布局与ASLR绕过。

❓ 临时无法升级时,有什么缓解措施?

在调用ImageCmsTransform.apply()前手动校验输出图像模式:if imOut.mode != transform.output_mode: raise ValueError。同时确保输入图像模式与变换输入模式一致。

[!] CONTACT_CHANNELS

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

> PING_AUTHOR (@A1RedTeam)