首頁  >  文章  >  運維  >  如何進行Ghostscript SAFER沙箱繞過漏洞的分析

如何進行Ghostscript SAFER沙箱繞過漏洞的分析

WBOY
WBOY轉載
2023-05-18 19:10:391427瀏覽

前言

Ghostscript是用來解釋Adobe PostScript語言的軟體。 PostScript語言可用於製圖,並支援PS和PDF之間的互相轉換。目前大多數Linux發行版中都預設安裝,並移植到了Unix、MacOS、Windows等平台,且Ghostscript也被ImagineMagic、Python PIL和各種PDF閱讀器等程式所使用。

漏洞描述

8月21日,Google安全研究員Tavis Ormandy揭露了多個GhostScript的漏洞,透過在圖片中建構惡意PostScript腳本,可以繞過SAFER安全沙箱,從而造成指令執行、檔案讀取、檔案刪除等漏洞,其根本原因是GhostScript解析restore指令時,會暫時將參數LockSafetyParams設定為False,進而關閉SAFER模式。

受影響的系統版本

Ghostscript <= 9.23(全版本、全平台),目前官方暫未發布更新。

漏洞細節

Ghostscript安全模式(SAFER mode)

Ghostscript包含一個可選的-dSAFER選項,設定該選項啟動安全沙箱模式後,與檔案相關的操作符將被禁止,具體作用有如下:

(1)禁用deletefile和renamefile操作符,能夠開啟管道指令(%pipe%cmd),同時只能開啟stdout和stderr進行寫入

(2)停用讀取stdin以外的檔案

(3)設定裝置的LockSafetyParams參數為True,從而防止使用OutputFile參數寫入檔案

(4)阻止/GenericResourceDir、/FontResourceDir、/SystemParamsPassword或/StartJobPassword被更改

##以下是關於該選項的一個簡單示範。

未加上-dSAFER參數時,成功讀取了/etc/passwd檔案:

如何进行Ghostscript SAFER沙箱绕过漏洞的分析

加上-dSAFER參數後,出現invalidfileaccess錯誤:

如何进行Ghostscript SAFER沙箱绕过漏洞的分析

漏洞驗證

攻擊者可以透過多個PostScript指令來規避-dSAFER提供的保護並在不受任何限制的情況下執行命令。

首先對PoC進行測試,在開啟了安全沙箱的情況下(-dSAFER),可以成功執行任意shell指令:

如何进行Ghostscript SAFER沙箱绕过漏洞的分析如何进行Ghostscript SAFER沙箱绕过漏洞的分析

使用ImageMagick工具中的convert指令測試PoC,可以看到ImageMagick同樣受到影響:

如何进行Ghostscript SAFER沙箱绕过漏洞的分析

在原始碼目錄下使用指令「grep -r dSAFER」找到和該選項相關的操作,看到下面這段註解中說明了該選項具體功能-將LockSafetyParams設為True。

如何进行Ghostscript SAFER沙箱绕过漏洞的分析

再使用grep檢視和LockSafetyParams相關操作,透過註解可知,這個布林類型變的量值為True時,可以防止某些不安全的操作。同時在檔案psi/zdevice2.c的第269行,該變數被設定為了False,且僅有此處修改了LockSafetyParams的值為False,因此可以猜測:PoC中某條PostScript語句解析時導致了這個改變。

如何进行Ghostscript SAFER沙箱绕过漏洞的分析

調試分析

接下來使用GDB進行驗證,首先設定好程式參數:

set args -q -sDEVICE=ppmraw -dSAFER -sOutputFile=/dev/null

根據前面grep的輸出,找到「dev_old->LockSafetyParams = false; 」語句在函數restore_page_device()中,並在此下斷,運行程式輸入PoC:

設定成像區域-legal(a4、b5、letter等也可以):

如何进行Ghostscript SAFER沙箱绕过漏洞的分析

程式在執行{null restore} stopped {pop} if時停止,並停在這個位置: 

如何进行Ghostscript SAFER沙箱绕过漏洞的分析

再對dev_old->LockSafetyParams變數設定觀察點,繼續運行程序,和預想的一樣,LockSafetyParams的值在這裡被改變了。 

如何进行Ghostscript SAFER沙箱绕过漏洞的分析

查看堆疊回溯,發現目前函數在一系列帶有「interpret」的函數中被調用,從名稱推斷這些函數用於解析PostScript語句。

如何进行Ghostscript SAFER沙箱绕过漏洞的分析

这里我们在#2处下断,观察到了解释器处理stopped、null、restore等关键字的过程,至此绕过SAFER沙箱过程就逐渐清晰了。

如何进行Ghostscript SAFER沙箱绕过漏洞的分析

如何进行Ghostscript SAFER沙箱绕过漏洞的分析

如何进行Ghostscript SAFER沙箱绕过漏洞的分析

漏洞成因

现在让我们来看看{null restore} stopped {pop} if这条语句是如何绕过SAFER沙箱的。

PostScript是一种“逆波兰式”(Reverse Polish Notation,也称为后缀表达式)的语言。简单来说就是操作数在前,操作符在后。PoC中这条语句是一条典型的PostScript异常处理语句,stopped操作符用于PostScript的异常处理,也就是说stopped执行前面的{}中给出的过程,如果解释器在执行该过程期间出现错误,它将终止该过程并执行stopped操作符之后{}中的过程。

null restore会引起类型检查错误(/typecheck error),同时restore的执行导致LockSafetyParams设置为False,stopped捕获到异常,弹出栈顶元素null,GS继续运行,但此时LockSafetyParams的值还没恢复为True。

如何进行Ghostscript SAFER沙箱绕过漏洞的分析

值得一提的是,GhostScript的官方文档中提到了restore操作符存在导致绕过SAFER模式的风险。

如何进行Ghostscript SAFER沙箱绕过漏洞的分析

漏洞利用

OutputFile参数用于设置输出文件名,另外在Linux/Unix上,还可以通过设备%pipe%将输出发送到管道(Windows中也可以,需要使用两个%)。通过管道将输出传输到lpr可以使用以下方式:/OutputFile (%pipe%lpr)

查阅官方文档可知,%pipe%功能由popen函数支持,在调试中也能确认这一点: 

如何进行Ghostscript SAFER沙箱绕过漏洞的分析

如何进行Ghostscript SAFER沙箱绕过漏洞的分析

popen()函数通过创建管道的方式,调用fork()启动一个子进程,并将传入popen()的命令送到/bin/sh以-c参数执行。可以通过在此处注入命令实现漏洞利用,如下图中演示的那样,另外将PostScript编码到图像中,可以在使用GhostScript的Web服务器上执行任意指令(例如服务器使用ImageMagick处理上传的图像时)。

如何进行Ghostscript SAFER沙箱绕过漏洞的分析

如何进行Ghostscript SAFER沙箱绕过漏洞的分析

修复建议

截至笔者分析该漏洞时,官方还没修复该漏洞。Artifex Software,ImageMagick,Redhat,Ubuntu等厂商已声明受到此漏洞影响,其他平台暂时未对此漏洞进行说明,目前临时解决方案如下:

1. 卸载GhostScript;

2. 可在/etc/ImageMagick/policy.xml文件中添加如下代码来禁用PostScript、EPS、PDF以及XPS解码器:

<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”/>

以上是如何進行Ghostscript SAFER沙箱繞過漏洞的分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除