漏洞摘要
CVE-2025-65955 是 ImageMagick 图像处理库中一个中等级别的安全漏洞,存在于其 Magick++ C++ API 层。具体来说,当 Options::fontFamily 方法被传入一个空字符串时,会触发释放后使用或双重释放的风险,可能导致应用程序崩溃或堆内存损坏。
漏洞详情
该漏洞的根源在于清理字体家族时的内存管理错误。当清空字体家族时,代码会调用 RelinquishMagickMemory 释放 _drawInfo->font 指向的内存,但随后又将 _drawInfo->family 指针指向这块已被释放的内存,而 _drawInfo->font 本身仍保留着这个悬空指针。后续任何对 _drawInfo->font 的清理或重用操作(例如在 DestroyDrawInfo 或其他设置函数如 Options::font、Image::font 中)都会导致程序崩溃或堆内存损坏。
漏洞代码片段如下:
|
|
此问题被归类为:
- CWE-416 (释放后使用):
_drawInfo->font成为悬空指针,但仍可通过 Options 对象访问。 - CWE-415 (双重释放):在
DrawInfo结构体销毁时,会再次释放_drawInfo->font,可能引发内存分配器中止。
受影响版本
- 引入提交:漏洞由提交 6409f34d637a34a1c643632aa849371ec8b3b5a8(“Added fontFamily to the Image class of Magick++”,2015-08-01)引入。
- 影响范围:所有包含该提交的版本均受影响,至少包括 ImageMagick 7.0.1-0 及更高版本(很可能也包含支持 Magick++ 字体家族的较晚 6.9 版本)。没有
fontFamily功能的旧版本不受影响。 - 受影响包:多个 Magick.NET 的 NuGet 包版本 <= 14.9.1 均受影响,包括 Q8、Q16、HDRI 等各种变体(AnyCPU、x86、x64、arm64等)。目前(截至公告发布时)暂无已修复的版本。
触发条件
此漏洞无法通过命令行界面(如 convert、magick 等工具)触发。该漏洞特指 Magick++ C++ API 中的 Options::fontFamily() 方法。命令行工具通过不同的内部机制运行,不会以触发此释放后使用条件的方式直接使用空字符串调用 Options::fontFamily()。
建议修复方案
修复方案是修改 Magick++/lib/Options.cpp 文件中的相关代码,确保只释放正确的字符串指针:
|
|
此改动确保只释放实际的 family 字符串,保持 _drawInfo->font 不变。为了保持良好的内存管理习惯,也可以在清空 font() 本身时选择性地将 _drawInfo->font 设为空值。
参考信息
- GHSA ID: GHSA-q3hc-j9x5-mp9m
- NVD 详情: https://nvd.nist.gov/vuln/detail/CVE-2025-65955
- 引入提交: ImageMagick/ImageMagick@6409f34
- 相关提交: ImageMagick/ImageMagick@6f81eb1
安全评估
- CVSS 3.1 总体评分: 4.9(中危)
- CVSS 向量: CVSS:3.1/AV:L/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:L
- 攻击向量(AV):本地(L)
- 攻击复杂度(AC):高(H)
- 所需权限(PR):无(N)
- 用户交互(UI):无(N)
- 影响范围(S):未改变(U)
- 机密性影响(C):低(L)
- 完整性影响(I):低(L)
- 可用性影响(A):低(L)
- EPSS 分数: 0.012%(第1百分位,表示未来30天内被利用的概率估计很低)
弱点分类
- CWE-415: 双重释放 - 产品对同一内存地址调用
free()两次。 - CWE-416: 释放后使用。
时间线
- 报告者: LuiginoC
- 发布至 ImageMagick/ImageMagick: 2025年12月2日 (dlemstra)
- 由国家漏洞数据库发布: 2025年12月2日
- 发布至 GitHub 安全公告数据库: 2025年12月3日
- 审核: 2025年12月3日
- 最后更新: 2025年12月3日