
Verificador de exposição e laboratório seguro de VM descartável para CVE-2026-23111 (Linux nf_tables use-after-free escalada de privilégio local). Defensivo: detecção, mitigação, laboratório multi-distro. Sem exploit.
Ferramenta defensiva e um laboratório de máquina virtual reproduzível para CVE-2026-23111,
a escalada de privilégio local use-after-free do nf_tables no kernel Linux (uma
verificação invertida de atividade de elemento em nft_map_catchall_activate(), o bug
"off by !"). Um usuário local não privilegiado pode escalar para root e escapar de um
contêiner através de namespaces de usuário não privilegiados.
Este repositório não contém exploit. Ele contém um verificador de exposição somente leitura, um script para criar um usuário genuinamente não privilegiado e definições de VM para que você possa alcançar o bug com segurança e estudar a pesquisa pública. A cadeia completa de root está nas divulgações vinculadas abaixo, não aqui.
Artigo completo: https://techearl.com/cve-2026-23111-nftables-lpe
check-exposure.sh — detector somente leitura: versão do kernel vs. a compilação corrigida, presença de nf_tables, a pré-condição de userns não privilegiados e assinaturas de crash no log do kernel.setup-unprivileged-user.sh — cria um labuser sem sudo e comprova que ele não é privilegiado. O objetivo de um teste de LPE é começar a partir de um usuário que já não pode se tornar root.Vagrantfile — VMs descartáveis Debian 12 e AlmaLinux 10 (as distribuições que o Multipass não consegue iniciar).Um contêiner compartilha o kernel do host. Executar um exploit de kernel dentro de um contêiner o executa contra o kernel real do host, então um "teste" pode comprometer a máquina real. Use uma VM descartável com seu próprio kernel.
O Multipass inicia apenas Ubuntu, por isso os outros usam Vagrant.
Cada distribuição precisou de um truque diferente para inicializar um kernel genuinamente pré-correção que ainda tenha rede funcional em uma VM na nuvem:
linux-aws antigo, não linux-generic. O kernel genérico
não possui o driver de NIC ENA da AWS e perde SSH em uma instância Nitro.
sudo apt install -y linux-image-6.8.0-1028-aws (abaixo do corrigido 6.8.0-1051),
defina-o como padrão no GRUB, reinicie. Em virt local, o kernel genérico funciona.cloud (mantém ENA):
deb [check-valid-until=no trusted=yes] https://snapshot.debian.org/archive/debian/20251201T000000Z/ bookworm main,
depois apt install -y linux-image-6.1.0-39-cloud-amd64=6.1.148-1 (abaixo do corrigido 6.1.164-1, DSA-6163-1).el10_1 estão no vault 10.1.
Aponte dnf para https://vault.almalinux.org/10.1/BaseOS/x86_64/os/ e
, depois .# 1. Create a real unprivileged user and prove it cannot sudo.
# (useradd, not Debian's adduser, so it works on RHEL too.)
sudo bash setup-unprivileged-user.sh labuser
# 2. Exposure verdict.
sudo ./check-exposure.sh
# 3. As labuser, the precondition, then the public nft trigger inside a netns.
sudo -u labuser unshare -Ur id # uid=0 in a new userns = precondition open
# (denied on stock Ubuntu 24.04 = mitigation working)
# The public FuzzingLabs trigger (catchall GOTO + aborted batch). Inlined here as
# documentation; this repo does not ship an executable exploit/trigger file.
sudo -u labuser unshare -Urn bash -c '
nft add table inet t; nft add chain inet t c
nft add map inet t m "{ type ipv4_addr : verdict; }"
nft add element inet t m "{ * : goto c }"
printf "delete element inet t m { * }\ndelete element inet t m { 1.2.3.4 }\n" > /tmp/b.nft
nft -f /tmp/b.nft; nft flush ruleset'
Essa sequência executa o caminho de aborto com bug; ela não inclui uma cadeia de escalada de privilégio e, em um kernel padrão, é silenciosa (veja abaixo).
A constatação honesta sobre o gatilho: em um kernel de produção padrão, ele é silencioso.
Ele executa o caminho de aborto com bug sem crash e sem saída em dmesg, mesmo em loop
com liberação e reutilização. A saída KASAN: slab-use-after-free nos artigos vem de um
kernel KASAN/debug; a transformação do use-after-free latente em exploit precisa do heap
spray (não neste repositório). O laboratório comprova que o usuário não privilegiado alcança
o bug, mostra a restrição AppArmor padrão do Ubuntu bloqueando esse caminho e dá um veredito
claro de EXPOSTO / MITIGADO / corrigido. Ele não fornece um shell root, por design.
Restrinja namespaces de usuário não privilegiados (fecha o caminho realista para os exploits públicos) e então corrija o kernel.
# Ubuntu 23.10+ (AppArmor-based, keeps legitimate userns users working):
echo "kernel.apparmor_restrict_unprivileged_userns=1" | sudo tee /etc/sysctl.d/99-restrict-userns.conf
sudo sysctl --system
# Elsewhere (blanket disable; set both on Debian/Ubuntu):
printf 'kernel.unprivileged_userns_clone=0\nuser.max_user_namespaces=0\n' | sudo tee /etc/sysctl.d/99-restrict-userns.conf
sudo sysctl --system
# Patch (Ubuntu 24.04 generic fixed at 6.8.0-107.107):
sudo apt update && sudo apt install --only-upgrade linux-image-generic && sudo reboot
MIT. Uso defensivo e educacional.
| Distribuição | Iniciar com | Por quê |
|---|
| Ubuntu 24.04 / 22.04 | Multipass (Ubuntu only) | Exodus reproduzido em ambas; 24.04 vem com a restrição AppArmor userns ativada por padrão, então mostra a mitigação. |
| Debian 12 | Vagrant (vagrant up debian) | Exodus reproduzido nela; userns não privilegiados abertos por padrão. |
| AlmaLinux / Rocky 10.1 | Vagrant (vagrant up alma) | Corresponde ao kernel alvo 6.12.0-124.x.el10 do FuzzingLabs, então o gatilho público deles reproduz como publicado. |
dnf install kernel-6.12.0-124.38.1.el10_1grubby --set-default| Distribuição | Kernel vulnerável inicializado | userns padrão | Veredito |
|---|
| Ubuntu 24.04 | 6.8.0-1028-aws | restrito (AppArmor) | MITIGADO, não corrigido |
| Debian 12 | 6.1.0-39-cloud (6.1.148-1) | aberto | EXPOSTO |
| AlmaLinux 10.1 | 6.12.0-124.38.1.el10_1 | aberto | EXPOSTO |