Heim > Artikel > Betrieb und Instandhaltung > So analysieren Sie die Schwachstelle der Ghostscript SAFER-Sandbox-Umgehung
Ghostscript ist eine Software zur Interpretation der Adobe PostScript-Sprache. Die PostScript-Sprache kann zum Zeichnen verwendet werden und unterstützt die Konvertierung zwischen PS und PDF. Derzeit ist es standardmäßig in den meisten Linux-Distributionen installiert und wurde auf Unix, MacOS, Windows und andere Plattformen portiert. Ghostscript wird auch von Programmen wie ImagineMagic, Python PIL und verschiedenen PDF-Readern verwendet.
Am 21. August hat der Google-Sicherheitsforscher Tavis Ormandy mehrere GhostScript-Schwachstellen offengelegt. Durch die Erstellung bösartiger PostScript-Skripte in Bildern kann die SAFER-Sicherheitssandbox umgangen werden, was zur Befehlsausführung und zum Lesen von Dateien führt Das Löschen von Dateien besteht darin, dass GhostScript beim Parsen des Wiederherstellungsbefehls den Parameter LockSafetyParams vorübergehend auf False setzt und dadurch den SAFER-Modus deaktiviert.
Ghostscript <= 9.23 (alle Versionen, alle Plattformen), es wurde noch kein offizielles Update veröffentlicht.
Ghostscript enthält eine optionale Option -dSAFER, um den sicheren Sandbox-Modus zu starten. Die spezifischen Funktionen sind wie folgt:
(1) Deaktivieren Sie die Operatoren „deletefile“ und „renamefile“ und können Pipe-Befehle öffnen (%pipe%cmd), während nur stdout und stderr zum Schreiben geöffnet werden können
(2) Deaktivieren Sie das Lesen anderer Dateien als stdin
( 3) Setzen Sie den LockSafetyParams-Parameter des Geräts auf True, um zu verhindern, dass der OutputFile-Parameter zum Schreiben von Dateien verwendet wird
(4) Verhindern Sie, dass /GenericResourceDir, /FontResourceDir, /SystemParamsPassword oder /StartJobPassword geändert werden
Hier ist eine einfache Demonstration dieser Option.
Wenn der Parameter -dSAFER nicht hinzugefügt wird, wird die Datei /etc/passwd erfolgreich gelesen:
Nachdem der Parameter -dSAFER hinzugefügt wurde, tritt ein ungültiger Dateizugriffsfehler auf:
Ein Angreifer kann mehrere PostScript-Anweisungen übergeben, um den durch -dSAFER bereitgestellten Schutz zu umgehen und den Befehl ohne Einschränkungen auszuführen.
Testen Sie zunächst den PoC. Wenn die Sicherheitssandbox aktiviert ist (-dSAFER), können Sie jeden Shell-Befehl erfolgreich ausführen:
Verwenden Sie den Befehl „convert“ im ImageMagick-Tool, um den PoC zu testen hat das gleiche Betroffen:
Verwenden Sie den Befehl „grep -r dSAFER“ im Quellverzeichnis, um die mit dieser Option verbundenen Vorgänge zu finden. Sehen Sie sich den folgenden Kommentar an, um die spezifische Funktion dieser Option zu erläutern – setzen Sie LockSafetyParams auf True.
Verwenden Sie dann grep, um die Vorgänge im Zusammenhang mit LockSafetyParams anzuzeigen. Aus den Kommentaren können wir ersehen, dass bestimmte unsichere Vorgänge verhindert werden können, wenn der Wert dieser Variable vom Typ Boolescher Wert True ist. Gleichzeitig wird in Zeile 269 der Datei psi/zdevice2.c die Variable auf False gesetzt und nur hier der Wert von LockSafetyParams auf False geändert. Daher kann davon ausgegangen werden, dass diese Änderung durch das Parsen verursacht wurde einer bestimmten PostScript-Anweisung im PoC.
Verwenden Sie als Nächstes GDB zur Überprüfung und legen Sie zunächst die Programmparameter fest:
set args -q -sDEVICE=ppmraw -dSAFER -sOutputFile=/dev/null
Suchen Sie gemäß der vorherigen grep-Ausgabe die Anweisung „dev_old->LockSafetyParams = false;“ in der Funktion „restore_page_device()“ , Und hören Sie hier auf, führen Sie das Programm aus und geben Sie den PoC ein:
Stellen Sie den Bildbereich ein – legal (A4, B5, Buchstabe usw. sind ebenfalls verfügbar):
Das Programm stoppt, wenn die Ausführung von {Null Restore} gestoppt wird {pop} if , und stoppen Sie an dieser Position:
Dann setzen Sie den Beobachtungspunkt auf die Variable dev_old->LockSafetyParams und führen Sie das Programm weiter aus. Wie erwartet wurde der Wert von LockSafetyParams hier geändert.
Beim Betrachten des Stack-Tracebacks haben wir festgestellt, dass die aktuelle Funktion in einer Reihe von Funktionen mit „interpret“ aufgerufen wurde. Aus dem Namen lässt sich schließen, dass diese Funktionen zum Parsen von PostScript-Anweisungen verwendet werden.
这里我们在#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”/>
Das obige ist der detaillierte Inhalt vonSo analysieren Sie die Schwachstelle der Ghostscript SAFER-Sandbox-Umgehung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!