1.ImageMagick介绍
ImageMagick是一个免费的开源软件套件,用于显示、转换和编辑图像文件。它可以读取和写入超过200种图像文件格式,因此在全球范围内的网站中很常见,因为需要处理用户的个人资料、目录等图片。
在最近的 APT 攻击分析中,Ocelot 团队发现 ImageMagick 被用于处理基于 Drupal 的网站中的图像,因此该团队决定尝试在此组件中寻找新的漏洞,并继续下载当时最新版本的 ImageMagick,7.1.0-49。结果,该团队发现了两个0day漏洞:
- CVE-2022-44267:ImageMagick 7.1.0-49 存在拒绝服务(DoS)漏洞。当它解析 PNG 图像(例如,用于调整大小)时,convert 进程可能会等待 stdin 输入。
- CVE-2022-44268:ImageMagick 7.1.0-49 存在信息泄露漏洞。当它解析 PNG 图像(例如,用于调整大小)时,生成的图像中可能会嵌入任意本地文件的内容(如果 ImageMagick 二进制文件有读取权限)。
2.如何触发漏洞利用?
攻击者只要将恶意图像上传到使用 ImageMagick 的网站就可以远程利用上述漏洞。
目前ImageMagick已经发布了修复补丁:https://github.com/ImageMagick/ImageMagick/commit/05673e63c919e61ffa1107804d1138c46547a475
3.漏洞分析
CVE-2022-44267:拒绝服务攻击
ImageMagick版本: 7.1.0-49
当 ImageMagick 解析 PNG 文件时,例如在接收图像时的调整大小操作中,转换过程可能会等待 stdin 输入,从而导致拒绝服务,因为该进程将无法处理其他图像。
恶意行为者可以制作 PNG 或使用现有 PNG 并添加文本块类型(例如 tEXt)。这些类型具有关键字和文本字符串。如果关键字是字符串“profile”(不带引号),则 ImageMagick 会将文本字符串解释为文件名,并将内容加载为原始配置文件。如果指定的文件名为“-”(单破折号),ImageMagick 将尝试从标准输入中读取内容,这可能会使进程永远等待。
漏洞利用路径分析:
- 上传图片触发ImageMagick命令,例如“convert”
- ReadOnePNGImage (coders/png.c:2164)
- 读取“tEXt”块:
- SetImageProfile (MagickCore/property.c:4360):
- 判断property是否等于 “profile”:
- 在4720行将字符串复制为文件名,并且在4722行保存:
- FileToStringInfo函数将内容保存到string_info->datum (MagickCore/string.c:1005):
- FileToBlob (MagickCore/blob.c:1396):给标准输入一个文件名为“-”,导致进程永远等待输入:
- PoC: 恶意的PNG文件十六进制数据:
89504E470D0A1A0A0000000D49484452000000010000000108000000003A7E9B550000000B49444154789C63F8FF1F00030001FFFC25DC510000000A7445587470726F66696C65002D00600C56A10000000049454E44AE426082
- 跟踪恶意文件:OCELOT_output.png:
- 一直等待输入从而实现拒绝服务攻击:
CVE-2022-44268:任意文件读取
ImageMagick: 7.1.0-49
当 ImageMagick 解析 PNG 文件时,例如在调整大小操作中,生成的图像可能嵌入了来自网站的任意文件的内容(如果 magick 二进制文件有权读取它)。
恶意行为者可以制作 PNG 或使用现有 PNG 并添加文本块类型(例如 tEXt)。这些类型具有关键字和文本字符串。如果关键字是字符串“profile”(不带引号),则 ImageMagick 会将文本字符串解释为文件名,并将内容加载为原始配置文件,然后攻击者可以下载含有被读取文件内容的图片。
漏洞利用路径分析:
- 上传一个图片去触发ImgMagick的命令,例如"convert"。
- ReadOnePNGImage (coders/png.c:2164):
– Reading tEXt chunk:
- SetImageProfile (MagickCore/property.c:4360):
- 判断property变量是否等于 “profile”:
- 在4720行将字符串复制为文件名,并且在4722行保存:
- FileToStringInfo函数将内容保存到string_info->datum (MagickCore/string.c:1005):
-
如果提供了有效(且可访问)的文件名,则文件内容被FileToStringInfo读取并返回,后面会调用SetImageProperty函数将之前读取的文件内容二进制储存到新生成的图片中:
攻击者下载新生成的包含有网站文件内容的图片即可完成任意文件读取。 -
PoC: 使用恶意图片读取 “/etc/passwd”文件:
图片十六进制:
89504E470D0A1A0A0000000D4948445200000001000000010100000000376EF9240000000A49444154789C636800000082008177CD72B6000000147445587470726F66696C65002F6574632F70617373776400B7F46D9C0000000049454E44AE426082
验证:
- 网站中"/etc/passwd"文件的内容已经通过profile->datum变量储存在了图片里面:
从图片文件中提取到十六进制的"/etc/passwd"内容:
从图片中提取到的网站"/etc/passwd"文件中的内容: