
PoC éducatif pour CVE-2017-8291 (GhostButt) démontrant l'exécution de commandes à distance via le traitement d'images EPS par Python PIL/Pillow avec contournement de la sandbox GhostScript.
Python PIL (Pillow) est une bibliothèque de traitement d'images très populaire pour Python. Elle prend en charge divers formats d'image et fournit de puissantes capacités de manipulation d'images.
Le module de traitement d'images Python PIL (Pillow) est affecté par la vulnérabilité GhostButt (CVE-2017-8291) car il appelle en interne GhostScript pour traiter les images EPS. Cette vulnérabilité permet aux attaquants d'exécuter des commandes arbitraires sur le système cible.
Lorsque PIL traite une image, il détermine le type d'image en fonction de l'en-tête du fichier (octets magiques / Magic Bytes). S'il identifie un fichier EPS (en-tête commençant par %!PS), il transmet le fichier à PIL/EpsImagePlugin.py pour traitement.
Dans ce module, PIL appelle la commande GhostScript du système (gs) pour traiter le fichier image :
command = ["gs",
"-q", # quiet mode
"-g%dx%d" % size, # set output geometry (pixels)
"-r%fx%f" % res, # set input DPI (dots per inch)
"-dBATCH", # exit after processing
"-dNOPAUSE", # don't pause between pages,
"-dSAFER", # safe mode
"-sDEVICE=ppmraw", # ppm driver
"-sOutputFile=%s" % outfile, # output file
"-c", "%d %d translate" % (-bbox[0], -bbox[1]),
# adjust for image origin
"-f", infile, # input file
]
# Code to check if GhostScript is installed is omitted
try:
with open(os.devnull, 'w+b') as devnull:
subprocess.check_call(command, stdin=devnull, stdout=devnull)
im = Image.open(outfile)
Bien que l'option -dSAFER soit définie (mode sécurisé), une vulnérabilité de contournement du sandbox dans GhostScript (GhostButt CVE-2017-8291) permet de contourner ce mécanisme de sécurité, permettant l'exécution de commandes arbitraires.
À l'heure où ces lignes sont écrites, même la dernière version officielle de GhostScript, la 9.21, est toujours affectée par cette vulnérabilité. Par conséquent, tant que GhostScript est installé sur le système d'exploitation, PIL est vulnérable à l'exécution de commandes.
Références :
Exécutez la commande suivante pour démarrer une application web vulnérable à CVE-2017-8291 :
docker compose up -d
Après le démarrage, visitez http://your-ip:8000/ pour accéder à la page de téléversement.
Le fonctionnement normal de cette application permet aux utilisateurs de téléverser un fichier PNG. Le backend utilise PIL pour charger l'image et afficher ses dimensions. Cependant, nous pouvons exploiter cela en changeant l'extension d'un fichier EPS exécutable en PNG et en le téléversant. Étant donné que le backend détermine le type d'image en fonction de l'en-tête du fichier plutôt que de l'extension, le contrôle de l'extension de fichier peut être contourné.
Par exemple, nous pouvons téléverser poc.png, qui exécutera la commande touch /tmp/aaaaa sur le serveur. En modifiant la commande dans le POC pour une commande de reverse shell, nous pouvons obtenir un accès shell au serveur :
