Skip to content
KitploitKITPLOIT
OutilsBlog
Log in
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
Outils/GitHubGitHub/baba01hacker666/cve-2026-23111
Escalade de PrivilègesCriminalistique MémoireAnalyse des VulnérabilitésExploitationRétro-ingénierieArticles et RechercheApprentissage et ÉducationExploitation de Binaires
GitHubbaba01hacker666/cve-2026-23111

CVE-2026-23111

Linux Kernel nf_tables Use-After-Free (CVE-2026-23111) — PoC d'élévation de privilèges locaux (LPE)

Voir le dépôt
728il y a 2 moisPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

PoC CVE-2026-23111

Utilisation-Après-Libération dans nf_tables du noyau Linux (Élévation de privilèges locale) poc par baba01hacker

Résumé de la vulnérabilité

  • CVE : CVE-2026-23111
  • Type : Utilisation-Après-Libération (CWE-416)
  • CVSS : 7.8 (ÉLEVÉ)
  • Composant : net/netfilter/nf_tables_api.c — nft_map_catchall_activate()
  • Cause racine : Vérification inversée de genmask provoque une fuite du compteur de références de chaîne lors de l'annulation de transaction

Versions du noyau affectées

Plage de versionsCorrigée dans
6.19-rc1 to 6.19-rc86.19-rc9+
6.13 to 6.18.96.18.10
6.7 to 6.12.696.12.70
6.4.1 to 6.5.xEOL (aucun correctif stable)
6.3.10 to 6.3.xEOL
6.0.x, 6.2.xEOL
6.1.36 to 6.1.1626.1.163
5.15.121 to 5.15.1995.15.200
5.10.188+, 5.4.262+, 4.19.316+Divers LTS

Détails de la vulnérabilité

CVE-2026-23111 est une utilisation-après-libération dans nf_tables causée par une vérification inversée du masque de génération dans nft_map_catchall_activate(). Lors du rollback d'une transaction ayant échoué, les éléments catchall des maps de verdict qui ont été désactivés par NFT_MSG_DELSET doivent être réactivés afin que les références telles que les références de chaîne NFT_GOTO soient restaurées. Le chemin d'activation catchall a plutôt ignoré les éléments inactifs et traité les éléments actifs, laissant les éléments catchall désactivés non restaurés.

La logique d'activation correcte pour les éléments non-catchall est :

if (nft_set_elem_active(ext, iter->genmask))
    return 0; /* ignorer actif, traiter inactif */

Le chemin catchall vulnérable utilisait la condition opposée :

if (!nft_set_elem_active(ext, genmask))
    continue; /* ignorer inactif, traiter actif */

Lorsqu'une map de verdict pipapo supprimée est rollbackée, cela empêche nft_setelem_data_activate() de s'exécuter pour l'élément catchall inactif. Pour les données de verdict NFT_JUMP/NFT_GOTO, la référence de chaîne prise par nft_data_hold() n'est donc pas restaurée. La répétition de la séquence annulation/bascule/suppression peut réduire chain->use à zéro alors qu'une autre règle contient encore une référence de verdict valide vers la chaîne. Une DELCHAIN ultérieure peut alors libérer la chaîne alors qu'elle reste accessible, créant ainsi l'UAF.

Déroulement du déclenchement

Créer une table, une chaîne de base, une chaîne victime et une map de verdict pipapo avec un élément catchall NFT_GOTO -> victime
        |
Batch 1 : supprimer l'ensemble pipapo, puis forcer une erreur de transaction
        |
Le chemin d'annulation appelle nft_map_catchall_activate(), mais la vérification inversée ignore le catchall inactif
        |
Le catchall reste inactif et le compteur de références de la chaîne victime n'est pas restauré
        |
Batch 2 : valider une transaction bénigne pour basculer le curseur de génération
        |
Batch 3 : supprimer l'ensemble pipapo avec succès, décrémentant à nouveau la référence de la chaîne victime
        |
Batch 4 : supprimer la chaîne victime alors que le verdict de la chaîne de base y fait encore référence
        |
Utilisation-après-libération lors de l'évaluation de paquet ou du dump de règles suivant la référence de verdict pendante

Le correctif en amont consiste à supprimer la négation afin que nft_map_catchall_activate() corresponde à nft_mapelem_activate() : les éléments actifs sont ignorés, les éléments inactifs sont réactivés, et les références de verdict/objet sont restaurées lors du traitement d'annulation.

Test uniquement

python3 CVE-2026-23111-checker.py --detailed
python3 CVE-2026-23111-checker.py --json

Lancer le PoC en une ligne

wget https://raw.githubusercontent.com/Baba01hacker666/CVE-2026-23111/refs/heads/master/exploit_full.c && gcc -Wall -O2 -o exploit_full exploit_full.c -lnftnl -lmnl && ./exploit_full -d

v2 Fallback en une ligne

Utilisez ceci si le PoC complet/v1 échoue sur le noyau cible.

wget https://raw.githubusercontent.com/Baba01hacker666/CVE-2026-23111/refs/heads/master/exploit_v2.c && gcc -Wall -O2 -o exploit_v2 exploit_v2.c -lnftnl -lmnl && ./exploit_v2 -d

Construction locale

Installez d'abord les dépendances de construction si le compilateur ne trouve pas les en-têtes libmnl/libmnl.h ou libnftnl :

scripts/install-build-deps.sh
# ou
make deps
make          # Construire l'exploit (PoC uniquement)
make v2       # Construire l'exploit v2 (approche FuzzingLabs — essayez lorsque v1 échoue)
make full     # Construire l'exploit LPE complet
make v3       # Construire la variante v3 calibrée eval-path
make run-d    # Exécuter le PoC avec sortie de débogage
make run-v2-d # Exécuter v2 avec sortie de débogage
make run-v3   # Afficher l'utilisation/l'aide de v3
make run-full # Exécuter le LPE complet

Étapes de l'exploit

Phase 1 : Déclenchement UAF ✅ FONCTIONNEL

Crée un ensemble map pipapo avec un élément catchall (goto chaîne victime), puis utilise le bogue genmask inversé lors d'une annulation DELSET pour corrompre chain->use. Après avoir avancé le compteur de génération, DELCHAIN réussit malgré les références pendantes, libérant la chaîne.

Phase 2 : Fuite KASLR ✅ FONCTIONNEL

Après l'UAF, la mémoire de chain->name est libérée. Nous pulvérisons des structures seq_operations (32 octets) en ouvrant /proc/self/stat pour récupérer l'emplacement du cache slab libéré. La lecture de la règle de verdict immédiate de la chaîne de base via NFT_MSG_GETRULE vide le nom de chaîne récupéré, divulguant des pointeurs de fonctions du noyau. La validation des pointeurs garantit que seules les adresses canoniques du texte du noyau sont acceptées.

Phase 3 : Fuite d'adresse tas ✅ FONCTIONNEL

Re-déclenche l'UAF avec un nom de chaîne plus long (140 octets → kmalloc-cg-192), puis pulvérise des objets nft_rule pour récupérer la mémoire. Les pointeurs list_head divulgués révèlent des adresses tas dans la région de la carte directe.

Phase 4 : Détournement du flux de contrôle & ROP 🔧 Cadre complet

  • Deux règles de 192 octets avec des données contrôlées pulvérisées pour de faux nft_expr_ops et nft_rule_blob
  • Adresses tas de la Phase 3 utilisées pour lier les pointeurs faux blob → faux expr_ops
  • Pulvérisation de données utilisateur de table de 128 octets pour écraser le blob_gen_0 de la chaîne libérée
  • Chaîne ROP : commit_creds(&init_cred) → switch_task_namespaces → swapgs; iretq
  • Gadgets ROP scannés automatiquement depuis /proc/kcore
  • Paquet déclencheur envoyé à travers la chaîne de base pour invoquer le ops->eval de l'expression détournée

Exploit v2 (Approche FuzzingLabs)

L'exploit v2 (exploit_v2.c) utilise les techniques décrites dans le writeup FuzzingLabs et peut être utilisé lorsque le PoC v1 échoue. Différences clés :

Composantv1 (exploit.c)v2 (exploit_v2.c)
Déclenchement UAFUn seul ensemble + règle goto immédiateDeux ensembles (style FuzzingLabs) + règle de lookup
Lecture KASLRNFT_MSG_GETRULE (dump de règle)NFT_MSG_GETELEM (dump d'élément) + fallback GETRULE
Fuites tasPulvérisation nft_rule + fuite list_headChaîne de lecture arbitraire init_ipc_ns
Hôte ROPnft_rules + données utilisateur de tablemsg_msg-2k (message de 2048 octets)
Déclenchement de détournementÉvaluation de paquet sur goto immédiatÉvaluation de paquet sur catchall d'ensemble survivant
Élévation de privilègescommit_creds + switch_task_namespacesÉcriture de modprobe_path + désactivation SELinux
Chemin de retourswapgs; iretqmsleep() (reste dans le noyau)

Chaîne de fuite v2 (lecture arbitraire via init_ipc_ns)

Télécharger l’outil