Pillow库爆严重堆越界写漏洞:超大滤波核引发整数溢出,可致远程代码执行

Pillow图像处理库曝出CVE-2026-59197高危漏洞:RankFilter系列API因整数溢出导致堆越界写,影响版本1.0至12.2.0。攻击者可利用超大滤波核触发越界,写入可控字节。本文深度分析漏洞根因、攻击链与修复方案。

🔓 High 漏洞利用

Pillow图像处理库的RankFilter系列API在处理极大奇数滤波核大小时,因先执行expand()再校验大小,导致整数溢出引发堆越界写。攻击者可构造特制图像和滤波参数,触发越界写,进而可能实现代码执行或信息泄露。

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

🔍 关键发现

  • CVE-2026-59197:Pillow库中ImageFilter.RankFilter、MedianFilter、MinFilter、MaxFilter均受影响
  • 漏洞根因:Python层的expand()调用在C层的RankFilter大小校验之前执行,未对扩展尺寸进行溢出检查
  • ImagingExpand()函数计算输出图像大小时使用有符号整数,INT_MAX+1导致回绕为1x1,后续循环仍按巨大margin写越界
  • PoC证实从Pillow 1.0到12.3.0.dev0均存在漏洞,4字节写模式可写入攻击者控制的像素值

⚔️ 攻击链分析

1. 攻击者构造一个模式为'I'或'F'的小尺寸图像(如3x3),并指定一个超大奇数滤波核大小(如4294967295)。 2. 目标应用调用im.filter(ImageFilter.MedianFilter(size))触发漏洞。 3. Python层先执行image.expand(INT_MAX, INT_MAX),C层ImagingExpand计算输出尺寸时整数溢出,只分配了1x1的缓冲区。 4. 边界扩充循环仍按INT_MAX的margin顺序写入,导致堆越界写,攻击者控制的像素值被写入堆上后续内存。

🚩 失陷指标 (IOC)

  • Pillow版本1.0~12.2.0及12.3.0.dev0均受影响
  • 触发条件:size参数 = 4294967295(或任意大于INT_MAX/2的奇数)
  • PoC脚本:from PIL import Image, ImageFilter; Image.new('L',(3,3),128).filter(ImageFilter.MedianFilter(4294967295))

🛡️ 缓解建议

  • ✅ 立即升级Pillow至修复版本(建议>12.3.0或等待厂商补丁)
  • ✅ 在调用RankFilter相关API前,自行校验size参数,确保size * size * sizeof(FLOAT32)不溢出且size ≤ 合理阈值(如MAX_KERNEL_SIZE)
  • ✅ 对不可信用户输入进行严格校验,限制滤波核大小最大值(如≤2047)
  • ✅ 启用地址空间布局随机化(ASLR)及堆栈保护缓解利用难度

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


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

🤖 常见问题解答(FAQ)

❓ 为什么expand()放在校验之前会导致漏洞?

Python层先调用image.expand(INT_MAX, INT_MAX)触发C函数ImagingExpand,该函数未检查输出尺寸溢出,仅判断margin是否为负。INT_MAX+2*INT_MAX导致回绕为小尺寸,但仍执行边界写入,造成堆越界。

❓ 攻击者能否控制越界写入的值?

可以。越界写入的值是源图像边界像素的拷贝。若攻击者可提供图像内容(如TIFF中自定义像素值),则可控制写入的字节,模式'I'和'F'支持4字节写入。

❓ 缓解措施中禁用RankFilter是否有效?

不能简单地禁用,因为该漏洞也影响MedianFilter、MinFilter、MaxFilter(均继承自RankFilter)。应升级库或在上层添加size校验。

[!] CONTACT_CHANNELS

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

> PING_AUTHOR (@A1RedTeam)