Betroffen sind die Pillow-Versionen 2.6.0 bis 12.3.0. Der Pfad zu Ghostscript öffnet sich nur auf Systemen, auf denen das Programm gs installiert ist — ohne das kann Pillow EPS ohnehin nicht öffnen. Die Maintainer stufen die Lücke als moderat ein, weil der Angreifer den Dateinamen kontrollieren muss. Der von GitHub vergebene CVE-Eintrag bewertet sie mit 9,2 von 10 und nennt dieselbe Voraussetzung.
„Die Schwachstelle wird durch den Dateinamen ausgelöst, nicht durch irgendetwas im PostScript-Dokument", heißt es im Sicherheitshinweis. Eine harmlose EPS-Datei kann also Schaden anrichten, sobald ein Angreifer ihren Namen bestimmt. Realistisches Ziel sind damit Upload-Endpunkte, die den gespeicherten Dateinamen aus Nutzereingaben übernehmen oder zusammensetzen.
Pillow steckt praktisch überall, wo Python mit Bildern umgeht: in Upload-Formularen, Avatar- und Thumbnail-Werkzeugen, Dokument- und PDF-Pipelines, und die meisten Machine-Learning-Projekte ziehen die Bibliothek als Abhängigkeit mit. OX Security, dessen Bericht auf die Schwachstellen aufmerksam machte, schätzt die Zahl der Downloads auf rund 436 Millionen pro Monat.
Version 13.0.0 ist ein umfangreiches Sicherheitsrelease mit Korrekturen über vier Schweregrade hinweg, von niedrig bis kritisch; zwei davon stufen die Maintainer als kritisch ein. Für keine der Lücken ist eine Ausnutzung bekannt.
Zu den beiden kritischen Einträgen zählt zum einen ein Speicherfehler, den die Release Notes als Wiederverwendung veralteter Bilddaten nach einem Moduswechsel beschreiben. Zum anderen geht es um zwei Überlauffehler in Pillows JPEG-Dekodierung.
Einer dieser JPEG-Fehler betrifft das FlashPix-Format (FPX). Hier ließ sich zeigen, dass ein einziger Aufruf von Image.open() auf eine präparierte Datei einen Angreiferbefehl ausführt — vorausgesetzt, das optionale Paket olefile ist installiert. Pillow erkennt solche Dateien am Inhalt, nicht an der Dateiendung; ein Server, der nicht vertrauenswürdige Uploads öffnet, kann also ohne jedes Zutun eines Nutzers getroffen werden.
Der zweite Fehler, CVE-2026-112403, überschreibt einen Speicherpuffer, wenn ein Programm ein Thumbnail eines präparierten verlustfreien JPEG erzeugt. Der zugehörige Sicherheitshinweis nennt einen Absturz, keine Codeausführung. Gefunden wurde der Bug laut Advisory „von Anthropic mit Hilfe von Claude im Rahmen der Untersuchung der Sicherheit quelloffener Software, manuell validiert von Ada Logics" — Teil einer größeren Initiative des Unternehmens, die bereits Hunderte Fehler in Open-Source-Bibliotheken zutage gefördert hat.
Eine dritte Lücke, CVE-2026-112393, steckt seit 2013 in Pillow. Sie führt zu einem Pufferüberlauf, wenn ein Programm ein komprimiertes TIFF-Bild in den Speicher statt in eine Datei auf der Platte schreibt — das übliche Muster für Dienste, die einen Upload neu kodieren und zurückgeben. Dem Sicherheitshinweis zufolge brachten die Melder damit den Prozess zum Absturz; zu Codeausführung kam es erst mit Hilfe einer zweiten, separaten Schwachstelle, die Speicheradressen preisgab. Das Speichern in eine echte Datei auf der Festplatte ist nicht betroffen.
Die von GitHub vergebenen CVE-Einträge bewerten die EPS-, TIFF- und JPEG-Thumbnail-Lücke jeweils mit 9,2 von 10 und damit als kritisch. Jede hängt allerdings an Bedingungen, die der Score nicht abbildet; die Einstufungen der Maintainer reichen für diesen Schwung von moderat bis kritisch. In den CVE-Einträgen vermerken die Analysten der CISA für die EPS-Lücke keine bekannte Ausnutzung und für die TIFF-Lücke einen öffentlichen Proof of Concept.
Empfohlen wird das Update auf Pillow 13.0.0, das alle genannten Fehler behebt, samt Neubau aller Container, Wheels und Basis-Images, die eine ältere Kopie mitbringen. Pillow 13 unterstützt Python 3.10 nicht mehr — Installationen auf 3.10 brauchen zusätzlich Python 3.11 oder neuer.
Bis zum Update verweisen Pillows Sicherheitsdokumentation und die Advisories auf Maßnahmen, die die einzelnen Angriffswege abschneiden:
- EPS/Ghostscript: das Programm gs von allen Hosts fernhalten, die nicht vertrauenswürdige Uploads verarbeiten, und niemals einen vom Angreifer kontrollierten Dateinamen an Image.open() für EPS übergeben.
- JPEG-Thumbnails: draft() und thumbnail() bei nicht vertrauenswürdigen JPEGs meiden, alternativ zuerst load() aufrufen oder reducing_gap=None übergeben.
- TIFF: das Speichern eines TIFF in einen Speicherpuffer wie io.BytesIO als sensiblen Pfad behandeln, wenn das Bild von einem Nutzer stammt.
