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.
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.
Ghostscript <= 9.23 (semua versi, semua platform), tiada kemas kini rasmi dikeluarkan lagi.
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:
Selepas parameter -dSAFER ditambahkan, akses fail tidak sah ralat berlaku:
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:
Gunakan perintah tukar dalam alat ImageMagick untuk menguji PoC Anda boleh melihat bahawa ImageMagick turut terjejas:
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.
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.
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):
Program berhenti apabila melaksanakan {null restore} berhenti {pop} jika, dan berhenti pada kedudukan ini:
Tetapkan titik pemerhatian pada pembolehubah dev_old->LockSafetyParams dan teruskan menjalankan program Seperti yang dijangkakan, nilai LockSafetyParams ditukar di sini.
Melihat pada surih balik tindanan, didapati bahawa fungsi semasa dipanggil dalam satu siri fungsi dengan "tafsiran". digunakan untuk menghuraikan pernyataan 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”/>
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!