ImageMagick CLAHE漏洞分析:无符号下溢与除零错误导致越界访问与进程崩溃

本文详细分析了ImageMagick中CLAHE实现的一个漏洞,当分块宽度或高度为零时,会导致无符号整数下溢和除零错误,进而引发越界指针运算、内存损坏和进程崩溃,构成拒绝服务攻击风险。

CVE-2025-62594:ImageMagick CLAHE漏洞分析

漏洞概述 在ImageMagick的CLAHE实现中存在一个根本原因:当分块宽度或高度变为零时,会产生两种不同但相关的不安全行为。这些漏洞存在于ImageMagick的MagickCore/enhance.c文件的CLAHEImage()函数中。

漏洞详情

1. 无符号整数下溢导致越界指针运算

  • 位置MagickCore/enhance.c,约第609行
  • 受影响版本:测试于7.1.2-8(本地ASan/UBSan构建)
  • 漏洞代码
    1
    2
    
    enhance.c: 609
    p += (ptrdiff_t) clahe_info->width * (tile.height - 1);
    
  • 根本原因: 如果tile.height == 0,则(tile.height - 1)下溢至UINT_MAX。与clahe_info->width相乘会产生一个接近SIZE_MAX的巨大值。将此值加到p会导致指针算术下溢。

2. 除零错误

  • 文件/位置MagickCore/enhance.c,约第669行
  • 受影响版本:测试于7.1.2-8(本地ASan/UBSan构建)
  • 漏洞代码
    1
    2
    3
    4
    5
    6
    
    enhance.c: 669-673
    if ((image->columns % tile_info.width) != 0)
        tile_info.x=(ssize_t) (tile_info.width-(image->columns % tile_info.width));
    tile_info.y=0;
    if ((image->rows % tile_info.height) != 0)
        tile_info.y=(ssize_t) (tile_info.height-(image->rows % tile_info.height));
    
  • 根本原因: 计算默认分块尺寸后缺少输入验证/边界检查:如果tile_info.widthtile_info.height为0,则会触发除零错误。零值可以通过以下方式到达此点:
    • 精确分块:CLI命令-clahe 0x0!!强制直接使用零)。
    • 小图像上的自动分块:当请求的分块为0(无!)时,代码会从图像尺寸推导默认值(例如dim >> 3)。对于尺寸小于8的图像,除非进行钳制,否则结果为0。

复现步骤

无符号下溢

  • 环境:启用AddressSanitizer和UndefinedBehaviorSanitizer构建。
    1
    2
    
    export UBSAN_OPTIONS=print_stacktrace=1:halt_on_error=1
    export ASAN_OPTIONS=abort_on_error=1:allocator_may_return_null=1:detect_leaks=0
    
  • 命令
    1
    
    ./magick xc:black -clahe 0x0 null:
    
  • 输出
    1
    2
    
    MagickCore/enhance.c:609:6: runtime error: addition of unsigned offset overflowed
    SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior MagickCore/enhance.c:609:6 in CLAHEImage
    
    其他测试命令(如不同尺寸的图像)会导致内存区域损坏和显著的资源消耗。

除零错误

  • 环境:启用ASan/UBSan构建。
    1
    2
    
    export UBSAN_OPTIONS=print_stacktrace=1:halt_on_error=1
    export ASAN_OPTIONS=abort_on_error=1:allocator_may_return_null=1:detect_leaks=0
    
  • 命令
    1
    
    ./magick -size 16x2 gradient: -type TrueColor -depth 8 -clahe 0x0! null:
    
  • 输出:进程终止,显示“Aborted”(构成拒绝服务)。

影响

  • 主要影响:拒绝服务——当通过CLI或API处理特制参数或小图像时,导致崩溃或持续的资源耗尽(内存/缓存抖动)。攻击者可以通过-clahe 0x0!或向使用ImageMagick的服务上传非常小的图像来轻松触发。
  • 次要影响:越界内存访问和内存损坏可能与其他漏洞结合以实现更严重的后果;然而,仅从这些PoC中未演示出可靠的代码执行。

建议的补丁代码片段CLAHEImage()中,在计算tile_info之后、进行任何除法/取模/指针运算之前应用:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
if (exact_tiles_requested && (tile_info.width == 0 || tile_info.height == 0)) {
    ThrowMagickException(exception, GetMagickModule(), OptionError,
                         "CLAHEInvalidTile", "%lux%lu",
                         (unsigned long) tile_info.width,
                         (unsigned long) tile_info.height);
    return (Image *) NULL;
}

if (!exact_tiles_requested) {
    tile_info.width  = (tile_info.width  == 0) ? MagickMax((size_t)1, image->columns >> 3) : tile_info.width;
    tile_info.height = (tile_info.height == 0) ? MagickMax((size_t)1, image->rows    >> 3) : tile_info.height;
}

if (tile_info.width == 0 || tile_info.height == 0) {
    ThrowMagickException(exception, GetMagickModule(), OptionError,
                         "CLAHEInvalidTile", "%lux%lu",
                         (unsigned long) tile_info.width,
                         (unsigned long) tile_info.height);
    return (Image *) NULL;
}

ssize_t tile_h_minus1 = (ssize_t)tile_info.height - 1;
if (tile_h_minus1 < 0) {
    ThrowMagickException(exception, GetMagickModule(), OptionError,
                         "CLAHEInvalidTile", "%lux%lu",
                         (unsigned long) tile_info.width,
                         (unsigned long) tile_info.height);
    return (Image *) NULL;
}
p += (ptrdiff_t) clahe_info->width * tile_h_minus1;

致谢 Team Whys Bug Hunting Master Program, HSpace/Findthegap Youngmin Kim (kunshim@naver.com) Woojin Park (@jin-156, 1203kids@gmail.com) Youngin Won (@amethyst0225, youngin04@korea.ac.kr) Siyeon Han (@hanbunny, kokosyeon@gmail.com) Shinyoung Won (@yosiimich, yosimich123@gmail.com)

参考链接

漏洞信息

  • CVE ID: CVE-2025-62594
  • GHSA ID: GHSA-wpp4-vqfq-v4hp
  • 严重程度: 中等(CVSS评分4.7)
  • CVSS向量: CVSS:3.1/AV:L/AC:H/PR:N/UI:R/S:U/C:N/I:N/A:H
  • 弱点标识:
    • CWE-119: 内存缓冲区边界操作限制不当
    • CWE-191: 整数下溢(回绕)
    • CWE-369: 除零错误
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计