Pillow 高危漏洞:巧设 stride 实现 mmap 越界读取,可窃取内存敏感数据

Pillow 库 McIdas 插件存在高危越界读取漏洞 CVE-2026-54058,攻击者通过构造恶意图像文件,利用 stride 参数检查缺失,导致内存敏感信息泄露或 DoS。详细分析攻击链、IOC 特征及修复建议。

🔓 High 漏洞利用

安全研究员披露 Pillow 库中的越界读取漏洞 CVE-2026-54058(严重等级 High)。攻击者通过构造恶意的 McIdas AREA 图像文件,将行步长(stride)设为极小值,绕过 mmap 边界检查,导致后续像素访问时读取超出映射区域的内存,造成敏感信息泄露或进程崩溃。该漏洞影响了所有默认启用 McIdas 插件且从路径打开用户上传图像的应用程序。

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

🔍 关键发现

  • Pillow 的 McIdas 插件未验证从文件头中提取的 stride 参数,攻击者可将其设为远小于实际行宽的值。
  • ImageFile.load 的 mmap 分支仅检查 offset+ysize*stride 是否超出缓冲区,缺少 stride≥行宽(xsize * pixelsize)的校验。
  • PyImaging_MapBuffer 在构建行指针时直接使用攻击者控制的 stride,后续像素读取(如 tobytes())将读取 xsize 字节,远超实际映射大小,导致越界访问。

⚔️ 攻击链分析

1. 攻击者制作特制 McIdas AREA 图像文件,在头部 256 字节中设置 w[9](xsize 极大值)、w[10](ysize=1)、w[11](mode=“L”)、w[14]=0、w[15]=1、w[34] 等字段,使 stride = 1。 2. Pillow 的 McIdasImagePlugin._open 读取头部,直接使用这些攻击者控制的值构造 tile(codec=“raw”,stride=1)。 3. ImageFile.load 选择 mmap 路径,仅检查 offset + ysize*stride ≤ 映射大小(此处为 2 ≤ 256,通过),然后调用 PyImaging_MapBuffer。 4. PyImaging_MapBuffer 构建行指针时,每行间距为 1 字节,但 linesize = xsize(例如 200000);当应用读取像素(如 Image.tobytes())时,从行指针开始读取 xsize 字节,超出映射范围,访问相邻进程内存。

🚩 失陷指标 (IOC)

  • 文件头部前8字节为 \x00\x00\x00\x00\x00\x00\x00\x04(McIdas 魔数)
  • 第41-44字节(w[15])与第29-32字节(w[14])的组合使 stride 远小于 xsize * pixelsize(例如 stride=1)

🛡️ 缓解建议

  • ✅ 立即升级 Pillow 至包含修复的版本(如 ≥10.4.0,预计在 10.3.0 之后发布补丁)。
  • ✅ 在应用层对用户上传的图像进行预处理:禁用不必要的插件(如 McIdas)、限制图像尺寸、使用沙箱或隔离进程打开图像。
  • ✅ 临时缓解:若无法升级,可在 ImageFile.load 的 mmap 分支增加额外检查:确保 stride ≥ xsize * (每像素字节数)。

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


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

🤖 常见问题解答(FAQ)

❓ 攻击者如何构造恶意 McIdas 文件?

攻击者利用 Python 的 struct 库,按照 McIdas 格式打包 64 个有符号 32 位整数到 256 字节头部。关键设置:w[9](xsize)设为较大值(如 200000),w[10](ysize)设为 1,w[14]=0,w[15]=1,使 stride=1,从而绕过边界检查。

❓ 该漏洞影响哪些 Pillow 版本?

影响所有使用 Pillow 且默认启用 McIdas 插件的版本(包括 10.3.0 及之前版本)。从文件名打开图像且 tiles 为 raw 编码时触发。具体修复版本预计在 10.4.0 中发布。

❓ 如何检测是否已遭利用?

检查进程日志中是否有因 SIGBUS 或 Segmentation fault 崩溃的记录;监控异常大的图像解码后输出(如正常图像应包含规则像素,而泄露的内存数据呈现随机或模式化)。此外,可在网络流量或存储中查找包含 McIdas 魔数(\x00\x00\x00\x00\x00\x00\x00\x04)且 stride 异常小的文件。

[!] CONTACT_CHANNELS

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

> PING_AUTHOR (@A1RedTeam)