Comment analyser la vulnérabilité de contournement du bac à sable Ghostscript SAFER

WBOY
Libérer: 2023-05-18 19:10:39
avant
1430 Les gens l'ont consulté

Avant-propos

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.

Description de la vulnérabilité

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.

Version du système concernée

Ghostscript <= 9.23 (toutes versions, toutes plateformes), aucune mise à jour officielle n'a encore été publiée.

Détails de la vulnérabilité

Mode sans échec Ghostscript (mode SAFER)

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 :

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

Après l'ajout du paramètre -dSAFER, une erreur d'accès au fichier invalide se produit :

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

Vérification de la vulnérabilité

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 :

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

Utilisez la commande convert dans l'outil ImageMagick pour tester le PoC. Vous pouvez voir qu'ImageMagick. a le même Affecté :

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

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.

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

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.

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

Analyse de débogage

Ensuite, utilisez GDB pour vérifier, définissez d'abord les paramètres du programme :

set args -q -sDEVICE=ppmraw -dSAFER -sOutputFile=/dev/null
Copier après la connexion

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) :

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

Le programme s'arrête lorsque l'exécution de {null recovery} est arrêtée {pop} if , et arrêtez-vous à cette position :

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

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.

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

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.

如何进行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”/>
Copier après la connexion

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!

Étiquettes associées:
source:yisu.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal