漏洞概述
在 ImageMagick 的 Magick++ 层中,当 Options::fontFamily 方法被传入一个空字符串时,存在潜在的释放后使用或双重释放安全风险。
漏洞细节
清空字体系列时,代码会调用 RelinquishMagickMemory 来释放 _drawInfo->font,但这会导致 _drawInfo->font 指针指向已被释放的内存,同时 _drawInfo->family 被设置为该(现已无效的)指针。此后对 _drawInfo->font 的任何后续清理或重用操作,都会导致对悬空内存的再次释放或解引用。
DestroyDrawInfo 和其他设置函数(如 Options::font、Image::font)假定 _drawInfo->font 仍然有效,因此在对象销毁或后续更新时会触发崩溃或堆损坏。
以下是触发漏洞的代码片段:
|
|
- 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()。
建议的修复方案
|
|
此修复方案仅释放实际的 family 字符串,保持 _drawInfo->font 不变。作为可选方案,在清空 font() 本身时将 _drawInfo->font 置空,可以保持分配器的良好状态。
参考信息
- GHSA-q3hc-j9x5-mp9m
- https://nvd.nist.gov/vuln/detail/CVE-2025-65955
- ImageMagick/ImageMagick@6409f34
- ImageMagick/ImageMagick@6f81eb1
漏洞信息
- 发布时间: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