ImageMagick CLAHE漏洞分析:无符号下溢与除零错误导致内存越界和DoS攻击

本文详细分析了ImageMagick CLAHE实现中的安全漏洞CVE-2025-62594,该漏洞由于瓦片宽度高度为零导致无符号整数下溢和除零错误,可能造成内存越界访问和进程崩溃,最终导致拒绝服务攻击。

ImageMagick CLAHE漏洞分析:无符号下溢与除零错误导致内存越界和DoS攻击

漏洞详情

包信息

  • NuGet包:Magick.NET-Q16-HDRI-OpenMP-arm64等多个变体
  • 受影响版本:<= 14.9.0
  • 已修复版本:无

漏洞描述

概述

CLAHE实现中的单一根本原因——瓦片宽度/高度变为零——产生了两种不同但相关的不安全行为。

漏洞存在于ImageMagick的MagickCore/enhance.c文件中的CLAHEImage()函数。

具体问题

无符号整数下溢 → 越界指针算术(OOB)

  • 位置:MagickCore/enhance.c,约第609行
  • 当tile_info.height == 0时,表达式tile_info.height - 1(无符号)回绕到一个非常大的值
  • 在指针算术中使用该值会产生巨大的偏移量和OOB内存访问

除零错误

  • 文件/位置:MagickCore/enhance.c,约第669-673行
  • 当代码执行… / tile_info.width或… % tile_info.height而没有重新检查零值时,会导致除零崩溃

复现步骤

无符号下溢复现

环境配置

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 16x2 gradient: -type TrueColor -depth 8 -clahe 0x0! null:

影响分析

主要影响:拒绝服务——在处理 crafted 参数或小图像时导致进程崩溃或持续资源耗尽 次要影响:OOB内存访问和内存损坏可能与其他漏洞结合实现更严重后果

修复建议

在CLAHEImage()中计算tile_info后,但在任何除法/模运算/指针算术之前应用以下补丁:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
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;
}

技术细节

漏洞代码位置

  • enhance.c:609: p += (ptrdiff_t) clahe_info->width * (tile.height - 1);
  • enhance.c:669-673: 涉及image->columns % tile_info.widthimage->rows % tile_info.height的计算

根本原因

  • 在计算默认瓦片尺寸后缺少输入验证/边界检查
  • 零值可能通过以下方式到达此点:
    • 精确瓦片:CLI命令clahe 0x0!
    • 小图像上的自动瓦片:当图像尺寸小于8时,默认推导结果为零

参考信息

  • GHSA ID: GHSA-wpp4-vqfq-v4hp
  • CVE ID: CVE-2025-62594
  • 提交者:Team Whys,Bug Hunting Master Program成员
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计