| 属性 | 详情 |
|---|---|
| CVE编号 | CVE-2025-66628 |
| 厂商 | ImageMagick Studio LLC |
| 产品 | ImageMagick |
| 受影响版本 | < 7.1.2-10 |
| 修复版本 | 7.1.2-10 |
| 漏洞类型 | CWE-190 (整数溢出) |
| CVSS v3.1评分 | 7.5 (高) |
| CVSS向量 | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N |
| 研究人员 | Sumit Shah |
ImageMagick 的 coders/tim.c 中的 ReadTIMImage 函数存在一个整数溢出漏洞。在处理 TIM(PlayStation)图像文件时,32位系统上未对用户控制的宽度和高度值进行乘法检查,导致内存分配不足,从而在像素处理阶段发生越界读取。
漏洞逻辑位于 coders/tim.c:
/* coders/tim.c - TIM Image Parser */
// User-controlled input from TIM file header
width = ReadBlobLSBShort(image); // 2 bytes (0-65535)
height = ReadBlobLSBShort(image); // 2 bytes (0-65535)
// VULNERABLE: Integer overflow on 32-bit systems
image_size = 2 * width * height; // No overflow check
// Memory allocated with truncated size
pixels = (unsigned char *) AcquireQuantumMemory(image_size, sizeof(*pixels));
// Loop processes FULL dimensions, reading beyond buffer
for (y = 0; y < height; y++) {
for (x = 0; x < width; x++) {
pixel_index = (y * width + x) * 2;
pixels[pixel_index] = ReadBlobByte(image);
pixels[pixel_index + 1] = ReadBlobByte(image);
}
}
在32位架构上,size_t 被限制为32位,最大值为 UINT_MAX = 4,294,967,295。
当宽度和高度均设为最大16位无符号值时:
width = 65535 (0xFFFF)
height = 65535 (0xFFFF)
预期计算:
2 × 65535 × 65535 = 8,589,869,050 字节 (~8.5 GB)
实际结果(32位回绕):
8,589,869,050 % 4,294,967,296 = 4,294,901,754
截断后结果:分配的小缓冲区
溢出导致内存分配器分配了一个远小于需求的缓冲区,而处理循环仍会遍历完整的 65535 × 65535 像素网格,从而造成越界读取。
步骤1: 攻击者构造一个尺寸导致溢出的 TIM 文件
[Magic: 0x10]
[Type: 0x02]
[Width: 0xFFFF] # 65535
[Height: 0xFFFF] # 65535
[Pixel Data...]
步骤2: 受害者处理恶意文件
convert malicious.tim output.png
步骤3: 发生越界读取,导致:
32位系统,其中 size_t 为32位。64位系统不受影响,因为其整数宽度足以表示计算结果而不发生溢出。
信息泄露(主要): 越界访问期间,可读取 ImageMagick 进程的堆内存。该内存可能包含:
泄露的数据可嵌入到转换后的输出图像中,或通过侧信道分析提取。
拒绝服务(次要):
读取未映射的内存区域会触发 SIGSEGV,导致 ImageMagick 进程终止,并在自动化图像处理管道中造成服务中断。
技术细节仅供验证目的。不包含可执行的利用代码。
convert、magick 或任何 ImageMagick API 调用进行处理$ convert malicious.tim output.png
Segmentation fault (core dumped)
或成功转换,但输出图像中嵌入了泄露的堆数据。
$ convert malicious.tim output.png
convert: Memory allocation failed `malicious.tim' @ error/tim.c/ReadTIMImage/XXX.
将 ImageMagick 更新至 7.1.2-10 或更高版本:
# 验证当前版本
convert --version
# 使用包管理器更新
apt update && apt upgrade imagemagick # Debian/Ubuntu
yum update imagemagick # RHEL/CentOS
brew upgrade imagemagick # macOS
在算术运算前实施溢出检查:
// 不安全
image_size = 2 * width * height;
// 安全
if (height != 0 && width > (SIZE_MAX / 2) / height) {
ThrowReaderException(ResourceLimitError, "MemoryAllocationFailed");
}
image_size = 2 * width * height;
在执行计算前,对尺寸值应用输入验证和合理范围限制。
该漏洞是通过变体分析发现的。在发现 ImageMagick 的 BMP 解码器中存在类似的整数溢出漏洞后,对旧版格式解析器进行了系统性审查。通过模式匹配未检查的 width * height 计算,识别出 TIM 解析器中存在相同的缺陷。
旧版图像格式解码器(TIM、SGI、VIFF 等)由于安全审计频率较低且依赖不安全的 C 算术运算,成为高价值目标。
该漏洞已通过 GitHub 安全公告私下报告给 ImageMagick 维护者。仅在补丁可用并分配 CVE 后才进行公开披露。本次研究基于负责任的披露原则,以合乎道德的方式进行。
SUMIT SHAH
研究人员: SUMIT SHAH