
Un outil Python pour détecter les fichiers PDF exploitant CVE-2026-86950
Pour plus de contexte sur ce projet et la CVE-2026-86950, voir https://decalage.info/CVE-2026-86950/
Avertissement : la majeure partie de ce readme et du code de détection ont été écrits avec l'aide d'agents de codage IA. L'outil a été testé avec succès sur des milliers de fichiers PDF légitimes et sur la preuve de concept publiée ici. Cependant, cet outil est récent et l'algorithme de détection est plutôt complexe, utilisez-le donc avec prudence.
detect_cve_2026_86950.py analyse statiquement les fichiers PDF à la recherche de polices embarquées
conçues pour exploiter la CVE-2026-86950 (« The Great Glyph Grift »), une
écriture hors limites dans le rasteriseur de glyphes anticrénelés d'Apple CoreGraphics
(corrigée dans iOS / macOS 26.7.1).
Il ne rend jamais la police ni n'exécute de code d'exploit — il analyse le PDF et le programme de police embarqué et recherche la signature structurelle de l'attaque.
CoreGraphics convertit une coordonnée d'appareil en virgule flottante en un entier en virgule fixe 16.12 avec approximativement :
int32_t aa_double_to_fixed(double px) { return (int32_t)(0.5 + 4096.0 * px); }
Lorsque 4096 * px dépasse la plage de int32, la conversion est un comportement indéfini,
et deux sites d'appel (aa_moveto vs. aa_lineto) divergent — l'un sature, l'autre
tronque. Cette divergence corrompt le calcul de la boîte englobante du glyphe dans
aa_add_edges, de sorte que le tampon de couverture dans aa_cache_render est alloué trop
petit et le rasteriseur écrit hors limites. Le correctif 26.7.1 ajoute un
écrêtage explicite à ±0x3FFFF001.
La preuve de concept publique construit une police TrueType malveillante qui force une coordonnée surdimensionnée de ce type :
/Tf 1024), 4096 × device_coord déborde de int32./FontFile2) et CFF / OpenType (/FontFile3)./Tf, Tm) et vérifie si 4096 × device_coord
dépasse réellement INT32_MAX — c'est-à-dire si le débordement en virgule fixe est
atteignable.Verdicts : exploit (débordement atteignable), suspicious (géométrie surdimensionnée mais sans débordement à la taille observé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
Code de sortie : 0 propre, 1 exploit/suspect trouvé, 2 erreur.
aa_* de CoreGraphics, qui rend à la fois les contours TrueType glyf et CFF/Type2. Le PoC public amplifie les coordonnées avec des glyphes composites TrueType ; une police CFF peut atteindre directement des coordonnées surdimensionnées (par exemple en accumulant des opérateurs relatifs), c'est pourquoi /FontFile2 et /FontFile3 sont tous deux analysés. L'heuristique de chaîne composite est spécifique à TrueType ; pour CFF, le signal est la vérification des coordonnées surdimensionnées / du mensonge de boîte englobante./Tf, Tm) des flux de contenu est effectuée au mieux ; elle n'évalue pas complètement l'état graphique PDF / CTM. Lorsqu'aucune taille n'est trouvée, une valeur par défaut conservatrice de 1024 est supposée pour la vérification de débordement. Les signaux de géométrie surdimensionnée intrinsèques à la police n'en dépendent pas.