ImageMagick在BMP解码器中存在整数溢出漏洞 (CVE-2025-62171)
漏洞详情
摘要 CVE-2025-57803声称已在ImageMagick 7.1.2-2中修复,但其补丁不完整且无效。最新版本7.1.2-5仍然容易受到相同的整数溢出攻击。补丁添加了BMPOverflowCheck()函数,但将其放置在溢出发生之后,使其变得无用。一个58字节的恶意BMP文件可以触发AddressSanitizer崩溃并导致拒绝服务。
受影响版本:
- 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位截断变为0
- bytes_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的Web服务(运行在32位系统上)。
- ImageMagick尝试处理该图像。
- 整数溢出触发AddressSanitizer崩溃。
- 服务变得不可用(拒绝服务)。
现实世界中的潜在目标:
- 具有图像处理功能的Web托管平台。
- 具有缩略图生成功能的CDN服务。
- 遗留嵌入式系统。
- 运行32位Linux的物联网设备。
- 使用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