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 にはオプションの -dSAFER オプションが含まれています。このオプションを設定してセーフ サンドボックス モードを開始した後、オペレーターは
(1) deletefile および renamefile 演算子を無効にし、パイプ コマンド (%pipe%cmd) を開くことができるようにし、stdout のみを開くことができるようにします。
#(2) stdin 以外のファイルの読み取りを無効にする#(3) ファイルの書き込みに OutputFile パラメータを使用しないようにするには、デバイスの LockSafetyParams パラメータを True に設定します
(4) /GenericResourceDir、/FontResourceDir、/SystemParamsPassword、または /StartJobPassword が変更されないようにします
次に、このオプションの簡単なデモンストレーションを示します。
-dSAFER パラメータが追加されていない場合、/etc/passwd ファイルは正常に読み取られます:
-dSAFER パラメータが追加されると、無効なファイルアクセスが発生します。エラーが発生します:
脆弱性の検証
最初に PoC をテストします。セキュリティ サンドボックスをオン (-dSAFER) にすると、どのシェル コマンドも正常に実行できます。
## ImageMagick ツールの Convert コマンドを使用して PoC をテストします。ImageMagick も影響を受けることがわかります:
ソース ディレクトリでコマンド "grep -r dSAFER" を使用して、およびこのオプション 関連する操作については、このオプションの特定の機能を説明する次のコメントを参照してください (LockSafetyParams を True に設定します)。
grep を使用して、LockSafetyParams に関連する操作を表示します。コメントから、このブール型変数の値が True の場合、特定の安全でない操作を防止できることがわかります。 。同時に、ファイル psi/zdevice2.c の 269 行目で変数が False に設定されており、ここだけ LockSafetyParams の値が False に変更されているため、この変更は解析によって引き起こされたものであると推測できます。 PoC における特定の PostScript ステートメントの説明。
デバッグ分析
次に、GDB を使用して確認し、最初にプログラム パラメーターを設定します。set args -q -sDEVICE=ppmraw -dSAFER -sOutputFile=/dev/null
{null 復元} を実行するとプログラムが停止し、{pop} が停止した場合、次の位置で停止します:
次に、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 中国語 Web サイトの他の関連記事を参照してください。