Skip to content
KitploitKITPLOIT
OutilsBlog
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
CVE-2026-68138 — Preuve de concept d'un exploit d'élévation de privilèges locale pour une condition de course sur les tables de débit (rate-table) de qdisc sous Linux, utilisant le grooming du tas BPF et une fuite de pipe pour obtenir les privilèges root. | Kitploit
Outils/GitHubGitHub/aramosf/cve-2026-68138
Escalade de PrivilègesAnalyse des VulnérabilitésExploitationExploitation de Binaires
GitHubaramosf/cve-2026-68138

CVE-2026-68138

Preuve de concept d'un exploit d'élévation de privilèges locale pour une condition de course sur les tables de débit (rate-table) de qdisc sous Linux, utilisant le grooming du tas BPF et une fuite de pipe pour obtenir les privilèges root.

Voir le dépôt
3364il y a 28 joursVérifié par Kitploit

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

CVE-2026-68138 : course sur la table de débit qdisc de Linux menant au root local

CVE-2026-68138 live exploit

Ce dépôt contient une preuve de concept d'exploitation d'élévation de privilèges locaux pour CVE-2026-68138, une course dans le code des tables de débit du contrôle de trafic Linux. Dans l'environnement QEMU testé, la PoC passe d'un processus ordinaire avec un UID externe 1000 à un shell avec UID 0 dans l'espace de noms utilisateur initial.

Avertissement

Ce code corrompt volontairement l'état du tas (heap) du noyau. Ne l'utilisez que dans une VM isolée et jetable qui vous appartient. Une course manquée ou un nettoyage prématuré peut provoquer un panic dans l'invité. Ne l'exécutez pas sur une station de travail, un serveur ou un système tiers.

Résumé de la vulnérabilité

qdisc_get_rtab() et qdisc_put_rtab() gèrent une liste chaînée simple globale au processus, qdisc_rtab_list, ainsi qu'un simple int refcnt non atomique. Historiquement, les appelants détenaient le mutex RTNL, ce qui sérialisait l'accès à la liste et au compteur de références.

Le classifieur flower définit TCF_PROTO_OPS_DOIT_UNLOCKED. Une requête RTM_NEWTFILTER pour une règle flower peut par conséquent atteindre une action police et appeler les fonctions d'aide des tables de débit qdisc sans RTNL :

root@kitploit:~
tc_new_tfilter()
  -> fl_change()
     -> tcf_exts_validate_ex()
        -> tcf_action_init()
           -> tcf_police_init()
              -> qdisc_get_rtab()/qdisc_put_rtab()

Des requêtes concurrentes utilisant la même table de débit peuvent entrer en course sur la liste globale et son compteur de références. Le résultat est une utilisation après libération (use-after-free) ou une double libération de struct qdisc_rate_table, un objet de 1056 octets alloué depuis kmalloc-2k sur le noyau x86-64 testé.

Comme la liste est globale plutôt que propre à chaque espace de noms réseau, des requêtes provenant d'espaces de noms réseau distincts entrent toujours en course sur le même objet.

Versions concernées et corrigées

L'enregistrement CNA Linux identifie le commit d'introduction 470502de5bdb, publié dans Linux 5.1.

Les noyaux de distribution rétroportent fréquemment les correctifs sans passer à la version amont indiquée ci-dessus. Vérifiez si l'un ou l'autre des commits de correctif — ou la modification équivalente du spinlock des tables de débit qdisc — est présent dans la source exacte du noyau utilisée par le système.

L'exploit a été développé et validé contre le commit vulnérable 92d3817649df2b0b6a008a686c8275c88d7ef594, parent direct du correctif mainline. Le témoin du noyau corrigé utilisait f43ee0c0730d6191629b5ee1ceae27b1ebfdc047.

Statut dans les distributions Ubuntu

Au 2026-08-12, la recherche du suivi CVE Ubuntu ne renvoyait aucune entrée pour cette CVE. Le tableau ci-dessous est donc une inspection directe des sources, et non une détermination du statut de sécurité Canonical. Chaque tag Ubuntu lié possède toujours qdisc_rtab_list non verrouillé et ne contient pas le correctif qdisc_rtab_lock.

Aucun paquet Ubuntu corrigé n'a été identifié à cette date d'inspection. Les futurs paquets Ubuntu devront être vérifiés pour un rétroportage équivalent aux correctifs amont liés, plutôt que jugés uniquement par leur numéro de version.

L'exploit Ubuntu 22.04 spécifique à cette build, le laboratoire QEMU, la somme de contrôle exacte de l'image et les conditions sont documentés dans ubuntu/README.md. Il a été validé contre le noyau officiel 5.15.0-187-generic #197-Ubuntu avec la comptabilité memory-cgroup activée.

Conditions requises par la PoC principale

Le bug sous-jacent et cette chaîne d'exploitation particulière ont des exigences différentes. La PoC a été validée avec :

  • Linux x86-64 et quatre CPU virtuelles ;
  • espaces de noms utilisateur non privilégiés et espaces de noms réseau activés ;
  • CONFIG_USER_NS=y et CONFIG_NET_NS=y ;
  • CONFIG_NET_CLS=y, CONFIG_NET_CLS_FLOWER=y, CONFIG_NET_CLS_ACT=y et CONFIG_NET_ACT_POLICE=y ;
  • filtres de socket BPF classiques et prise en charge du BPF JIT ;
  • CONFIG_TMPFS_XATTR=y pour le spray de tas simple_xattr ;
  • CONFIG_MODULES=y et un /sbin/modprobe utilisable pour le helper root final ;
  • CONFIG_MEMCG=n, afin que les allocations qdisc/BPF/pipe/xattr utilisées par cette chaîne partagent le cache kmalloc-2k attendu ;

CONFIG_SLAB_BUCKETS=y, la randomisation des freelistes et le durcissement des freelistes étaient activés dans le noyau de test réussi. KASLR n'est pas contourné de manière inhérente avec une adresse codée en dur : la PoC obtient les pointeurs de page et d'opérations requis à partir de la fuite par pipe. Le laboratoire fourni utilisait nokaslr pour simplifier le débogage.

Les noyaux avec comptabilité memory-cgroup activée ou des dispositions d'allocateur/cache différentes nécessitent une stratégie de récupération différente. La PoC refuse délibérément de revendiquer une portabilité à travers des configurations de distribution arbitraires.

La variante Ubuntu distincte met en œuvre cette stratégie de récupération différente ; ses exigences sont volontairement plus restreintes et sont listées dans ubuntu/README.md.

Processus d'exploitation

1. Déclencher la course qdisc

Quatre threads de travail entrent dans des espaces de noms réseau distincts et créent des filtres flower avec des actions police. Trois workers suivent le chemin d'action réussi ; un fournit un estimateur volontairement invalide après avoir acquis les deux références à la table de débit, forçant le chemin de nettoyage. Cette combinaison rend la manipulation concurrente du compteur de références et de la liste reproductible sans partager l'état du classifieur flower entre les workers.

2. Récupérer qdisc_rate_table avec du BPF classique

Après chaque requête netlink, le même CPU attache immédiatement un filtre BPF classique de 133 instructions. Son tableau d'instructions de 1064 octets est alloué depuis kmalloc-2k et est façonné pour que les octets chevauchant qdisc_rate_table.next et qdisc_rate_table.refcnt restent initialement valides.

La dernière instruction contient un marqueur par socket. SO_GET_FILTER permet à la PoC de détecter quand le pointeur orig_prog->filter d'un socket a été redirigé vers une autre allocation BPF vivante. Cela donne deux objets socket référençant le même tampon d'instructions.

3. Convertir l'alias en fuite par pipe

La fermeture d'un propriétaire diffère la libération effective via sk_filter_release_rcu(). Après la période de grâce, la PoC alloue des anneaux de pipe à 32 emplacements :

root@kitploit:~
32 * sizeof(struct pipe_buffer) = 32 * 40 = 1280 bytes -> kmalloc-2k

Un anneau récupère le tampon BPF aliasé. La lecture de l'autre socket avec SO_GET_FILTER révèle un pipe_buffer vivant, y compris ses pointeurs page et ops ainsi que le décalage de l'entrée du cache de pages de /sbin/modprobe.

4. Forger un tampon de pipe fusionnable

La fermeture du second socket libère l'anneau de pipe vivant après une autre période de grâce RCU, tandis que le pipe_inode_info correspondant le référence encore. Un spray simple_xattr récupère l'anneau de 1280 octets et place le pipe_buffer fuité dans l'emplacement attendu avec PIPE_BUF_FLAG_CAN_MERGE défini.

L'écriture dans chaque pipe candidat finit par ajouter des octets contrôlés par l'attaquant à la page du cache de pages qui soutient le point d'entrée ELF de /sbin/modprobe. La PoC relit le fichier et ne continue qu'après avoir confirmé l'écrasement exact.

5. Exécuter dans l'espace de noms initial

Les noyaux récents n'utilisent plus le repli historique d'auto-chargement de module binfmt invalide dans search_binary_handler(). Cette PoC crée à la place un socket datagramme AF_INET avec le protocole non pris en charge 253. inet_create() demande le module manquant net-pf-2-proto-253-type-2, ce qui amène le noyau à exécuter le /sbin/modprobe écrasé en tant que root de l'espace de noms initial.

La charge utile injectée au point d'entrée écrit un fichier de preuve et ouvre un shell root sur la console série QEMU.

Compilation de la PoC

Le binaire invité est lié statiquement :

root@kitploit:~
./build.sh

Commande équivalente :

root@kitploit:~
gcc -O2 -static -pthread -Wall -Wextra -Werror \
  -o build/exploit exploit.c

Le binaire résultant doit être exposé dans l'invité sous /exploit/CVE-2026-68138. Le laboratoire testé utilisait le partage 9p en lecture-écriture de QEMU. Le helper root attend ce partage à /chroot/exploit depuis l'espace de noms de montage initial ; ajustez helper_command dans exploit.c si le laboratoire utilise une autre disposition.

Les options pertinentes du noyau de test sont consignées dans config.fragment. Il s'agit d'un fragment, pas d'une configuration de noyau de production complète.

Exécution

Depuis le shell invité non privilégié :

root@kitploit:~
id
/exploit/CVE-2026-68138

La course est probabiliste. En cas d'échec, la PoC affiche :

root@kitploit:~
[-] no BPF alias found in this attempt

Redémarrez la VM avant de réessayer. Ne le réexécutez pas dans le même invité : la liste globale qdisc a peut-être déjà été corrompue.

Une exécution réussie atteint :

root@kitploit:~
[+] confirmed dangling orig_prog->filter pointer
[+] pipe leak: page=<kernel pointer> ops=<kernel pointer> off=0x60f len=1 flags=0
[+] page-cache overwrite via dangling pipe
[+] controlled page-cache write confirmed; triggering helper
[+] CVE-2026-68138 initial-namespace root shell
uid=0(root) gid=0(root) groups=0(root)
[+] ROOT PROOF: uid=0(root) gid=0(root) groups=0(root)

La transcription complète et nettoyée se trouve dans docs/example-output.txt.

Résultats reproduits

La chaîne complète a été réalisée trois fois à partir de démarrages frais de VM vulnérables. Le binaire final a produit :

root@kitploit:~
outer identity: uid=1000(user)
alias:          classic-BPF orig_prog->filter overlap
leak:           live pipe_buffer page and ops pointers
write:          verified /sbin/modprobe page-cache modification
final identity: uid=0(root) gid=0(root) groups=0(root)

Le même binaire a été exécuté contre le commit corrigé avec la même topologie à quatre vCPU. Environ 126 000 requêtes de course se sont terminées sans alias BPF, et aucun stade de pipe ou de cache de pages n'a été atteint.

Résultat QEMU Ubuntu 22.04.5

La variante spécifique Ubuntu a également été exécutée contre le noyau générique officiel exact 5.15.0-187.197. L'invité a démarré avec quatre vCPU, la comptabilité memory-cgroup normale et nokaslr comme seul argument de noyau spécifique à l'exploit.

Le noyau Ubuntu n'a pas été recompilé : le test a utilisé le vmlinuz-5.15.0-187-generic inchangé de la distribution et les modules officiels correspondants. Le tableau des prérequis Ubuntu sépare les fonctionnalités du noyau d'origine des ajustements d'exécution et du laboratoire QEMU.

Le compte de départ n'avait ni accès sudo ni groupes supplémentaires :

root@kitploit:~
uid=1000(ubuntu) gid=1000(ubuntu) groups=1000(ubuntu)

À partir d'un instantané frais, l'exploit a obtenu l'alias BPF, l'a récupéré via des objets simple_xattr cgroup-v2 et des bitmaps bloquants select(), a vérifié que /proc/sys/kernel/modprobe contenait /tmp/x, et a atteint :

root@kitploit:~
[+] CVE-2026-68138 Ubuntu initial-namespace root shell
uid=0(root) gid=0(root) groups=0(root)
root@cve-2026-68138-jammy:/# id
uid=0(root) gid=0(root) groups=0(root)

Voir la transcription QEMU réelle et les instructions du laboratoire Ubuntu. La variante code en dur l'adresse de modprobe_path pour ce paquet et nécessite donc nokaslr ; elle ne revendique ni contournement de KASLR ni compatibilité avec une autre construction Ubuntu.

Correctif

Le correctif fait déjà partie du noyau Linux et n'est donc pas dupliqué dans ce dépôt. Les commits de correctif canoniques stable et mainline sont liés dans les références ci-dessous.

Références

  • Enregistrement officiel de la CVE
  • Correctif stable pour Linux 7.1.y
  • Correctif mainline
  • Recherche du suivi CVE Ubuntu
  • Image cloud officielle Ubuntu Jammy

Recherche et implémentation de l'exploit : A. Ramos <[email protected]> (Twitter : @aramosf).

Télécharger l’outil
LigneStatutCommit/version
Linux antérieur à 5.1Non concernéLa modification d'introduction est absente
Linux 5.1 à 7.1.5Concerné sauf si un rétroportage du fournisseur est présentDe 470502de5bdb jusqu'au commit précédant le correctif stable
Linux 7.1.yCorrigé7.1.6, fb29e1b41052
Série de développement Linux 7.2Concerné avant rc5De rc1 à rc4
MainlineCorrigé7.2-rc5, f43ee0c0730d
Ligne UbuntuPaquet/tag inspectéRésultat source
Ubuntu 22.04 GA5.15.0-187.197Code vulnérable présent ; exploit complet reproduit dans QEMU
Ubuntu 22.04 HWE6.8.0-136.136~22.04.1Code vulnérable présent ; chaîne d'exploitation non testée
Ubuntu 24.04 HWE7.0.0-28.28~24.04.1Code vulnérable présent ; cette chaîne d'exploitation n'est pas compatible avec son durcissement de l'allocateur
Ubuntu 26.047.0.0-28.28Code vulnérable présent ; cette chaîne d'exploitation n'est pas compatible avec son durcissement de l'allocateur
  • une limite de descripteurs de fichiers par processus d'au moins 4096 ; et
  • une VM jetable avec environ 5 Gio de RAM.