关于ImageMagick
ImageMagick是一个功能强大的开源图形处理软件,可以用来读、写和处理超过90种的图片文件,包括流行的JPEG、GIF、 PNG、PDF以及PhotoCD等格式。使用它可以对图片进行切割、旋转、组合等多种特效的处理。
由于其功能强大、性能较好,并且对很多语言都有拓展支持,所以在程序开发中被广泛使用。许多网站开发者喜爱使用ImageMagick拓展来做web上的图片处理工作,比如用户头像生成、图片编辑等。
更多的拓展支持:
猪队友之ImageMagick
ImageMagick这次被曝出的漏洞应该算是一个本地的命令执行漏洞,危害不是太大,但是由于大量的web程序都使用了他的拓展,导致这些本地命令执行漏洞在web的环境里可以被远程触发,变成了危害巨大的远程命令执行。真的是名副其实的“猪队友”了。
命令执行漏洞是出在ImageMagick对https形式的文件处理的过程中。
ImageMagick之所以支持那么多的文件格式,是因为他内置了非常多的图像处理库,对于这些图像处理库,ImageMagick给他起了个名字叫做“Delegate”(委托),每个Delegate对应一种格式的文件,然后通过系统的system()命令来调用外部的程序对文件进行处理。
其默认的配置文件在源码的config/delegates.xml.in中,一般使用者很少会去修改这个配置文件。
具体的内容如下:
对于https形式的文件,他是这样处理的:
command定义了他具体带入system()执行的命令:"wget" -q -O "%o" "https:%M"。
%M是占位符,在配置文件中有对占位符的定义:
%m被定义为输入的图片格式,也就是我们输入的url地址。但是由于只是做了简单的字符串拼接,所以我们可以将引号闭合后通过管道符带入其他命令,也就形成了命令注入。
比如url为:https://example.com"|ls "-la
那实际命令就变成了:
"wget" -q -O "%o" " https://example.com"|ls "-la"
ls –la被执行了。
如图所示:
危险升级
让漏洞危害进一步加大的是,ImageMagick支持通过.svg、.mvg(ImageMagick自定义的一种类似svg的格式)这种类型的文件来进行图形绘制,并允许在其中加载其他的delegate(比如存在漏洞的https delegate)。并且在图形处理的过程中,ImageMagick会自动根据其内容进行处理,也就是说我们可以将文件随意定义为png、jpg等网站上传允许的格式,这大大增加了漏洞的可利用场景。
比如我们生成一个exploit.png的文件,内容为:
push graphic-context
viewbox 0 0 640 480
fill 'url(https://example.com/image.jpg"|ls "-la)'
pop graphic-context
在其中我们使用了fill url()的形式调用存在漏洞的https delegate,当ImageMagick去处理这个文件时,漏洞就会被触发。
影响范围
由于大量的web应用采用了ImageMagick做图片处理,所以这次漏洞的影响范围还是非常广泛的。目前已知PHP、java的ImageMagick扩展都在受影响之列,还有更多的拓展比如python、ruby、C#没有人去研究,所以我相信这个漏洞还会有更大的影响范围和利用场景。
在开源软件里,wordpress最早被爆出受到漏洞影响,由于其使用了PHP扩展ImageMagick处理图片,所以当攻击者拥有一定的权限(编辑权限即可),就可以通过后台的图像处理功能触发远程命令执行。
详细分析参考ricter的博客:
除了php,乌云社区还有人爆出java拓展一样受到影响:
还可以利用这个漏洞bypass php disable function,这个利用场景真的很巧妙,和以前利用bash的漏洞通过mail函数bypass有异曲同工之妙。
当然我觉得存在问题的肯定不止这一家。
更多因为猪队友躺枪的还有众多使用了ImageMagick做图片处理的互联网厂商,我就不一一列举了,感兴趣的可以关注补天、乌云等漏洞平台。我们后续也会跟进一些开源程序的受影响情况。
漏洞修复
这个漏洞在4月30日被报告给了ImageMagick官方,官网当天便发布了一个新版本6.9.3-9修复这个问题,我们看一下官方是如何修复这个漏洞的。
将%M变为了%F,其实也就是通过filter过滤了一遍,通过白名单限制了允许传入的字符串:
那么在白名单里的有哪些字符呢:
图中的whitelist也就是白名单里的字符串,是的,你没有看错,单引号、双引号、反引号、转义符这些危险字符依然被允许传入。
在逗我吗…?
随后有人指出其修复方法可被绕过,ImageMagick于是在5月3日又发布了6.9.3-10版本,更改了允许传入字符的白名单。
所以目前将ImageMagick升级至6.9.3-10版本可修复此安全漏洞,同时官方还建议用户,如果不需要这些功能,可以通过配置policy.xml的方式来禁止https、mvg这些delegate,或者直接在配置文件删除相应的delegate。
参考