
Analisa a CVE-2026-31431, uma vulnerabilidade AF_ALG AEAD do kernel Linux, fornecendo um detector seguro, exploit LPE em laboratório e laboratório de kernel A/B baseado em QEMU para verificação.
algif_aead do Linux Kernel: AnálisePesquisa de segurança sobre CVE-2026-31431 (CVSS 3.1 7.8 ALTA,
AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H): três falhas de design
combináveis na cadeia AF_ALG AEAD resultam em uma gravação determinística
e livre de corrida de 4 bytes no cache de páginas em qualquer deslocamento de qualquer arquivo legível — a cópia em disco permanece limpa, então as somas de verificação no disco não veem nada.
O exploit público ("Copy Fail", Theori/Xint) o transforma em
root local (LPE) com 732 bytes de Python; o bug permaneceu em todos os kernels
de 2017 a 2026.
72548b093ee3 (2017) fez _aead_recvmsg descriptografar in-place,
encadeando as páginas de tag da solicitação no SGL de destino gravável.splice(arquivo → pipe → socket) alimenta esses slots de tag com as
páginas do cache de páginas de qualquer arquivo legível (cópia zero).authencesn grava seu scratch ESN de 4 bytes — o valor viaja em
do payload de sendmsg — exatamente em
, ou seja, o primeiro byte de tag: o deslocamento
de arquivo escolhido. Ele dispara da verificação de tag, então até
uma solicitação realiza a gravação.AAD[4..8)dst[assoclen + cryptlen]-EBADMSG| Afirmação | Evidência |
|---|---|
| Causa raiz derivada dos commits de correção e fontes do kernel, não de blogs | finding-sheet |
| Decodificação do PoC público verificada de ponta a ponta contra a sequência de syscalls | finding-sheet |
| Kernels A/B de laboratório com delta = exatamente o commit de correção, ambos inicializam | lab/scripts/build.sh + lab/out/ab-diffstat.txt |
Kernel vulnerável executa descriptografia AEAD authencesn via AF_ALG (smoke) | lab/scripts/run.sh vuln → SMOKE=ok |
Reversão sem acompanhante causa pânico em crypto_authenc_esn_decrypt (descoberta original) | lab/scripts/run.sh patched → NULL deref, reproduzível |
| Detector seguro: VULNERÁVEL em vuln (gravação dispara apesar de EBADMSG, disco permanece LIMPO), NÃO-DETECTADO na correção completa | poc/detector.c no laboratório → linhas DETECTOR-RESULT |
| Fechamento de LPE em laboratório: uid 1000 corrige 4 bytes do cache de páginas de um binário SUID e lê o flag somente-root; cópia em disco comprovadamente íntegra via leitura debugfs em nível de bloco | poc/lpe.c + lab/rootfs/tools/secretgate.c → LPE-RESULT: ROOT-FLAG-CAPTURED, DISKCLEAN=ok |
| Reproduzir a gravação pública no cache de páginas em um laboratório fixo, com atribuição | saída do detector acima + lab README |
| Estresse SGL: 5 formas em ambos os kernels — sem crash, sem travamento do kernel (negativo honesto) + duas peculiaridades documentadas do contrato AF_ALG | poc/sgl-stress.c no laboratório → linhas SGL-STRESS |
# construir os três kernels + ferramentas + disco de sondagem no Docker (~15 min na primeira execução)
lab/scripts/build.sh
# inicializar o oráculo A/B/C (QEMU no Docker, KVM se disponível)
lab/scripts/run.sh vuln # DETECTOR VULNERÁVEL + LPE ROOT-FLAG-CAPTURED + DISKCLEAN=ok
lab/scripts/run.sh patchedfull # DETECTOR NÃO-DETECTADO + LPE NÃO-VULNERÁVEL
lab/scripts/run.sh patched # NULL deref de authencesn (lacuna da correção acompanhante)
A cadeia completa de gravação no cache de páginas segue a abordagem publicada de
Theori / Xint Code ("Copy Fail", os repórteres creditados) com
atribuição — veja a seção de arte anterior do finding-sheet. Trabalho original neste repositório: o mapa de mecânica ancorado no commit de correção,
a descoberta da série de correção incompleta (o pânico de authencesn por reversão sem acompanhante e sua janela de versão estável), o
detector diferencial seguro de cache-de-páginas-vs-disco que nunca toca em arquivos que não
possuímos, o fechamento de LPE em laboratório contra um alvo SUID construído para esse fim
(secretgate — nenhum binário do mundo real é jamais alvo), a exploração
de borda SGL (resultado negativo honesto mais duas peculiaridades documentadas do
contrato AF_ALG) e a atribuição verificada de ramificação de todos os oito commits
de correção.
| Doc | O que é |
|---|---|
| docs/finding-sheet.md | Ficha técnica de uma página: versões, CVSS, causa raiz, commits de correção, superfície de ataque |
| docs/report-ptes.md | Relatório estruturado em PTES (7 fases) com evidências de laboratório |
| docs/research-writeup.md | A narrativa da investigação — metodologia, becos sem saída, lições portáveis, comparação com trabalho anterior |
docs/ ficha técnica · relatório PTES · writeup de pesquisa
poc/ detector.c (oráculo seguro) · lpe.c (LPE em laboratório) · sgl-stress.c (exploração SGL)
lab/ laboratório de kernel QEMU: 5.15.203 ± correção (A/B) + pós-acompanhante 5.15.y (C)
lab/rootfs/ secretgate.c — alvo SUID construído para esse fim (a única coisa jamais atacada)
72548b093ee3 "crypto: algif_aead - copy AAD from src to dst" (2017)a664bf3d603d "crypto: algif_aead - Revert to operating out-of-place"
(+ 8 backports estáveis — veja finding-sheet)Artefato de pesquisa educacional. Execute apenas contra sistemas que você possui ou para os quais está explicitamente autorizado a testar. A vulnerabilidade está corrigida — execute um kernel atualizado das ramificações estáveis de 2026 ou posteriores.