Ghostscript est un logiciel utilisé pour interpréter le langage Adobe PostScript. Le langage PostScript peut être utilisé pour le dessin et prend en charge la conversion entre PS et PDF. Actuellement, il est installé par défaut dans la plupart des distributions Linux et a été porté sur Unix, MacOS, Windows et d'autres plates-formes. Ghostscript est également utilisé par des programmes tels que ImagineMagic, Python PIL et divers lecteurs PDF.
Le 21 août, le chercheur en sécurité de Google, Tavis Ormandy, a révélé plusieurs vulnérabilités GhostScript. En construisant des scripts PostScript malveillants dans des images, le bac à sable de sécurité SAFER peut être contourné, ce qui entraîne l'exécution de commandes, la lecture de fichiers, la cause première de vulnérabilités telles. car la suppression de fichier est que lorsque GhostScript analyse la commande de restauration, il définit temporairement le paramètre LockSafetyParams sur False, désactivant ainsi le mode PLUS SÛR.
Ghostscript <= 9.23 (toutes versions, toutes plateformes), aucune mise à jour officielle n'a encore été publiée.
Ghostscript contient une option facultative -dSAFER Après avoir défini cette option pour démarrer le mode sandbox sécurisé, les opérateurs liés aux fichiers seront interdits.
(1) Désactivez les opérateurs deletefile et renamefile, soyez capable d'ouvrir les commandes de tube (%pipe%cmd), tandis que seuls stdout et stderr peuvent être ouverts en écriture
(2) Désactivez la lecture de fichiers autres que stdin
( 3 ) Définissez le paramètre LockSafetyParams de l'appareil sur True, empêchant ainsi l'utilisation du paramètre OutputFile pour écrire des fichiers
(4) Empêchez /GenericResourceDir, /FontResourceDir, /SystemParamsPassword ou /StartJobPassword d'être modifié
Voici une démonstration simple de ceci option.
Lorsque le paramètre -dSAFER n'est pas ajouté, le fichier /etc/passwd est lu avec succès :
Après l'ajout du paramètre -dSAFER, une erreur d'accès au fichier invalide se produit :
Un attaquant peut transmettre plusieurs directives PostScript pour contourner la protection fournie par -dSAFER et exécuter la commande sans aucune restriction.
Testez d'abord le PoC. Avec le bac à sable de sécurité activé (-dSAFER), vous pouvez exécuter avec succès n'importe quelle commande shell :
Utilisez la commande convert dans l'outil ImageMagick pour tester le PoC. Vous pouvez voir qu'ImageMagick. a le même Affecté :
Utilisez la commande "grep -r dSAFER" dans le répertoire source pour trouver les opérations liées à cette option. Voir le commentaire suivant pour expliquer la fonction spécifique de cette option - définissez LockSafetyParams sur True.
Utilisez ensuite grep pour visualiser les opérations liées à LockSafetyParams. D'après les commentaires, nous pouvons voir que lorsque la valeur de cette variable de type booléen est True, certaines opérations non sécurisées peuvent être empêchées. En même temps, à la ligne 269 du fichier psi/zdevice2.c, la variable est définie sur False, et seulement ici la valeur de LockSafetyParams est modifiée sur False. Par conséquent, on peut deviner que ce changement a été provoqué par l'analyse. d'une certaine instruction PostScript dans le PoC.
Ensuite, utilisez GDB pour vérifier, définissez d'abord les paramètres du programme :
set args -q -sDEVICE=ppmraw -dSAFER -sOutputFile=/dev/null
Selon la sortie grep précédente, recherchez l'instruction "dev_old->LockSafetyParams = false;" , Et arrêtez ici, exécutez le programme et entrez dans le PoC :
Définissez la zone d'imagerie - légale (a4, b5, lettre, etc. sont également disponibles) :
Le programme s'arrête lorsque l'exécution de {null recovery} est arrêtée {pop} if , et arrêtez-vous à cette position :
Ensuite, définissez le point d'observation sur la variable dev_old->LockSafetyParams et continuez à exécuter le programme. Comme prévu, la valeur de LockSafetyParams a été modifiée ici.
En regardant le traçage de la pile, nous avons constaté que la fonction actuelle a été appelée dans une série de fonctions avec « interpréter ». On déduit du nom que ces fonctions sont utilisées pour analyser les instructions 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”/>
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!