ImageMagick Magick++ 层字体处理漏洞解析:释放后使用与双重释放风险

本文详细分析了CVE-2025-65955漏洞,该漏洞存在于ImageMagick的Magick++层中。当Options::fontFamily方法被传入空字符串时,会导致释放后使用或双重释放风险。文章涵盖了漏洞细节、影响版本、触发条件及建议修复方案。

漏洞概述

在 ImageMagick 的 Magick++ 层中,当 Options::fontFamily 方法被传入一个空字符串时,存在潜在的释放后使用或双重释放安全风险。

漏洞细节

清空字体系列时,代码会调用 RelinquishMagickMemory 来释放 _drawInfo->font,但这会导致 _drawInfo->font 指针指向已被释放的内存,同时 _drawInfo->family 被设置为该(现已无效的)指针。此后对 _drawInfo->font 的任何后续清理或重用操作,都会导致对悬空内存的再次释放或解引用。

DestroyDrawInfo 和其他设置函数(如 Options::fontImage::font)假定 _drawInfo->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,问题代码位于第313行)引入。 所有包含该提交的发行版均受影响,至少包括 ImageMagick 7.0.1-0 及更高版本(很可能也包括支持 Magick++ 字体系列的较晚 6.9 版本)。没有 fontFamily 功能的旧版本不受影响。

命令行触发可能性

此漏洞无法通过命令行界面触发。该错误特定于 Magick++ C++ API,尤其是 Options::fontFamily() 方法。命令行工具(如 convertmagick 等)不会暴露此特定代码路径,因为它们通过不同的内部机制运行,不会以触发释放后使用条件的方式直接调用带有空字符串的 Options::fontFamily()

建议的修复方案

1
2
3
4
diff --git a/Magick++/lib/Options.cpp b/Magick++/lib/Options.cpp
@@ void Magick::Options::fontFamily(const std::string &family_)
-      _drawInfo->family=(char *) RelinquishMagickMemory(_drawInfo->font);
+      _drawInfo->family=(char *) RelinquishMagickMemory(_drawInfo->family);

此修复方案仅释放实际的 family 字符串,保持 _drawInfo->font 不变。作为可选方案,在清空 font() 本身时将 _drawInfo->font 置空,可以保持分配器的良好状态。

参考信息

漏洞信息

  • 发布时间:2025年12月2日
  • 最后更新:2025年12月3日
  • 严重程度:中危(CVSS 4.9)
  • CVSS v3.1 基准向量:AV:L/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:L
  • CWE 弱点:CWE-415(双重释放)
  • CVE ID:CVE-2025-65955
  • GHSA ID:GHSA-q3hc-j9x5-mp9m
  • 致谢:LuiginoC
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计