ImageMagick字体家族处理漏洞:高危Use-After-Free/双重释放风险剖析

31 阅读2分钟

漏洞概述

在ImageMagick的Magick++层发现一个潜在的安全漏洞。当使用空字符串调用Options::fontFamily方法时,会触发此漏洞。

漏洞详情

清除字体家族的操作会调用RelinquishMagickMemory来释放_drawInfo->font,但释放后_drawInfo->font仍然指向已释放的内存,同时_drawInfo->family被设置为该(现已无效的)指针。之后任何对_drawInfo->font的清理或重新使用都会导致再次释放或解引用悬垂指针。

DestroyDrawInfo和其他设置器(如Options::fontImage::font)假设_drawInfo->font保持有效,因此在对象销毁或后续更新时会触发崩溃或堆损坏。

问题代码段:

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()

建议的修复方案

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);

此修复仅释放实际的家族字符串,保持_drawInfo->font不变。可选地,在清除font()本身时将_drawInfo->font设为空值,以保持分配器的整洁性。

参考链接

安全信息

严重程度:中等(CVSS评分:4.9)

CVSS v3基本指标

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

弱點

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

CVE ID:CVE-2025-65955 GHSA ID:GHSA-q3hc-j9x5-mp9m

源代码:ImageMagick/ImageMagick

报告者:LuiginoC glyoVzOLZA9nMhz/bDHDAWzfRfZ0dSZtQUalpUyOmxfLz/M9YyPxseTrySU2C/vHteQ3GYo9GwoK+W18QOGErA==