
Ein Proof-of-Concept für CVE-2025-64512 unter Verwendung einer Polyglot-Datei.
In den letzten Wochen (im November 2025) wurde eine interessante Schwachstelle (CVE-2025-64512) in pdfminer.six offengelegt, einem beliebten Python-Projekt zur Verarbeitung von PDF-Dateien, das insbesondere in KI-Pipelines eingesetzt wird. Die Schwachstelle ermöglicht die Remote-Code-Ausführung durch Deserialisierung nicht vertrauenswürdiger Daten mittels pickle.loads(), wobei eine PDF-Datei als Angriffsvektor dient. So weit, so gut: Es ist eine wichtige Schwachstelle in einem beliebten Python-Paket. Was meine Aufmerksamkeit erregt hat, war die Ausnutzbarkeit 👀.
Auf Linux-ähnlichen Systemen können nur Dateien im Dateisystem aufgelöst werden. Ein Angreifer müsste die bösartige PDF-Datei zur Verarbeitung bereitstellen und die bösartige Pickle-Datei müsste sich an einem Ort im Zielsystem befinden, den der Angreifer bereits kennt, da er in der PDF selbst festgelegt werden muss. In vielen Fällen wird dies schwierig auszunutzen sein, denn selbst wenn der Angreifer sowohl die PDF- als auch die Pickle-Datei bereitstellt, gibt es keine Möglichkeit, im Voraus den vollständigen Pfad zur Pickle-Datei zu kennen. [...] Insgesamt besteht auf einem Linux- oder Linux-ähnlichen System im Allgemeinen ein geringeres Risiko.
Um diese Schwachstelle auf einem Linux-ähnlichen System auszunutzen, muss der Angreifer anscheinend:
Können wir eine gültige PDF-Datei erstellen, die die Schwachstelle auslöst, ohne den Dateipfad der bösartigen Pickle-Datei zu kennen?
"Gültig" bedeutet, dass pdfminer.six die Datei nicht ablehnt und mit der Verarbeitung beginnt (denn eine PDF-Datei ist das, was ein PDF-Reader öffnet).
Die Antwort lautet Ja, indem ein Polyglot-Payload (sozusagen) erstellt wird. Die Idee ist, eine Datei zu erstellen, die sowohl eine gültige pickle.gz als auch eine gültige PDF-Datei ist, sodass pdf2txt.py mit der Verarbeitung einer PDF-Datei beginnen und dann darauf verweisen kann, um den Pickle-Code im GZIP-Format zu laden.
Oft - aber nicht immer 🥲 - ist eine Datei eine PDF-Datei, wenn sie %PDF- irgendwo enthält, in der Regel in den ersten 1024 Bytes (1 - 2). Für pdfminer.six muss eine gültige PDF-Datei lediglich ein /Root-Objekt enthalten (pdfdocument.py#L752). Eine GZIP-Datei hat spezifische Anfangsbytes (RFC 1952 - Sec. 2.3.1), aber sie unterstützt Kommentare (FCOMMENT, RFC 1952 - Sec. 2.3.1).
Das ist also das Design der Polyglot-Datei: Erstellen Sie eine gültige GZIP-Datei, die den bösartigen Pickle-Payload enthält, und betten Sie eine gültige PDF-Datei in das GZIP-FCOMMENT-Flag ein. Verwenden Sie diese Datei dann als gültige PDF mit pdf2txt.py, um die Schwachstelle auszulösen, und verwenden Sie dieselbe Datei, um den bösartigen Pickle auszuführen.
(2025.12.12) EDIT:
Die einzige Einschränkung, die wir haben, ist der Dateiname: Er muss auf .pickle.gz enden (dies ist im Code von .pdfminer.six festgelegt, cmapdb.py#L235)
Die beiden Einschränkungen, die wir haben, sind:
pdfminer.six festgelegt, cmapdb.py#L235);Ich bin ein wenig überrascht, dass diese CVE so unterschätzt wird, angesichts der Beliebtheit dieses Projekts (6.000 ⭐️ auf GitHub, aber laut GitHub-Statistiken von 34.000 Projekten verwendet) und der Anwendungsfälle (Kommandozeilen-Tools, KI-Workflows, Pipelines, kurz gesagt, all die Arten von Infrastruktur, die man nicht aktualisieren möchte, wenn sie gut funktionieren).
Zum Beispiel ist das Microsoft-Tool markitdown 0.1.3 (microsoft/markitdown, 84.000 ⭐️ auf GitHub und von 2.000 Projekten verwendet), das vor dem 1. Dezember installiert wurde, anfällig für beliebige Codeausführung über pdfminer.six. Das Microsoft-Team hat am 1. Dezember einen Patch veröffentlicht, 0.1.4, aber keine Sicherheitswarnungen, daher glaube ich nicht, dass das Update von anderen Entwicklungsteams priorisiert wurde.
Andere Projekte könnten von CVE-2025-64512 betroffen sein, und es ist ziemlich einfach auszunutzen.
Eine (unvollständige) Liste anfälliger Projekte:
docker build -t cve-2025-64512-poc .
docker run --rm -it cve-2025-64512-poc
pdf2txt.py payload.pickle.gz
docker build -t cve-2025-64512-poc .
docker run --rm -it cve-2025-64512-poc
markitdown markitdown-payload.pickle.gz -x pdf -o output.md
