
Uno strumento Python per rilevare file PDF che sfruttano CVE-2026-86950
Per maggiori contesto su questo progetto e sulla CVE-2026-86950, consulta https://decalage.info/CVE-2026-86950/
Disclaimer: la maggior parte di questo readme e del codice di rilevamento è stata scritta con l'aiuto di agenti di programmazione AI. Lo strumento è stato testato con successo su migliaia di file PDF legittimi e sul proof-of-concept disponibile pubblicato qui. Tuttavia, questo strumento è nuovo e l'algoritmo di rilevamento è piuttosto complesso, quindi usalo con cautela.
detect_cve_2026_86950.py analizza staticamente i file PDF alla ricerca di font incorporati
costruiti per sfruttare la CVE-2026-86950 ("The Great Glyph Grift"), una
scrittura fuori dai limiti nel rasterizzatore di glifi con anti-aliasing di Apple CoreGraphics
(corretta in iOS / macOS 26.7.1).
Non esegue mai il rendering del font né esegue codice di exploit — analizza il PDF e il programma del font incorporato e cerca la firma strutturale dell'attacco.
CoreGraphics converte una coordinata di dispositivo in virgola mobile in un intero fixed-point 16.12 con all'incirca:
int32_t aa_double_to_fixed(double px) { return (int32_t)(0.5 + 4096.0 * px); }
Quando 4096 * px supera l'intervallo di int32, il cast è un comportamento indefinito,
e due punti di chiamata (aa_moveto vs. aa_lineto) non concordano — uno satura, l'altro
tronca. Questa discordanza corrompe il calcolo del bounding-box del glifo in
aa_add_edges, così il buffer di copertura in aa_cache_render viene allocato troppo
piccolo e il rasterizzatore scrive fuori dai limiti. La patch 26.7.1 aggiunge un
clamping esplicito a ±0x3FFFF001.
Il proof-of-concept pubblico costruisce un font TrueType malevolo che forza una coordinata sovradimensionata di questo tipo:
/Tf 1024), 4096 × device_coord va in overflow su int32./FontFile2) e CFF / OpenType (/FontFile3)./Tf, Tm) e verifica se 4096 × device_coord
supera effettivamente INT32_MAX — cioè se l'overflow in virgola fissa è
raggiungibile.Verdetti: exploit (overflow raggiungibile), suspicious (geometria sovradimensionata ma senza overflow alla dimensione osservata), 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
Codice di uscita: 0 pulito, 1 exploit/sospetto trovato, 2 errore.
aa_* di CoreGraphics, che renderizza sia i contorni TrueType glyf sia quelli CFF/Type2. Il PoC pubblico amplifica le coordinate con glifi compositi TrueType; un font CFF può raggiungere coordinate sovradimensionate direttamente (ad esempio accumulando operatori relativi), quindi vengono analizzati sia /FontFile2 sia /FontFile3. L'euristica della catena composita è specifica per TrueType; per CFF il segnale è il controllo delle coordinate sovradimensionate / della falsificazione del bounding-box./Tf, Tm) dei content stream è di tipo best-effort; non valuta completamente lo stato grafico PDF / la CTM. Quando non viene trovata alcuna dimensione, per il controllo di overflow viene assunto un valore predefinito conservativo di 1024. I segnali di geometria sovradimensionata intrinseci al font non dipendono da questo.