
Uma ferramenta em Python para detectar arquivos PDF que exploram a CVE-2026-86950
Para mais contexto sobre este projeto e a CVE-2026-86950, consulte https://decalage.info/CVE-2026-86950/
Aviso legal: a maior parte deste readme e do código de detecção foi escrita com a ajuda de agentes de codificação de IA. A ferramenta foi testada com sucesso em milhares de arquivos PDF legítimos e na prova de conceito disponível publicada aqui. No entanto, esta ferramenta é nova e o algoritmo de detecção é bastante complexo, portanto use-a com cautela.
detect_cve_2026_86950.py examina estaticamente arquivos PDF em busca de fontes incorporadas
criadas para explorar a CVE-2026-86950 ("The Great Glyph Grift"), uma
gravação fora dos limites (out-of-bounds write) no rasterizador de glifos com anti-aliasing do Apple CoreGraphics
(corrigida no iOS / macOS 26.7.1).
Ele nunca renderiza a fonte nem executa qualquer código de exploit — ele analisa o PDF e o programa de fonte incorporado e procura a assinatura estrutural do ataque.
O CoreGraphics converte uma coordenada de dispositivo em ponto flutuante em um inteiro de ponto fixo 16.12 com aproximadamente:
int32_t aa_double_to_fixed(double px) { return (int32_t)(0.5 + 4096.0 * px); }
Quando 4096 * px excede o intervalo de int32, a conversão é comportamento indefinido,
e dois locais de chamada (aa_moveto vs. aa_lineto) divergem — um satura, o outro
trunca. Essa divergência corrompe o cálculo da caixa delimitadora do glifo em
aa_add_edges, de modo que o buffer de cobertura em aa_cache_render é alocado com
tamanho insuficiente e o rasterizador escreve fora dos limites. O patch 26.7.1 adiciona
clamping explícito para ±0x3FFFF001.
A prova de conceito pública constrói uma fonte TrueType maliciosa que força uma coordenada superdimensionada desse tipo:
/Tf 1024), 4096 × device_coord estoura int32./FontFile2) e CFF / OpenType (/FontFile3)./Tf, Tm) e verifica se 4096 × device_coord
realmente excede INT32_MAX — ou seja, se o estouro de ponto fixo é
alcançável.Veredictos: exploit (estouro alcançável), suspicious (geometria superdimensionada mas sem estouro no tamanho 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 saída: 0 limpo, 1 exploit/suspeito encontrado, 2 erro.
aa_* do CoreGraphics, que renderiza tanto contornos TrueType glyf quanto CFF/Type2. O PoC público amplifica coordenadas com glifos compostos TrueType; uma fonte CFF pode atingir coordenadas superdimensionadas diretamente (por exemplo, acumulando operadores relativos), portanto tanto /FontFile2 quanto /FontFile3 são analisados. A heurística de cadeia composta é específica de TrueType; para CFF, o sinal é a verificação de coordenada superdimensionada / bounding-box mentirosa./Tf, Tm) dos fluxos de conteúdo é de melhor esforço; ela não avalia completamente o estado gráfico do PDF / CTM. Quando nenhum tamanho é encontrado, um padrão conservador de 1024 é assumido para a verificação de overflow. Os sinais de geometria superdimensionada intrínsecos à fonte não dependem disso.