ImageMagick CLAHE漏洞解析:无符号下溢与除零导致内存越界与进程崩溃

本文详细分析了ImageMagick图像处理库中CLAHE功能的一个安全漏洞。该漏洞源于对图块宽度/高度为零的情况缺乏验证,导致无符号整数下溢和除零错误,可能引发内存越界访问、资源耗尽,最终造成进程崩溃(拒绝服务攻击)。

ImageMagick CLAHE: 无符号整数下溢与除零导致越界指针运算和进程崩溃(DoS)· CVE-2025-62594 · GitHub Advisory Database

漏洞详情

Dependabot 警报: 0

受影响包与版本

: nuget/Magick.NET-Q16-HDRI-OpenMP-arm64 (NuGet) 受影响版本: <= 14.9.0 已修复版本: 无

: nuget/Magick.NET-Q16-HDRI-OpenMP-x64 (NuGet) 受影响版本: <= 14.9.0 已修复版本: 无

: nuget/Magick.NET-Q16-HDRI-arm64 (NuGet) 受影响版本: <= 14.9.0 已修复版本: 无

: nuget/Magick.NET-Q16-HDRI-x64 (NuGet) 受影响版本: <= 14.9.0 已修复版本: 无

: nuget/Magick.NET-Q16-OpenMP-arm64 (NuGet) 受影响版本: <= 14.9.0 已修复版本: 无

: nuget/Magick.NET-Q16-OpenMP-x64 (NuGet) 受影响版本: <= 14.9.0 已修复版本: 无

: nuget/Magick.NET-Q16-arm64 (NuGet) 受影响版本: <= 14.9.0 已修复版本: 无

: nuget/Magick.NET-Q16-x64 (NuGet) 受影响版本: <= 14.9.0 已修复版本: 无

: nuget/Magick.NET-Q8-OpenMP-arm64 (NuGet) 受影响版本: <= 14.9.0 已修复版本: 无

: nuget/Magick.NET-Q8-OpenMP-x64 (NuGet) 受影响版本: <= 14.9.0 已修复版本: 无

: nuget/Magick.NET-Q8-arm64 (NuGet) 受影响版本: <= 14.9.0 已修复版本: 无

: nuget/Magick.NET-Q8-x64 (NuGet) 受影响版本: <= 14.9.0 已修复版本: 无

描述

摘要 ImageMagick 的 CLAHE 实现中存在一个根本原因——图块(tile)宽度或高度变为零——导致了两种不同但相关的危险行为。 漏洞存在于 ImageMagick 的 MagickCore/enhance.c 文件中的 CLAHEImage() 函数。

  1. 无符号整数下溢 → 越界指针运算(OOB):当 tile_info.height == 0 时,表达式 tile_info.height - 1(无符号)会回绕为一个非常大的值;在指针运算中使用该值会产生巨大的偏移量和越界内存访问(导致内存损坏、SIGSEGV 或资源耗尽)。
  2. 除以零/模零:代码中在未重新检查零值的情况下执行 ... / tile_info.width... % tile_info.height,导致在启用消毒工具时立即出现除以零崩溃,或在运行时中止。

这两种行为都由相同的无效图块条件触发(例如,CLI 命令 -clahe 0x0! 或对于非常小的图像,自动图块推导 dim >> 3 == 0)。

详情

  • 无符号下溢(可导致越界)

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

    • 文件/位置MagickCore/enhance.c,大约第 669 行
    • 测试版本:7.1.2-8 (本地 ASan/UBSan 构建)
    • 易受攻击的代码 (enhance.c: 669-673):
      1
      2
      3
      4
      5
      
      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,则会触发除以零错误。零值可能通过以下方式到达此点:
      1. 精确指定图块:CLI 命令 -clahe 0x0!! 强制直接使用零值)。
      2. 对微小图像自动计算图块:当请求的图块尺寸为 0(未使用 !)时,代码会根据图像尺寸(例如 dim >> 3)推导默认值。对于尺寸小于 8 的图像,除非进行限制,否则结果为零。

复现步骤

无符号下溢

  • 环境:启用 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
    
    1
    
    ./magick -size 10x10 xc:black -clahe 0x0 null:
    
    → 内存区域损坏。
    1
    
    ./magick -size 2000x2000 xc:black -clahe 0x0 null:
    
    → 显著的内存消耗和内存区域损坏迹象。
    1
    
    ./magick -size 4000x4000 xc:black -clahe 0x0 null:
    
    → 内存使用量更大;进程似乎正在积极消耗缓存和地址空间。
    1
    
    ./magick -size 8000x8000 xc:black -clahe 0x0 null:
    
    → 内存使用量进一步上升并开始耗尽可用缓存。如果持续运行,进程可能在持续尝试分配后崩溃(DoS)。

除以零

  • 环境:启用 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:
    
  • 输出
    1
    
    ERROR: ... undefined behavior: division by zero
    
  • 注意:在未启用消毒工具的情况下,进程可能仅以 Aborted 终止(仍是 DoS)。

影响

  • 主要影响拒绝服务 —— 当通过 CLI 或 API 处理恶意构造的参数或微小图像时,导致崩溃或持续的资源耗尽(内存/缓存颠簸)。攻击者可以通过 -clahe 0x0! 命令或向使用 ImageMagick 的服务上传非常小的图像来轻易触发。
  • 次要影响(理论上):越界内存访问和内存损坏可能与其他漏洞结合,导致更严重的后果;然而,仅凭这些概念验证并未证明能实现可靠的代码执行。

建议的具体补丁代码片段

CLAHEImage() 函数中,在图块尺寸计算完成后,但在任何除法/模运算/指针运算之前应用:

 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;

关于 exact_tiles_requested 的说明:如果 CLI/Wand 解析器已经公开了是否存在 !,则使用它。如果没有,则添加一个解析时标志,以便 CLAHEImage 能够知道 0 是字面值还是自动推导值。

致谢

参考链接

时间线

  • dlemstra 发布于 ImageMagick/ImageMagick – Oct 26, 2025
  • 由国家漏洞数据库发布 – Oct 27, 2025
  • 发布到 GitHub Advisory Database – Oct 27, 2025
  • 已审核 – Oct 27, 2025
  • 最后更新 – Oct 31, 2025

严重程度

中等 CVSS 总分: 4.7 / 10

CVSS v3 基础指标

  • 攻击向量(AV):本地 (L)
  • 攻击复杂度(AC):高 (H)
  • 所需权限(PR):无 (N)
  • 用户交互(UI):需要 (R)
  • 范围(S):未改变 (U)
  • 机密性影响(C):无 (N)
  • 完整性影响(I):无 (N)
  • 可用性影响(A):高 (H)

CVSS:3.1/AV:L/AC:H/PR:N/UI:R/S:U/C:N/I:N/A:H

EPSS 分数: 0.013% (第2百分位)

弱点

  • CWE-119 – 对内存缓冲区操作的限制不当
  • CWE-191 – 整数下溢(回绕)
  • CWE-369 – 除以零

标识符

  • CVE ID: CVE-2025-62594
  • GHSA ID: GHSA-wpp4-vqfq-v4hp

源代码

ImageMagick/ImageMagick

报告者

  • amethyst0225
  • jin-156
  • hanbunny
  • yosiimich
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计