Ghostscript SAFER サンドボックス バイパスの脆弱性を分析する方法

WBOY
リリース: 2023-05-18 19:10:39
転載
1430 人が閲覧しました

はじめに

Ghostscript は、Adobe PostScript 言語を解釈するために使用されるソフトウェアです。 PostScript 言語を描画に使用でき、PS と PDF 間の変換をサポートします。現在、Ghostscript はほとんどの Linux ディストリビューションにデフォルトでインストールされており、Unix、MacOS、Windows、その他のプラットフォームに移植されており、ImagineMagic、Python PIL、さまざまな PDF リーダーなどのプログラムでも使用されています。

脆弱性の説明

8月 21 日、Google のセキュリティ研究者 Tavis Ormandy 氏は、複数の GhostScript の脆弱性を公開しました。画像内に悪意のある PostScript スクリプトを構築することで、SAFER セキュリティ サンドボックスがバイパスされ、脆弱性の根本原因となります。コマンドの実行、ファイルの読み取り、ファイルの削除などでは、GhostScript が復元コマンドを解析するときに、LockSafetyParams パラメーターが一時的に False に設定され、SAFER モードがオフになります。

影響を受けるシステム バージョン

Ghostscript

脆弱性の詳細

Ghostscript セーフ モード (SAFER モード)

Ghostscript にはオプションの -dSAFER オプションが含まれています。このオプションを設定してセーフ サンドボックス モードを開始した後、オペレーターは

(1) deletefile および renamefile 演算子を無効にし、パイプ コマンド (%pipe%cmd) を開くことができるようにし、stdout のみを開くことができるようにします。

#(2) stdin 以外のファイルの読み取りを無効にする

#(3) ファイルの書き込みに OutputFile パラメータを使用しないようにするには、デバイスの LockSafetyParams パラメータを True に設定します

(4) /GenericResourceDir、/FontResourceDir、/SystemParamsPassword、または /StartJobPassword が変更されないようにします

次に、このオプションの簡単なデモンストレーションを示します。

-dSAFER パラメータが追加されていない場合、/etc/passwd ファイルは正常に読み取られます:

如何进行Ghostscript SAFER沙箱绕过漏洞的分析-dSAFER パラメータが追加されると、無効なファイルアクセスが発生します。エラーが発生します:

如何进行Ghostscript SAFER沙箱绕过漏洞的分析脆弱性の検証

攻撃者は、複数の PostScript 命令を使用して、-dSAFER によって提供される保護を回避し、制限なくコマンドを実行できます。

最初に PoC をテストします。セキュリティ サンドボックスをオン (-dSAFER) にすると、どのシェル コマンドも正常に実行できます。

如何进行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沙箱绕过漏洞的分析

デバッグ分析如何进行Ghostscript SAFER沙箱绕过漏洞的分析

次に、GDB を使用して確認し、最初にプログラム パラメーターを設定します。

set args -q -sDEVICE=ppmraw -dSAFER -sOutputFile=/dev/null
ログイン後にコピー

前の grep 出力に従って、次のことを見つけます。 「dev_old->LockSafetyParams = false;」ステートメントは関数restore_page_device()内にあり、ここで中断されます。プログラムを実行してPoCに入ります:

イメージング領域を設定します - 合法(a4、b5、文字なども Yes):

{null 復元} を実行するとプログラムが停止し、{pop} が停止した場合、次の位置で停止します: 如何进行Ghostscript SAFER沙箱绕过漏洞的分析

次に、dev_old->LockSafetyParams 変数に観測ポイントを設定し、プログラムの実行を続行すると、予想どおり、LockSafetyParams の値がここで変更されます。 如何进行Ghostscript SAFER沙箱绕过漏洞的分析

スタックトレースバックを見ると、現在の関数は「interpret」を伴う一連の関数の中で呼び出されていることがわかり、名前からこれらの関数が使用されていることが推測されます。 PostScript ステートメントを解析します。 如何进行Ghostscript SAFER沙箱绕过漏洞的分析

如何进行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 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:yisu.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート