
Vérificateur d'exposition et laboratoire VM jetable sécurisé pour CVE-2026-23111 (escalade de privilèges locale use-after-free dans nf_tables Linux). Défensif : détection, mitigation, laboratoire multi-distributions. Pas d'exploit.
Outils défensifs et un laboratoire reproductible de machine virtuelle pour CVE-2026-23111,
l'escalade de privilèges locale use-after-free de nf_tables dans le noyau Linux (une
vérification inversée d'activité d'élément dans nft_map_catchall_activate(), le bogue "off by !"
). Un utilisateur local non privilégié peut escalader vers root et s'échapper d'un conteneur,
via les espaces de noms utilisateur non privilégiés.
Ce dépôt ne contient aucun exploit. Il contient un vérificateur d'exposition en lecture seule, un script pour créer un utilisateur véritablement non privilégié, et des définitions de VM pour que vous puissiez atteindre le bogue en toute sécurité et étudier la recherche publique. La chaîne complète vers root se trouve dans les divulgations liées ci-dessous, pas ici.
Article complet : https://techearl.com/cve-2026-23111-nftables-lpe
check-exposure.sh — détecteur en lecture seule : version du noyau par rapport à la version corrigée, présence de nf_tables, précondition d'espace de noms utilisateur non privilégié, et signatures de crash dans le journal du noyau.setup-unprivileged-user.sh — crée un labuser sans sudo et prouve qu'il est non privilégié. L'intérêt d'un test d'escalade de privilèges locale (LPE) est de partir d'un utilisateur qui ne peut pas déjà devenir root.Vagrantfile — machines virtuelles jetables Debian 12 et AlmaLinux 10 (les distributions que Multipass ne peut pas lancer).Un conteneur partage le noyau hôte. Exécuter un exploit du noyau dans un conteneur l'exécute contre votre vrai noyau hôte, donc un « test » peut compromettre la machine réelle. Utilisez une machine virtuelle jetable avec son propre noyau.
Multipass ne lance que Ubuntu, c'est pourquoi les autres utilisent Vagrant.
Chaque distribution a nécessité une astuce différente pour démarrer un noyau véritablement antérieur au correctif qui a toujours un réseau fonctionnel sur une VM cloud :
linux-aws, pas linux-generic. Le noyau
générique manque du pilote de carte réseau AWS ENA et perd la connexion SSH sur une instance Nitro.
sudo apt install -y linux-image-6.8.0-1028-aws (en dessous du corrigé 6.8.0-1051),
définissez-le par défaut dans GRUB, redémarrez. Sur une virtualisation locale, le noyau générique convient.cloud (conserve ENA) :
deb [check-valid-until=no trusted=yes] https://snapshot.debian.org/archive/debian/20251201T000000Z/ bookworm main,
puis apt install -y linux-image-6.1.0-39-cloud-amd64=6.1.148-1 (en dessous du corrigé 6.1.164-1, DSA-6163-1).el10_1 se trouvent dans le coffre 10.1.
Pointez dnf vers https://vault.almalinux.org/10.1/BaseOS/x86_64/os/ et
, puis .# 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'
Cette séquence exécute le chemin d'abandon bogué ; elle n'inclut pas de chaîne d'escalade de privilèges, et sur un noyau standard elle est silencieuse (voir ci-dessous).
Le constat honnête sur le déclencheur : sur un noyau de production standard, il est silencieux.
Il exécute le chemin d'abandon bogué sans crash ni sortie dmesg, même en boucle
avec libération et réutilisation. La sortie KASAN: slab-use-after-free dans les articles
provient d'un noyau KASAN/debug ; l'exploitation de l'use-after-free latent nécessite le
heap spray de l'exploit (pas dans ce dépôt). Le laboratoire prouve que l'utilisateur non privilégié
atteint le bogue, montre la restriction par défaut AppArmor d'Ubuntu bloquant ce chemin,
et donne un verdict clair EXPOSÉ / ATTÉNUÉ / corrigé. Il ne vous donne pas un shell root, par conception.
Restreignez les espaces de noms utilisateur non privilégiés (ferme le chemin réaliste pour les exploits publics), puis corrigez le noyau.
# 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. Utilisation défensive et éducative.
| Distribution | Lancement avec | Pourquoi |
|---|
| Ubuntu 24.04 / 22.04 | Multipass (Ubuntu uniquement) | Exodus reproduit sur les deux ; 24.04 intègre la restriction d'espace de noms utilisateur AppArmor par défaut, donc elle montre l'atténuation. |
| Debian 12 | Vagrant (vagrant up debian) | Exodus reproduit dessus ; espaces de noms utilisateur non privilégiés ouverts par défaut. |
| AlmaLinux / Rocky 10.1 | Vagrant (vagrant up alma) | Correspond au noyau cible de FuzzingLabs 6.12.0-124.x.el10, donc leur déclencheur public se reproduit tel que publié. |
dnf install kernel-6.12.0-124.38.1.el10_1grubby --set-default| Distribution | Noyau vulnérable démarré | userns par défaut | Verdict |
|---|
| Ubuntu 24.04 | 6.8.0-1028-aws | restreint (AppArmor) | ATTÉNUÉ, pas corrigé |
| Debian 12 | 6.1.0-39-cloud (6.1.148-1) | ouvert | EXPOSÉ |
| AlmaLinux 10.1 | 6.12.0-124.38.1.el10_1 | ouvert | EXPOSÉ |