ImageMagick 字体家族清理漏洞:CVE-2025-65955 技术分析

本文详细分析了 ImageMagick 库在 Magick++ 层的 CVE-2025-65955 漏洞。该漏洞存在于 Options::fontFamily 函数中,当使用空字符串调用时会引发释放后使用或双重释放风险,可能导致程序崩溃或堆内存损坏。

漏洞摘要

CVE-2025-65955 是 ImageMagick 图像处理库中一个中等级别的安全漏洞,存在于其 Magick++ C++ API 层。具体来说,当 Options::fontFamily 方法被传入一个空字符串时,会触发释放后使用或双重释放的风险,可能导致应用程序崩溃或堆内存损坏。

漏洞详情

该漏洞的根源在于清理字体家族时的内存管理错误。当清空字体家族时,代码会调用 RelinquishMagickMemory 释放 _drawInfo->font 指向的内存,但随后又将 _drawInfo->family 指针指向这块已被释放的内存,而 _drawInfo->font 本身仍保留着这个悬空指针。后续任何对 _drawInfo->font 的清理或重用操作(例如在 DestroyDrawInfo 或其他设置函数如 Options::fontImage::font 中)都会导致程序崩溃或堆内存损坏。

漏洞代码片段如下:

1
2
3
4
5
if (family_.length() == 0)
{
  _drawInfo->family=(char *) RelinquishMagickMemory(_drawInfo->font);
  DestroyString(RemoveImageOption(imageInfo(),"family"));
}

此问题被归类为:

  • CWE-416 (释放后使用)_drawInfo->font 成为悬空指针,但仍可通过 Options 对象访问。
  • CWE-415 (双重释放):在 DrawInfo 结构体销毁时,会再次释放 _drawInfo->font,可能引发内存分配器中止。

受影响版本

  • 引入提交:漏洞由提交 6409f34d637a34a1c643632aa849371ec8b3b5a8(“Added fontFamily to the Image class of Magick++”,2015-08-01)引入。
  • 影响范围:所有包含该提交的版本均受影响,至少包括 ImageMagick 7.0.1-0 及更高版本(很可能也包含支持 Magick++ 字体家族的较晚 6.9 版本)。没有 fontFamily 功能的旧版本不受影响。
  • 受影响包:多个 Magick.NET 的 NuGet 包版本 <= 14.9.1 均受影响,包括 Q8、Q16、HDRI 等各种变体(AnyCPU、x86、x64、arm64等)。目前(截至公告发布时)暂无已修复的版本。

触发条件

此漏洞无法通过命令行界面(如 convertmagick 等工具)触发。该漏洞特指 Magick++ C++ API 中的 Options::fontFamily() 方法。命令行工具通过不同的内部机制运行,不会以触发此释放后使用条件的方式直接使用空字符串调用 Options::fontFamily()

建议修复方案

修复方案是修改 Magick++/lib/Options.cpp 文件中的相关代码,确保只释放正确的字符串指针:

1
2
-      _drawInfo->family=(char *) RelinquishMagickMemory(_drawInfo->font);
+      _drawInfo->family=(char *) RelinquishMagickMemory(_drawInfo->family);

此改动确保只释放实际的 family 字符串,保持 _drawInfo->font 不变。为了保持良好的内存管理习惯,也可以在清空 font() 本身时选择性地将 _drawInfo->font 设为空值。

参考信息

安全评估

  • CVSS 3.1 总体评分: 4.9(中危)
  • CVSS 向量: CVSS:3.1/AV:L/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:L
    • 攻击向量(AV):本地(L)
    • 攻击复杂度(AC):高(H)
    • 所需权限(PR):无(N)
    • 用户交互(UI):无(N)
    • 影响范围(S):未改变(U)
    • 机密性影响(C):低(L)
    • 完整性影响(I):低(L)
    • 可用性影响(A):低(L)
  • EPSS 分数: 0.012%(第1百分位,表示未来30天内被利用的概率估计很低)

弱点分类

  • CWE-415: 双重释放 - 产品对同一内存地址调用 free() 两次。
  • CWE-416: 释放后使用。

时间线

  • 报告者: LuiginoC
  • 发布至 ImageMagick/ImageMagick: 2025年12月2日 (dlemstra)
  • 由国家漏洞数据库发布: 2025年12月2日
  • 发布至 GitHub 安全公告数据库: 2025年12月3日
  • 审核: 2025年12月3日
  • 最后更新: 2025年12月3日
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计