搜尋
首頁運維安全如何進行Ghostscript SAFER沙箱繞過漏洞的分析

前言

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

漏洞細節

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

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

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

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!