首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【漏洞情报】ImageMagick CLAHE:无符号整数下溢和除零导致越界指针运算及进程崩溃(拒绝服务)

【漏洞情报】ImageMagick CLAHE:无符号整数下溢和除零导致越界指针运算及进程崩溃(拒绝服务)

作者头像
qife122
发布2025-12-24 13:58:03
发布2025-12-24 13:58:03
1170
举报

漏洞详情:

受影响版本:多个Magick.NET NuGet包(包括x64和arm64架构,Q8、Q16、HDRI及OpenMP变体)的14.9.0及更早版本均受此漏洞影响。

描述:

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

  1. 无符号整数下溢 → 越界指针运算:当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的构建)。
  • 易受攻击的代码
代码语言:javascript
复制
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上会导致指针算术下溢。

除零操作

  • 文件/位置MagickCore/enhance.c,第669行附近。
  • 测试版本:7.1.2-8(本地启用了ASan/UBSan的构建)。
  • 易受攻击的代码
代码语言:javascript
复制
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的构建。

代码语言:javascript
复制
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

命令:

  • ./magick xc:black -clahe 0x0 null: - 输出显示未定义行为错误。
  • ./magick -size 10x10 xc:black -clahe 0x0 null: - 导致内存区域损坏。
  • 使用更大尺寸(如2000x2000,4000x4000,8000x8000)的类似命令会导致内存消耗显著增加,进程可能因持续尝试分配内存而崩溃(DoS)。

除零操作

环境:启用了ASan/UBSan的构建。

代码语言:javascript
复制
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

命令:

./magick -size 16x2 gradient: -type TrueColor -depth 8 -clahe 0x0! null:

输出:触发除零错误,进程中止。在没有检测器的情况下,进程可能仅以“已中止”状态终止(仍构成DoS)。

影响:

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

建议的修复代码片段:

CLAHEImage()函数中,计算完tile_info之后,但在任何除法、模运算或指针算术之前应用以下检查:

代码语言:javascript
复制
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能够知道零值是字面量还是自动计算值。

参考链接:

  • GHSA-wpp4-vqfq-v4hp
  • https://nvd.nist.gov/vuln/detail/CVE-2025-62594
  • ImageMagick/ImageMagick@7b47fe3

源项目地址:https://github.com/ImageMagick/ImageMagick.git

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-12-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 网络安全技术点滴分享 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档