IPBUF安全漏洞报告
English
CVE-2025-65955 CVSS 4.9 中危

CVE-2025-65955 ImageMagick Magick++ 层空字符串字体族导致释放后使用漏洞

披露日期: 2025-12-02

漏洞信息

漏洞编号
CVE-2025-65955
漏洞类型
释放后使用(Use After Free)
CVSS评分
4.9 中危
攻击向量
本地 (AV:L)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
ImageMagick

相关标签

释放后使用Use After Free内存损坏ImageMagickMagick++双重释放CVE-2025-65955图像处理软件本地攻击中危漏洞

漏洞概述

ImageMagick 是一款免费开源的图像处理软件,广泛用于图像编辑、格式转换和图像处理等场景。该软件在政府机构、企业和个人的图像处理工作流中被大量采用。

本次发现的漏洞存在于 ImageMagick 的 Magick++ 层中,当调用 Options::fontFamily 方法并传入空字符串时,会触发内存管理错误。具体而言,传入空字符串会触发 RelinquishMagickMemory 函数释放 _drawInfo->font 指向的内存,但同时 _drawInfo->family 仍保留指向该已释放内存的指针。这导致后续对 _drawInfo->font 的任何操作都可能引发双重释放或访问已释放内存的情况。

攻击者可通过构造恶意图像文件或精心设计的输入,触发此漏洞导致应用程序崩溃(拒绝服务),在某些情况下还可能导致堆损坏和潜在的代码执行风险。由于该漏洞影响图像处理的核心组件,攻击面广泛,任何使用 ImageMagick 处理用户提交图像的应用都可能受到影响。

技术细节

漏洞根源在于 Magick++ 层的字体处理逻辑中内存管理不当。具体技术细节如下:

1. **触发条件**:当调用 Options::fontFamily 并传入空字符串时,代码进入异常处理分支。

2. **内存释放**:RelinquishMagickMemory(_drawInfo->font) 被调用,释放了字体字符串占用的堆内存。

3. **指针悬挂**:释放后,_drawInfo->family 被设置为指向已释放内存的指针,而 _drawInfo->font 现在成为悬挂指针。

4. **后续操作触发崩溃**:DestroyDrawInfo() 函数在清理 _drawInfo->font 时,会尝试再次释放已释放内存。Image::font 和 Options::font 等 setter 函数同样假设 _drawInfo->font 仍然有效,触发时会导致堆损坏或程序崩溃。

5. **利用方式**:攻击者可以构造一个包含特殊字体设置的图像文件(如 SVG、WMF 等支持嵌入字体的格式),当 ImageMagick 处理该文件时,解析字体设置时触发空字符串路径,导致漏洞利用。

攻击链分析

STEP 1
步骤1
攻击者创建恶意图像文件(如SVG、WMF等支持嵌入字体信息的格式)
STEP 2
步骤2
在图像文件中嵌入空的字体族设置或触发字体解析逻辑
STEP 3
步骤3
ImageMagick 解析图像文件时调用 Options::fontFamily 方法
STEP 4
步骤4
传入空字符串触发 RelinquishMagickMemory 释放 _drawInfo->font 内存
STEP 5
步骤5
_drawInfo->family 指向已释放内存,_drawInfo->font 成为悬挂指针
STEP 6
步骤6
后续图像处理流程调用 DestroyDrawInfo 或其他 setter 函数
STEP 7
步骤7
尝试释放或访问已释放内存,导致程序崩溃(DoS)或堆损坏

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#include <Magick++.h> #include <iostream> using namespace Magick; int main() { InitializeMagick(nullptr); try { // Create an image Image image(Geometry(100, 100), Color("white")); // Get image info ImageInfo *imageInfo = image.mutableImageInfo(); DrawInfo *drawInfo = image.perceptibleImage(); // Trigger the vulnerability by setting empty font family // This will cause the double-free/use-after-free condition std::cout << "Triggering CVE-2025-65955..." << std::endl; // Set font family to empty string - this triggers the bug path Options options; options.fontFamily(""); // Empty string triggers the vulnerability // The following operations will trigger the use-after-free // when cleanup occurs image.font("test"); std::cout << "PoC executed" << std::endl; } catch (Exception &error_) { std::cerr << "Caught exception: " << error_.what() << std::endl; } DestroyMagick(); return 0; } // Alternative PoC: Using ImageMagick command line to trigger via SVG // convert -size 100x100 xc:white -font '' -pointsize 12 label:test output.png

影响范围

ImageMagick < 6.9.13-34
ImageMagick < 7.1.2-9

防御指南

临时缓解措施
如果无法立即升级,可采取以下临时缓解措施:1) 使用 ImageMagick 的安全策略文件(policy.xml)限制处理高风险格式;2) 禁用或限制外部字体加载功能;3) 对所有用户上传的图像进行预处理和验证;4) 在沙箱环境中处理不受信任的图像文件;5) 启用 ImageMagick 的安全模式(--unsafe-mode)并限制可执行操作。需要注意的是,这些措施可能影响图像处理功能的正常使用,最根本的解决方案仍是升级到官方发布的安全版本。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表