神刀安全网

ImageMagick命令执行漏洞分析

ImageMagick命令执行漏洞分析

关于ImageMagick

ImageMagick是一个功能强大的开源图形处理软件,可以用来读、写和处理超过90种的图片文件,包括流行的JPEG、GIF、 PNG、PDF以及PhotoCD等格式。使用它可以对图片进行切割、旋转、组合等多种特效的处理。

由于其功能强大、性能较好,并且对很多语言都有拓展支持,所以在程序开发中被广泛使用。许多网站开发者喜爱使用ImageMagick拓展来做web上的图片处理工作,比如用户头像生成、图片编辑等。

比如php有 IMagick MagickWand for PHP  、 phMagick 等ImageMagick拓展库,java有 JMagick ,python有 PythonMagick Wand  等拓展库。

更多的拓展支持:

http://www.imagemagick.org/script/api.php

猪队友之ImageMagick

ImageMagick这次被曝出的漏洞应该算是一个本地的命令执行漏洞,危害不是太大,但是由于大量的web程序都使用了他的拓展,导致这些本地命令执行漏洞在web的环境里可以被远程触发,变成了危害巨大的远程命令执行。真的是名副其实的“猪队友”了。

命令执行漏洞是出在ImageMagick对https形式的文件处理的过程中。

ImageMagick之所以支持那么多的文件格式,是因为他内置了非常多的图像处理库,对于这些图像处理库,ImageMagick给他起了个名字叫做“Delegate”(委托),每个Delegate对应一种格式的文件,然后通过系统的system()命令来调用外部的程序对文件进行处理。

其默认的配置文件在源码的config/delegates.xml.in中,一般使用者很少会去修改这个配置文件。

具体的内容如下:

https://github.com/ImageMagick/ImageMagick/blob/25d021ff1a60a67680dbb640ccc0b6b60f785192/magick/delegate.c (存在漏洞的版本)

对于https形式的文件,他是这样处理的:

ImageMagick命令执行漏洞分析

command定义了他具体带入system()执行的命令:"wget" -q -O "%o" "https:%M"。

%M是占位符,在配置文件中有对占位符的定义:

ImageMagick命令执行漏洞分析

%m被定义为输入的图片格式,也就是我们输入的url地址。但是由于只是做了简单的字符串拼接,所以我们可以将引号闭合后通过管道符带入其他命令,也就形成了命令注入。

比如url为:https://example.com"|ls "-la

那实际命令就变成了:

"wget" -q -O "%o" " https://example.com"|ls "-la"

ls –la被执行了。

如图所示:

ImageMagick命令执行漏洞分析

危险升级

让漏洞危害进一步加大的是,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去处理这个文件时,漏洞就会被触发。

ImageMagick命令执行漏洞分析

影响范围

由于大量的web应用采用了ImageMagick做图片处理,所以这次漏洞的影响范围还是非常广泛的。目前已知PHP、java的ImageMagick扩展都在受影响之列,还有更多的拓展比如python、ruby、C#没有人去研究,所以我相信这个漏洞还会有更大的影响范围和利用场景。

在开源软件里,wordpress最早被爆出受到漏洞影响,由于其使用了PHP扩展ImageMagick处理图片,所以当攻击者拥有一定的权限(编辑权限即可),就可以通过后台的图像处理功能触发远程命令执行。

详细分析参考ricter的博客:

http://ricterz.me/posts/Write%20Up%3A%20Remote%20Command%20Execute%20in%20Wordpress%204.5.1

除了php,乌云社区还有人爆出java拓展一样受到影响:

http://zone.wooyun.org/content/27047

还可以利用这个漏洞bypass php disable function,这个利用场景真的很巧妙,和以前利用bash的漏洞通过mail函数bypass有异曲同工之妙。

新浪的SAE躺枪: http://www.wooyun.org/bugs/wooyun-2016-0205051

当然我觉得存在问题的肯定不止这一家。

更多因为猪队友躺枪的还有众多使用了ImageMagick做图片处理的互联网厂商,我就不一一列举了,感兴趣的可以关注补天、乌云等漏洞平台。我们后续也会跟进一些开源程序的受影响情况。

漏洞修复

这个漏洞在4月30日被报告给了ImageMagick官方,官网当天便发布了一个新版本6.9.3-9修复这个问题,我们看一下官方是如何修复这个漏洞的。

ImageMagick命令执行漏洞分析

https://github.com/ImageMagick/ImageMagick/commit/2c04b05f205b5198f4c01b0c86097cba2b218fcf

将%M变为了%F,其实也就是通过filter过滤了一遍,通过白名单限制了允许传入的字符串:

那么在白名单里的有哪些字符呢:

ImageMagick命令执行漏洞分析

图中的whitelist也就是白名单里的字符串,是的,你没有看错,单引号、双引号、反引号、转义符这些危险字符依然被允许传入。

在逗我吗…?

ImageMagick命令执行漏洞分析

随后有人指出其修复方法可被绕过,ImageMagick于是在5月3日又发布了6.9.3-10版本,更改了允许传入字符的白名单。

ImageMagick命令执行漏洞分析

所以目前将ImageMagick升级至6.9.3-10版本可修复此安全漏洞,同时官方还建议用户,如果不需要这些功能,可以通过配置policy.xml的方式来禁止https、mvg这些delegate,或者直接在配置文件删除相应的delegate。

参考

http://www.openwall.com/lists/oss-security/2016/05/03/18

http://ricterz.me/posts/Write%20Up%3A%20Remote%20Command%20Execute%20in%20Wordpress%204.5.1

http://drops.wooyun.org/papers/15589

转载本站任何文章请注明:转载至神刀安全网,谢谢神刀安全网 » ImageMagick命令执行漏洞分析

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址