ImageMagick中Options::fontFamily存在释放后使用/双重释放风险的技术分析

本文详细分析了CVE-2025-65955漏洞的技术细节,该漏洞存在于ImageMagick的Magick++层。当Options::fontFamily方法传入空字符串时,会触发释放后使用或双重释放风险,影响多个Magick.NET包版本,严重程度为中等。

已撤销的公告:ImageMagick的Options::fontFamily在清空字体家族时存在释放后使用/双重释放风险 · CVE-2025-65955

漏洞详情

受影响的包及版本

NuGet包

  • Magick.NET-Q16-AnyCPU
  • Magick.NET-Q16-HDRI-AnyCPU
  • Magick.NET-Q16-HDRI-OpenMP-arm64
  • Magick.NET-Q16-HDRI-OpenMP-x64
  • Magick.NET-Q16-HDRI-arm64
  • Magick.NET-Q16-HDRI-x64
  • Magick.NET-Q16-HDRI-x86
  • Magick.NET-Q16-OpenMP-arm64
  • Magick.NET-Q16-OpenMP-x64
  • Magick.NET-Q16-arm64
  • Magick.NET-Q16-x64
  • Magick.NET-Q16-x86
  • Magick.NET-Q8-AnyCPU
  • Magick.NET-Q8-OpenMP-arm64
  • Magick.NET-Q8-OpenMP-x64
  • Magick.NET-Q8-arm64
  • Magick.NET-Q8-x64
  • Magick.NET-Q8-x86

受影响版本:所有<= 14.9.1的版本 已修复版本:无

公告状态

已撤销:此公告于2025年12月11日被撤销,因为它不影响ImageMagick项目的NuGet包。

原始描述

我们认为在ImageMagick的Magick++层发现了一个潜在的安全漏洞,该漏洞在Options::fontFamily被传入空字符串时触发。

漏洞详情

清空字体家族会调用RelinquishMagickMemory释放_drawInfo->font,但_drawInfo->font仍指向已释放的内存,同时_drawInfo->family被设置为该(现在已无效的)指针。之后任何对_drawInfo->font的清理或重用都会重新释放或解引用悬挂指针。

DestroyDrawInfo和其他设置器(Options::font、Image::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()方法。命令行实用程序(如convert、magick等)不会暴露此特定代码路径,因为它们通过不同的内部机制运行,不会以触发释放后使用条件的方式直接调用带有空字符串的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置空可以保持分配器的整洁性。

参考信息

安全评估

严重程度:中等

CVSS总分:4.9/10

CVSS v3基础指标

  • 攻击向量:本地
  • 攻击复杂性:高
  • 所需权限:无
  • 用户交互:无
  • 范围:未改变
  • 机密性:低
  • 完整性:低
  • 可用性:低

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

EPSS得分

0.016%(第3百分位)

此分数估计此漏洞在未来30天内被利用的概率。数据由FIRST提供。

弱点分类

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

标识信息

  • CVE ID:CVE-2025-65955
  • GHSA ID:GHSA-q3hc-j9x5-mp9m
  • 源代码仓库:ImageMagick/ImageMagick

致谢

报告者:LuiginoC

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计