ImageMagick 在 BMP 解码器(ReadBMP)中存在整数溢出 · CVE-2025-62171 · GitHub Advisory Database · GitHub
CVE-2025-62171
漏洞详情
摘要
CVE-2025-57803 声称已在 ImageMagick 7.1.2-2 中修复,但该修复不完整且无效。最新版本 7.1.2-5 仍易受相同的整数溢出攻击。该补丁添加了 BMPOverflowCheck() 函数,但将其放置在溢出发生之后,导致其无效。一个仅 58 字节的恶意 BMP 文件即可触发 AddressSanitizer 崩溃并导致拒绝服务(DoS)。
受影响版本:
- ImageMagick < 7.1.2-2 (最初报告)
- ImageMagick 7.1.2-2 至 7.1.2-5 (不完整补丁)
平台和配置要求:
- 仅限 32 位系统 (i386, i686, armv7l 等)
- 要求 size_t = 4 字节。(64 位系统不易受攻击 (size_t = 8 字节))
- 要求修改资源限制:必须手动增加默认的宽度、高度和面积限制(使用默认 ImageMagick 资源限制的系统不易受攻击)。
详情(根本原因分析)
易受攻击代码位置 文件:coders/bmp.c 行数:1120-1122 (在 7.1.2-5 版本中)
不完整的补丁
|
|
为什么补丁失败 攻击向量(32位系统): 输入 BMP 头部:
- 宽度:536,870,912 (0x20000000)
- 高度:1
- 每像素位数:32
32位系统上的计算:
|
|
检查失败是因为:
- 溢出发生在第 1120 行 (
extent计算) extent因 32 位截断变为 0bytes_per_line计算为 0 (第1121行)BMPOverflowCheck(0, 1)返回False(未检测到溢出)- 代码继续执行,使用损坏的值 → ASan 崩溃
PoC(概念验证)
最小的 58 字节 BMP 文件 十六进制转储:
|
|
关键字段:
- 偏移 0x12: 宽度 = 00 00 00 20 = 0x20000000 (536,870,912)
- 偏移 0x16: 高度 = 01 00 00 00 = 1
- 偏移 0x1C: 每像素位数 = 20 00 = 32
Python 生成器
|
|
复现步骤
环境设置
|
|
使用 AddressSanitizer 构建(32位,重要!)
|
|
触发漏洞
|
|
AddressSanitizer 输出
|
|
它在以下环境中运行。
|
|
影响
攻击场景
- 攻击者创建一个 58 字节的恶意 BMP 文件。
- 上传到使用 ImageMagick(在 32 位系统上)的 Web 服务。
- ImageMagick 尝试处理该图像。
- 整数溢出触发 AddressSanitizer 崩溃。
- 服务变得不可用(拒绝服务)。
现实世界目标:
- 带有图像处理的 Web 托管平台
- 带有缩略图生成的 CDN 服务
- 传统嵌入式系统
- 运行 32 位 Linux 的 IoT 设备
- 使用 32 位基础镜像的 Docker 容器
建议的修复
正确的补丁 溢出检查必须在乘法运算之前进行:
|
|
替代方案:使用 64 位算术
|
|
致谢
wooseokdotkim wooseokdotkim@gmail.com
参考
- GHSA-9pp9-cfwx-54rm
- https://nvd.nist.gov/vuln/detail/CVE-2025-62171
- ImageMagick/ImageMagick@cea1693
- https://github.com/dlemstra/Magick.NET/releases/tag/14.9.0
- https://lists.debian.org/debian-lts-announce/2025/10/msg00019.html