
Prova de conceito funcional de exploit para CVE-2026-31431, uma escalada local de privilégios no kernel Linux por meio de corrupção do cache de páginas do AEAD AF_ALG, concedendo shell de root.
2026-04-29 — Estou publicando este exploit um dia após compartilhá-lo no fórum MyDigitalLife. Ele não requer Python; foi escrito em C e compilado para o menor tamanho possível usando:
musl-gcc -static -Os -o exploit exploit.c -sAmeaça crítica. O binário do exploit é compilado sem dependências e pode ser usado para testar vulnerabilidades em qualquer sistema Linux
CVE-2026-31431 é uma vulnerabilidade confirmada pela NIST no kernel Linux que permite que um usuário local sem privilégios obtenha um shell
rootem segundos. Diante do exploit de circulação pública para CVE-2026-31431, desenvolvi uma prova de conceito (PoC) binária para avaliar a exposição da nossa infraestrutura interna. Embora alguns ambientes restrinjam o uso de su, esta vulnerabilidade é particularmente crítica para servidores compartilhados porque ataca o gerenciamento de memória subjacente do kernel. Consequentemente, qualquer binário SETUID — incluindo sudo, passwd, mount ou newgrp — pode ser aproveitado para acionar o exploit e conceder um shell root. Ação administrativa para corrigir o kernel é necessária imediatamente, pois as restrições padrão de espaço do usuário são insuficientes para mitigar esta ameaça. Qualquer sistema Linux executando um kernel sem patch está em risco.
Meu Próprio Exploit Funcional · Kernel Linux · Interface criptográfica AF_ALG (AEAD)
Substitui /usr/bin/su no cache de páginas do kernel sem tocar no arquivo em disco
Acesso local ao shell é suficiente — nenhum privilégio adicional é necessário
Afeta distribuições Linux sem patch

CVE-2026-31431 é um bug no tratamento de operações de I/O scatter-gather e referências ao cache de páginas no subsistema criptográfico do kernel Linux — especificamente na implementação do socket AF_ALG para algoritmos AEAD (crypto/af_alg.c, crypto/aead.c).
| Propriedade | Valor |
|---|---|
| Identificador | CVE-2026-31431 |
| Referência | NIST NVD |
| Tipo | Escalação de Privilégios Local (LPE) |
| Componente | Kernel Linux — AF_ALG / AEAD (authencesn) |
| Acesso necessário | Usuário local sem privilégios |
| Impacto | Shell root interativo |
| Status do exploit | PoC funcional publicamente disponível no GitHub |
| Persistência | Nenhuma — a modificação existe apenas na RAM; reiniciar restaura o estado original |
O kernel Linux expõe uma interface criptográfica ao espaço do usuário através de sockets AF_ALG. A vulnerabilidade reside no fato de que, durante uma operação de descriptografia AEAD, o kernel mapeia incorretamente a saída da descriptografia diretamente nas páginas do cache de páginas do arquivo de origem — em vez de um buffer temporário. Um atacante pode, assim, sobrescrever o conteúdo em memória de qualquer arquivo sem modificá-lo em disco, sem privilégios root e sem deixar nenhum rastro visível no sistema de arquivos.
| Sistema | Status |
|---|---|
| Ubuntu 24.04 (bare metal / VM) | ⚠️ Vulnerável em kernel sem patch |
| Debian, Fedora, Arch em kernel sem patch | ⚠️ Vulnerável |
Distribuições com CONFIG_SECURITY_LOCKDOWN_LSM | ✅ Provavelmente protegido |
Sistemas com nosuid ou ProtectSUID (systemd) | ✅ Protegido |
Sistemas com AppArmor/SELinux bloqueando AF_ALG | ✅ Protegido |
| macOS, Windows (nativo) | ✅ Não afetado |
O exploit consiste em dois componentes: um script auxiliar em /tmp/x e um loop de corrupção baseado em AF_ALG. A seguir, uma descrição exata baseada na análise do código-fonte:
1. Configuração do script auxiliar
O exploit cria /tmp/x com o seguinte conteúdo:
#!/bin/sh
export TERM=xterm-256color
exec /bin/sh
Ele define permissões para 0755. O motivo: /usr/bin/su remove variáveis de ambiente (incluindo TERM) ao ser iniciado. O script auxiliar as restaura antes de iniciar o shell real, garantindo um terminal funcional.
2. Construção do payload ELF
Um binário ELF x86_64 mínimo de 158 bytes contendo shellcode bruto é construído em memória. A string /bin/sh no offset 150 é então corrigida para /tmp/x\0 via memcmp/memcpy. Consulte Payload ELF para detalhes.
3. Abrindo /usr/bin/su somente leitura
int su_fd = open("/usr/bin/su", O_RDONLY);
O arquivo é aberto somente leitura — o exploit não requer nenhuma permissão de escrita.
4. Loop de corrupção — 39 iterações de 4 bytes cada
O payload (158 bytes) é processado em blocos de 4 bytes (39 blocos completos). Cada bloco é passado por corrupt_binary_chunk(), que executa:
AF_ALG (SOCK_SEQPACKET)authencesn(hmac(sha256),cbc(aes)) — um algoritmo AEAD compostoop_sock)sendmsg com um buffer de 8 bytes (4× 'A' + 4 bytes do payload) e três CMSGs: ALG_OP_DECRYPT, IV (20 bytes), assoclen=8splice: su_fd → pipe → op_sock (zero-copy através do kernel)recv() — é aqui que o kernel erroneamente sobrescreve o cache de páginas5. Execução
execve("/usr/bin/su", args, NULL);
O kernel carrega /usr/bin/su através do cache de páginas — que agora está envenenado. O bit SUID (chmod u+s) está intacto, então o kernel executa o arquivo como root. O shellcode executa setuid(0) → execve("/tmp/x") → shell root interativo.