漏洞概述
在ImageMagick的Magick++层发现一个潜在的安全漏洞。当使用空字符串调用Options::fontFamily方法时,会触发此漏洞。
漏洞详情
清除字体家族的操作会调用RelinquishMagickMemory来释放_drawInfo->font,但释放后_drawInfo->font仍然指向已释放的内存,同时_drawInfo->family被设置为该(现已无效的)指针。之后任何对_drawInfo->font的清理或重新使用都会导致再次释放或解引用悬垂指针。
DestroyDrawInfo和其他设置器(如Options::font、Image::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()方法。命令行工具(如convert、magick等)不暴露此特定代码路径,因为它们通过不同的内部机制运行,不会以触发释放后使用条件的方式直接调用带有空字符串的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设为空值,以保持分配器的整洁性。
参考链接
- GHSA-q3hc-j9x5-mp9m
- nvd.nist.gov/vuln/detail…
- ImageMagick/ImageMagick@6409f34
- ImageMagick/ImageMagick@6f81eb1
安全信息
严重程度:中等(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==