
Python PIL (Pillow) ist eine beliebte Bildverarbeitungsbibliothek für Python. Sie unterstützt verschiedene Bildformate und bietet leistungsstarke Funktionen zur Bildbearbeitung.
Das Python-Bildverarbeitungsmodul PIL (Pillow) ist von der GhostButt-Sicherheitslücke (CVE-2017-8291) betroffen, da es intern GhostScript zur Verarbeitung von EPS-Bildern aufruft. Diese Sicherheitslücke ermöglicht es Angreifern, beliebige Befehle auf dem Zielsystem auszuführen.
Wenn PIL ein Bild verarbeitet, bestimmt es den Bildtyp anhand des Dateikopfs (Magic Bytes). Wenn es eine EPS-Datei erkennt (der Dateikopf beginnt mit %!PS), übergibt es die Datei an PIL/EpsImagePlugin.py zur Verarbeitung.
In diesem Modul ruft PIL den GhostScript-Befehl des Systems (gs) auf, um die Bilddatei zu verarbeiten:
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)
Obwohl das -dSAFER-Flag gesetzt ist (Sicherheitsmodus), ermöglicht eine Sandbox-Bypass-Sicherheitslücke in GhostScript (GhostButt CVE-2017-8291) die Umgehung dieses Sicherheitsmechanismus, wodurch beliebige Befehle ausgeführt werden können.
Zum Zeitpunkt der Erstellung dieses Artikels ist selbst die neueste offizielle GhostScript-Version 9.21 noch von dieser Sicherheitslücke betroffen. Solange GhostScript also auf dem Betriebssystem installiert ist, ist PIL anfällig für die Befehlsausführung.
Referenzen:
Führen Sie den folgenden Befehl aus, um eine Webanwendung zu starten, die anfällig für die Sicherheitslücke CVE-2017-8291 ist:
docker compose up -d
Nach dem Start rufen Sie http://your-ip:8000/ auf, um die Upload-Seite zu erreichen.
Die normale Funktionalität dieser Anwendung erlaubt es Benutzern, eine PNG-Datei hochzuladen. Das Backend verwendet PIL, um das Bild zu laden und seine Abmessungen auszugeben. Wir können dies jedoch ausnutzen, indem wir die Erweiterung einer ausführbaren EPS-Datei in PNG ändern und sie hochladen. Da das Backend den Bildtyp anhand des Dateikopfs und nicht anhand der Erweiterung bestimmt, kann die Prüfung der Dateierweiterung umgangen werden.
So können wir beispielsweise poc.png hochladen, die auf dem Server den Befehl touch /tmp/aaaaa ausführt. Indem wir den Befehl im POC in einen Reverse-Shell-Befehl ändern, erhalten wir Shell-Zugriff auf den Server:
