
Ein Python-Tool zur Erkennung von PDF-Dateien, die CVE-2026-86950 ausnutzen
Für mehr Kontext zu diesem Projekt und CVE-2026-86950 siehe https://decalage.info/CVE-2026-86950/
Haftungsausschluss: Der größte Teil dieser Readme und des Erkennungscodes wurde mit Hilfe von KI-Coding-Agenten geschrieben. Das Tool wurde erfolgreich an Tausenden legitimer PDF-Dateien und an dem verfügbaren Proof-of-Concept getestet, der hier veröffentlicht wurde. Allerdings ist dieses Tool neu und der Erkennungsalgorithmus recht komplex, daher sollte es mit Vorsicht verwendet werden.
detect_cve_2026_86950.py durchsucht PDF-Dateien statisch nach eingebetteten Schriften,
die darauf ausgelegt sind, CVE-2026-86950 („The Great Glyph Grift") auszunutzen – einen
Out-of-Bounds-Write im Anti-Aliasing-Glyphen-Rasterizer von Apple CoreGraphics
(behoben in iOS / macOS 26.7.1).
Es rendert niemals die Schrift oder führt Exploit-Code aus – es parst die PDF-Datei und das eingebettete Schriftprogramm und sucht nach der strukturellen Signatur des Angriffs.
CoreGraphics wandelt eine Gleitkomma-Gerätekoordinate mit ungefähr folgendem Code in eine 16.12-Festkomma-Ganzzahl um:
int32_t aa_double_to_fixed(double px) { return (int32_t)(0.5 + 4096.0 * px); }
Wenn 4096 * px den Bereich von int32 überschreitet, ist die Umwandlung undefiniertes Verhalten, und zwei Aufrufstellen (aa_moveto vs. aa_lineto) sind sich uneinig — eine sättigt, eine schneidet ab. Diese Uneinigkeit verfälscht die Berechnung der Glyphen-Bounding-Box in aa_add_edges, sodass der Coverage-Puffer in aa_cache_render zu klein allokiert wird und der Rasterizer außerhalb der Grenzen schreibt. Der Patch 26.7.1 fügt explizites Clamping auf ±0x3FFFF001 hinzu.
Der öffentliche Proof-of-Concept erstellt eine bösartige TrueType-Schriftart, die eine solche überdimensionierte Koordinate erzwingt:
/Tf 1024) läuft 4096 × device_coord über int32 über./FontFile2) und CFF / OpenType (/FontFile3)./Tf, Tm) und prüft, ob 4096 × device_coord tatsächlich INT32_MAX überschreitet — d. h. ob der Festkomma-Überlauf erreichbar ist.Urteile: exploit (Überlauf erreichbar), suspicious (überdimensionierte Geometrie, aber kein Überlauf bei der beobachteten Größe), clean.
# with uv (recommended)
uv venv
uv pip install -r requirements.txt
# or any environment with pikepdf + fonttools
python3 detect_cve_2026_86950.py suspicious.pdf
python3 detect_cve_2026_86950.py -v *.pdf # per-font details
python3 detect_cve_2026_86950.py --json f.pdf # machine-readable
Exit-Code: 0 sauber, 1 Exploit/verdächtig gefunden, 2 Fehler.
aa_*-Pfad-Rasterizer von CoreGraphics, der sowohl TrueType-glyf- als auch
CFF/Type2-Konturen rendert. Der öffentliche PoC verstärkt Koordinaten mit
TrueType-Composite-Glyphen; eine CFF-Schrift kann überdimensionierte
Koordinaten direkt erreichen (z. B. durch Akkumulieren relativer Operatoren),
daher werden sowohl /FontFile2 als auch /FontFile3 analysiert. Die
Composite-Ketten-Heuristik ist TrueType-spezifisch; bei CFF ist das Signal
die Prüfung auf überdimensionierte Koordinaten / falsche Bounding-Boxen./Tf, Tm) in Content-Streams erfolgt nach
bestem Bemühen; er wertet den PDF-Grafikzustand / CTM nicht vollständig aus.
Wenn keine Größe gefunden wird, wird für die Überlaufprüfung ein
konservativer Standardwert von 1024 angenommen. Die schriftintrinsischen
Signale für überdimensionierte Geometrie hängen nicht davon ab.