關於Ghostscript SAFER沙箱繞過漏洞的分析

IT168GB發表於2018-08-31

前言

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檔案:

讀取了/etc/passwd檔案

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

出現invalidfileaccess錯誤

漏洞驗證

多個PostScript操作可以繞過-dSAFER提供的保護,這可以允許攻擊者使用任意引數執行命令。

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

成功執行任意shell命令 成功執行任意shell命令

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

ImageMagick同樣受到影響

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

將LockSafetyParams設定為True

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

PoC中某條PostScript語句解析時導致了這個改變

除錯分析

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


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


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

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

設定成像區域

接著輸入{null restore} stopped {pop} if,程式中斷在此處: 

程式中斷在此處

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

LockSafetyParams的值在這裡被改變

檢視棧回溯,發現當前函式在一系列帶有“interpret”的函式中被呼叫,從名稱推斷這些函式用於解析PostScript語句。

用於解析PostScript語句

這裡我們在#2處下斷,觀察到了直譯器處理stopped、null、restore等關鍵字的過程,至此繞過SAFER沙箱過程就逐漸清晰了。

繞過SAFER沙箱過程

繞過SAFER沙箱過程

繞過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的官方文件中提到了restore運算子存在導致繞過SAFER模式的風險。

繞過SAFER模式

漏洞利用

OutputFile引數用於設定輸出檔名,另外在Linux/Unix上,還可以透過裝置%pipe%將輸出傳送到管道(Windows中也可以,需要使用兩個%)。例如,要將輸出透過管道傳輸到lpr可以使用:/OutputFile (%pipe%lpr)

查閱官方文件可知,%pipe%功能由popen函式支援,在除錯中也能確認這一點: 

除錯中也能確認這一點

除錯中也能確認這一點

popen()函式透過建立管道的方式,呼叫fork()啟動一個子程式,並將傳入popen()的命令送到/bin/sh以-c引數執行。可以透過在此處注入命令實現漏洞利用,如下圖中演示的那樣,另外將PostScript編碼到影像中,可以在使用GhostScript的Web伺服器上執行任意指令(例如伺服器使用ImageMagick處理上傳的影像時)。

使用GhostScript的Web伺服器上執行任意指令

使用GhostScript的Web伺服器上執行任意指令

修復建議

截至筆者分析該漏洞時,官方還沒修復該漏洞。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”/>

參考資料

[1]

[2] PostScript Language Reference(third edition)

[3]

[4] ImageMagick 漏洞利用方式及分析

[5]

[6]


本文轉載自:“ FreeBuf.COM ”,原文作者: alphalab

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31510736/viewspace-2213371/,如需轉載,請註明出處,否則將追究法律責任。

相關文章