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包含一個可選的-dSAFER選項,設定該選項啟動安全沙箱模式後,與檔案相關的操作符將被禁止,具體作用有如下:
##以下是關於該選項的一個簡單示範。 未加上-dSAFER參數時,成功讀取了/etc/passwd檔案:加上-dSAFER參數後,出現invalidfileaccess錯誤: 漏洞驗證攻擊者可以透過多個PostScript指令來規避-dSAFER提供的保護並在不受任何限制的情況下執行命令。 首先對PoC進行測試,在開啟了安全沙箱的情況下(-dSAFER),可以成功執行任意shell指令:使用ImageMagick工具中的convert指令測試PoC,可以看到ImageMagick同樣受到影響:在原始碼目錄下使用指令「grep -r dSAFER」找到和該選項相關的操作,看到下面這段註解中說明了該選項具體功能-將LockSafetyParams設為True。 再使用grep檢視和LockSafetyParams相關操作,透過註解可知,這個布林類型變的量值為True時,可以防止某些不安全的操作。同時在檔案psi/zdevice2.c的第269行,該變數被設定為了False,且僅有此處修改了LockSafetyParams的值為False,因此可以猜測:PoC中某條PostScript語句解析時導致了這個改變。 調試分析接下來使用GDB進行驗證,首先設定好程式參數:(1)禁用deletefile和renamefile操作符,能夠開啟管道指令(%pipe%cmd),同時只能開啟stdout和stderr進行寫入
(2)停用讀取stdin以外的檔案
(3)設定裝置的LockSafetyParams參數為True,從而防止使用OutputFile參數寫入檔案
(4)阻止/GenericResourceDir、/FontResourceDir、/SystemParamsPassword或/StartJobPassword被更改
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的值在這裡被改變了。 查看堆疊回溯,發現目前函數在一系列帶有「interpret」的函數中被調用,從名稱推斷這些函數用於解析PostScript語句。
这里我们在#2处下断,观察到了解释器处理stopped、null、restore等关键字的过程,至此绕过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模式的风险。
OutputFile参数用于设置输出文件名,另外在Linux/Unix上,还可以通过设备%pipe%将输出发送到管道(Windows中也可以,需要使用两个%)。通过管道将输出传输到lpr可以使用以下方式:/OutputFile (%pipe%lpr)
查阅官方文档可知,%pipe%功能由popen函数支持,在调试中也能确认这一点:
popen()函数通过创建管道的方式,调用fork()启动一个子进程,并将传入popen()的命令送到/bin/sh以-c参数执行。可以通过在此处注入命令实现漏洞利用,如下图中演示的那样,另外将PostScript编码到图像中,可以在使用GhostScript的Web服务器上执行任意指令(例如服务器使用ImageMagick处理上传的图像时)。
截至笔者分析该漏洞时,官方还没修复该漏洞。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中文網其他相關文章!