Rumah  >  Artikel  >  Operasi dan penyelenggaraan  >  Cara menganalisis kerentanan pintasan kotak pasir Ghostscript SAFER

Cara menganalisis kerentanan pintasan kotak pasir Ghostscript SAFER

WBOY
WBOYke hadapan
2023-05-18 19:10:391375semak imbas

Kata Pengantar

Ghostscript ialah perisian yang digunakan untuk mentafsir bahasa Adobe PostScript. Bahasa PostScript boleh digunakan untuk melukis dan menyokong penukaran antara PS dan PDF. Pada masa ini, ia dipasang secara lalai dalam kebanyakan pengedaran Linux dan telah dialihkan ke Unix, MacOS, Windows dan platform lain Ghostscript juga digunakan oleh program seperti ImagineMagic, Python PIL dan pelbagai pembaca PDF.

Perihalan Kerentanan

Pada 21 Ogos, penyelidik keselamatan Google Tavis Ormandy mendedahkan berbilang kelemahan GhostScript Dengan membina skrip PostScript yang berniat jahat dalam imej, kotak pasir keselamatan yang SAFER boleh dipintas, oleh itu Punca kelemahan. seperti pelaksanaan arahan, pembacaan fail dan pemadaman fail ialah apabila GhostScript menghuraikan arahan pemulihan, ia menetapkan parameter LockSafetyParams kepada False buat sementara waktu, sekali gus mematikan mod SELAMAT.

Versi sistem yang terjejas

Ghostscript <= 9.23 (semua versi, semua platform), tiada kemas kini rasmi dikeluarkan lagi.

Butiran kerentanan

Mod selamat Ghostscript (mod SELAMAT)

Ghostscript mengandungi pilihan -dSAFER pilihan Selepas menetapkan pilihan ini untuk memulakan mod kotak pasir selamat, Operator berkaitan dengan fail akan dilarang. Fungsi khusus adalah seperti berikut:

(1) Lumpuhkan operator deletefile dan namakan semula, boleh membuka arahan paip (%pipe%cmd), dan hanya stdout boleh dibuka pada masa yang sama dan stderr untuk menulis

(2) Lumpuhkan membaca fail selain daripada stdin

(3) Tetapkan parameter LockSafetyParams peranti kepada True, dengan itu menghalang penggunaan parameter OutputFile kepada tulis fail

(4) Cegah /GenericResourceDir, /FontResourceDir, /SystemParamsPassword atau /StartJobPassword daripada ditukar

Berikut ialah demonstrasi mudah pilihan ini.

Apabila parameter -dSAFER tidak ditambahkan, fail /etc/passwd berjaya dibaca:

如何进行Ghostscript SAFER沙箱绕过漏洞的分析

Selepas parameter -dSAFER ditambahkan, akses fail tidak sah ralat berlaku:

如何进行Ghostscript SAFER沙箱绕过漏洞的分析

Pengesahan Kerentanan

Penyerang boleh menggunakan berbilang arahan PostScript untuk memintas perlindungan yang disediakan oleh -dSAFER dan melaksanakan arahan tanpa sebarang sekatan.

Mula-mula uji PoC Dengan kotak pasir keselamatan dihidupkan (-dSAFER), anda boleh berjaya melaksanakan sebarang arahan shell:

如何进行Ghostscript SAFER沙箱绕过漏洞的分析如何进行Ghostscript SAFER沙箱绕过漏洞的分析

Gunakan perintah tukar dalam alat ImageMagick untuk menguji PoC Anda boleh melihat bahawa ImageMagick turut terjejas:

如何进行Ghostscript SAFER沙箱绕过漏洞的分析

Gunakan arahan "grep -r dSAFER" dalam direktori sumber untuk mencari. dan pilihan ini Untuk operasi berkaitan, lihat ulasan berikut menerangkan fungsi khusus pilihan ini - tetapkan LockSafetyParams kepada Benar.

如何进行Ghostscript SAFER沙箱绕过漏洞的分析

Gunakan grep untuk melihat operasi yang berkaitan dengan LockSafetyParams Daripada ulasan, kita dapat melihat bahawa apabila nilai pembolehubah jenis Boolean ini ialah True, operasi tidak selamat tertentu boleh dihalang. . Pada masa yang sama, dalam baris 269 fail psi/zdevice2.c, pembolehubah ditetapkan kepada False, dan hanya di sini nilai LockSafetyParams diubah suai kepada False Oleh itu, boleh diagak bahawa perubahan ini disebabkan oleh penghuraian daripada pernyataan PostScript tertentu dalam PoC.

如何进行Ghostscript SAFER沙箱绕过漏洞的分析

Analisis Nyahpepijat

Seterusnya gunakan GDB untuk mengesahkan, mula-mula tetapkan parameter program:

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

Menurut output grep sebelumnya, cari Pernyataan "dev_old->LockSafetyParams = false;" berada dalam fungsi restore_page_device(), dan diganggu di sini Jalankan program dan masukkan PoC:

Tetapkan kawasan pengimejan - sah (a4, b5,. surat, dsb. juga Ya):

如何进行Ghostscript SAFER沙箱绕过漏洞的分析

Program berhenti apabila melaksanakan {null restore} berhenti {pop} jika, dan berhenti pada kedudukan ini:

如何进行Ghostscript SAFER沙箱绕过漏洞的分析

Tetapkan titik pemerhatian pada pembolehubah dev_old->LockSafetyParams dan teruskan menjalankan program Seperti yang dijangkakan, nilai LockSafetyParams ditukar di sini.

如何进行Ghostscript SAFER沙箱绕过漏洞的分析

Melihat pada surih balik tindanan, didapati bahawa fungsi semasa dipanggil dalam satu siri fungsi dengan "tafsiran". digunakan untuk menghuraikan pernyataan PostScript.

如何进行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”/>

Atas ialah kandungan terperinci Cara menganalisis kerentanan pintasan kotak pasir Ghostscript SAFER. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam