ImageMagick 任意文件读取漏洞(CVE-2022-44268)

Artio 于 2023-03-03 发布

1、漏洞介绍

ImageMagick 是一款免费软件,以随时可用的二进制分发版或源代码形式提供,您可以在开放和专有应用程序中使用、复制、修改和分发。可以使用ImageMagick®创建、编辑、合成或转换数字图像。它可以读取和写入多种格式(超过 200 种)的图像。

远程攻击者可通过制作恶意的PNG文件并上传至受影响的使用ImageMagick 解析图片的网站来利用这个漏洞,当网站或应用使用 ImageMagick 对恶意的 PNG 文件进行解析时将触发这两个漏洞,从而造成敏感信息泄露或拒绝服务。

2、漏洞复现

使用vulhub启动环境

使用命令生成恶意图片poc

./poc.py generate -o poc.png -r /etc/passwd

上传恶意图片

CVE-2022-44268_1.png

使用命令读取解析后的图片

./poc.py parse -i 63e0d0cc354ef.png

CVE-2022-44268_3.png

复现这块就不多说了

3、漏洞分析

分析漏洞之前我们先来了解下PNG图片的格式。

PNG图片是由PNG文件头和多个数据块(chunk)组成:

常见的四种类型的数据块:

除了上述4种常见的数据块以外,还有一些不常见的数据块,我们这次的漏洞就出现在tEXt这个数据块中。tEXt数据块并没有规定具体作用,只说可以用于保存未压缩的图片属性,其格式是key\0value,这个key是属性的名字,value是属性的值,中间由\0字符分隔。

可以看到我们复现过程中profile和文件名之间存在00字符:

CVE-2022-44268_2.png

在2017年发布的PNG 1.2 Specification, Version 1.5.0中,PNG图片格式新增了一个eXIf数据块,专门用于保存图片的Exif数据;而在此之前,PNG标准规范中也没有规定Exif数据要保存在哪,于是ImageMagick就将Exif数据保存在tEXt数据块中。

这次出现问题的就是tEXt数据块中属性名是profile的属性。

接下来来看看代码:

上传图像以触发ImageMagick命令

CVE-2022-44268_4.png

读取tEXt数据块

CVE-2022-44268_5.png

CVE-2022-44268_6.png

判断property变量是否等于profile

CVE-2022-44268_7.png

将profile的值的字符串复制为文件名,并保存

CVE-2022-44268_8.png

FileToStringInfo函数将读取文件内容并将内容保存到string_info->datum

CVE-2022-44268_9.png

读取文件后文件内容被FileToStringInfo读取并返回,然后调用SetImageProperty函数将之前读取的文件内容二进制储存到新生成的图片中

CVE-2022-44268_10.png

下载图片并读取图片则可以看到读取的文件内容。