
Una herramienta en Python para detectar archivos PDF que explotan CVE-2026-86950
Para más contexto sobre este proyecto y CVE-2026-86950, consulte https://decalage.info/CVE-2026-86950/
Aviso legal: la mayor parte de este readme y del código de detección se han escrito con la ayuda de agentes de programación con IA. La herramienta se ha probado con éxito en miles de archivos PDF legítimos y en la prueba de concepto disponible publicada aquí. Sin embargo, esta herramienta es nueva y el algoritmo de detección es bastante complejo, así que úsela con precaución.
detect_cve_2026_86950.py analiza estáticamente archivos PDF en busca de fuentes incrustadas
manipuladas para explotar CVE-2026-86950 ("The Great Glyph Grift"), una
escritura fuera de límites en el rasterizador de glifos con antialiasing de Apple CoreGraphics
(corregido en iOS / macOS 26.7.1).
Nunca renderiza la fuente ni ejecuta código de exploit alguno: analiza el PDF y el programa de fuente incrustado y busca la firma estructural del ataque.
CoreGraphics convierte una coordenada de dispositivo en coma flotante en un entero de coma fija 16.12 aproximadamente con:
int32_t aa_double_to_fixed(double px) { return (int32_t)(0.5 + 4096.0 * px); }
Cuando 4096 * px excede el rango de int32, la conversión es un comportamiento indefinido,
y dos sitios de llamada (aa_moveto vs. aa_lineto) no coinciden — uno satura, otro
trunca. Esa discrepancia corrompe el cálculo del cuadro delimitador del glifo en
aa_add_edges, por lo que el búfer de cobertura en aa_cache_render se asigna demasiado
pequeño y el rasterizador escribe fuera de los límites. El parche 26.7.1 añade un
recorte explícito a ±0x3FFFF001.
La prueba de concepto pública construye una fuente TrueType maliciosa que fuerza tal coordenada sobredimensionada:
/Tf 1024), 4096 × device_coord desborda int32./FontFile2) y CFF / OpenType (/FontFile3)./Tf, Tm) y comprueba si 4096 × device_coord
realmente excede INT32_MAX — es decir, si el desbordamiento de punto fijo es
alcanzable.Veredictos: exploit (desbordamiento alcanzable), suspicious (geometría sobredimensionada pero sin desbordamiento en el tamaño observado), 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
Código de salida: 0 limpio, 1 exploit/sospechoso encontrado, 2 error.
aa_* de CoreGraphics, que renderiza tanto contornos TrueType glyf como CFF/Type2. El PoC público amplifica las coordenadas con glifos compuestos TrueType; una fuente CFF puede alcanzar coordenadas sobredimensionadas directamente (por ejemplo, acumulando operadores relativos), por lo que se analizan tanto /FontFile2 como /FontFile3. La heurística de cadenas compuestas es específica de TrueType; para CFF la señal es la comprobación de coordenadas sobredimensionadas / mentira en el bounding-box./Tf, Tm) de los flujos de contenido es de mejor esfuerzo; no evalúa completamente el estado gráfico del PDF / CTM. Cuando no se encuentra ningún tamaño, se asume un valor predeterminado conservador de 1024 para la comprobación de desbordamiento. Las señales de geometría sobredimensionada intrínsecas a la fuente no dependen de esto.