
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.

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.
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 :
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.
L'enregistrement CNA Linux identifie le commit d'introduction 470502de5bdb, publié dans Linux 5.1.
| Ligne | Statut | Commit/version |
|---|---|---|
| Linux antérieur à 5.1 | Non concerné | La modification d'introduction est absente |
| Linux 5.1 à 7.1.5 | Concerné sauf si un rétroportage du fournisseur est présent | De 470502de5bdb jusqu'au commit précédant le correctif stable |
| Linux 7.1.y | Corrigé | 7.1.6, fb29e1b41052 |
| Série de développement Linux 7.2 | Concerné avant rc5 | De rc1 à rc4 |
| Mainline | Corrigé | 7.2-rc5, f43ee0c0730d |
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.
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.
| Ligne Ubuntu | Paquet/tag inspecté | Résultat source |
|---|---|---|
| Ubuntu 22.04 GA | 5.15.0-187.197 | Code vulnérable présent ; exploit complet reproduit dans QEMU |
| Ubuntu 22.04 HWE | 6.8.0-136.136~22.04.1 | Code vulnérable présent ; chaîne d'exploitation non testée |
| Ubuntu 24.04 HWE | 7.0.0-28.28~24.04.1 | Code vulnérable présent ; cette chaîne d'exploitation n'est pas compatible avec son durcissement de l'allocateur |
| Ubuntu 26.04 | 7.0.0-28.28 | Code vulnérable présent ; cette chaîne d'exploitation n'est pas compatible avec son durcissement de l'allocateur |
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.
Le bug sous-jacent et cette chaîne d'exploitation particulière ont des exigences différentes. La PoC a été validée avec :
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 ;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.