ImageMagick 命令注入漏洞考古(CVE-2016–3714)

1. 漏洞背景及利用方式

1.1 漏洞背景

ImageMagick 是一个应用非常广泛的开源图像处理套件,提供了链接库和方便的命令行工具用于图片的剪裁、格式的转换等。很多的在线服务,如用户头像编辑、图片上传等,均使用了 ImageMagick。
Imagemagick 支持调用外部程序来处理文件(delegate),并根据不同的文件模式来调用不同的命令或动态库,相关操作映射记录在代码以及配置文件中(/etc/ImageMagick/delegates.xml)。
其主要通过 system() 函数调用外部命令,命令的拼接过程进行了一定的过滤和处理(SanitizeDelegateCommand())。拼接过程中利用 “%M” 占位符进行字符串替换,比如 https pattern 处理逻辑如下:

这里 “%M” 会被完全替换成用户输入的数据,因此造成命令注入。 其他 pattern 的漏洞利用不尽相同,这里就不展开了。
(附:漏洞修复前的 delegates.xml: https://github.com/ImageMagick/ImageMagick6/blob/c0a407d58b92a9e8285c6bf1cc31bc836d6ea467/config/delegates.xml.in

1.2 利用方式

由于漏洞版本的 ImageMagick 会根据文件头数据判断文件类型,因此利用方式较多,且可以绕过一些 Web 系统对文件后缀的过滤

  • POC 1: 命令行参数的简单验证

  • POC2: SVG 文件利用

  • POC 3: MVG 文件利用 (可改后缀名为 png )


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

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
[email protected]&;<>()/\\'\":%=~`>
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. 参考资料

发表评论

您的电子邮箱地址不会被公开。