漏洞概述
CVE ID: CVE-2025-62171
严重等级: 中危(CVSS 3.1评分:4.4 / 10)
影响组件: ImageMagick的BMP解码器(coders/bmp.c)
根本原因: 整数溢出(CWE-190: Integer Overflow or Wraparound)
该漏洞是早期CVE-2025-57803的不完整修复所导致的。虽然补丁增加了溢出检查函数BMPOverflowCheck(),但将其放置在了溢出发生之后,导致检查无效。攻击者可利用此漏洞,在特定的32位系统上造成拒绝服务(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字节)不受影响。
- 仅限32位系统(如 i386, i686, armv7l等),要求
- 触发前提:
- 系统的默认资源限制(
width,height,area)必须被手动提高。使用默认资源限制的系统不受影响。
- 系统的默认资源限制(
漏洞详情与根因分析
漏洞代码位置: coders/bmp.c (版本7.1.2-5) 第1120-1122行。
不完整的补丁代码:
|
|
攻击流程分析(针对32位系统):
- 恶意BMP文件头:
Width: 536,870,912 (0x20000000)Height: 1Bits Per Pixel: 32
- 计算过程:
extent = 536,870,912 × 32 = 17,179,869,184 (0x400000000)- 在32位系统中,结果被截断:
0x400000000 & 0xFFFFFFFF = 0x00000000(溢出归零!) bytes_per_line = 4 × ((0 + 31) / 32) = 4 × 0 = 0- 执行
BMPOverflowCheck(0, 1),因参数为0,检查返回False,未能检测到溢出。
- 最终结果: 代码使用损坏的数值继续执行,最终触发AddressSanitizer崩溃,导致拒绝服务。
概念验证与复现
恶意BMP文件(58字节):
|
|
Python生成脚本:
|
|
复现步骤:
- 在32位Docker容器中搭建环境(如
i386/ubuntu:latest)。 - 安装必要的编译依赖(
clang,build-essential等)。 - 下载并解压ImageMagick 7.1.2-5源码。
- 使用AddressSanitizer进行32位编译(配置时指定
--host=i686-pc-linux-gnu及相关的CFLAGS/LDFLAGS)。 - 设置环境变量以绕过默认资源限制:
1 2 3export MAGICK_WIDTH_LIMIT=2000000000 export MAGICK_HEIGHT_LIMIT=2000000000 export MAGICK_AREA_LIMIT=10000000000 - 使用生成的恶意BMP文件触发漏洞:
1./utilities/magick identify overflow.bmp - 预期观察到AddressSanitizer报告CHECK失败及程序崩溃。
影响与攻击场景
- 攻击场景: 攻击者构造一个58字节的恶意BMP文件,上传至使用受漏洞影响版本ImageMagick进行图像处理的Web服务(需运行在32位系统上)。ImageMagick在处理该文件时触发整数溢出,导致服务进程崩溃,造成拒绝服务。
- 潜在目标:
- 提供图像处理功能的Web托管平台
- 带有缩略图生成功能的CDN服务
- 运行32位Linux的遗留嵌入式系统或IoT设备
- 使用32位基础镜像的Docker容器
修复建议
正确的补丁方案: 溢出检查必须在乘法运算之前进行。
|
|
替代方案:使用64位算术:
|
|
已修复的版本:
- ImageMagick 7.1.2-7 及更高版本
- ImageMagick 6.9.13-32 及更高版本
- Magick.NET 14.9.0 及更高版本
- Debian 11 bullseye: 版本
8:6.9.11.60+dfsg-1.3+deb11u7
参考资料
- GitHub Advisory: GHSA-9pp9-cfwx-54rm
- NVD: CVE-2025-62171
- ImageMagick修复提交: ImageMagick/ImageMagick@cea1693
- Magick.NET 14.9.0 发布说明
- Debian 安全更新通告: DLA 4339-1