
CVE-2026-68398 Élévation de privilèges locale use-after-free dans PPPoL2TP d'Ubuntu

Ce dépôt contient un exploit d'élévation de privilèges locale spécifique à une compilation donnée pour la CVE-2026-68398, une course de type use-after-free entre le traitement de réception PPPoL2TP et la destruction d'un canal PPP non attaché. Il a été validé dans QEMU contre le paquet officiel Ubuntu 22.04 linux-image-5.15.0-187-generic (5.15.0-187.197).
Le test final démarre avec un utilisateur dédié UID 1001, sans groupes supplémentaires, sans capacités et sans accès sudo, puis obtient l'UID 0 de l'espace de noms initial. KASLR, SMEP, SMAP et AppArmor restent activés. L'invité n'est pas démarré avec nokaslr, nopti, nosmep ou nosmap.
Avertissement
Ce code corrompt intentionnellement l'état du tas du noyau et est lié à une compilation exacte d'un noyau Ubuntu. Une course qui échoue peut provoquer un panique ou corrompre le système. Exécutez-le uniquement dans une VM isolée et jetable qui vous appartient.
pppol2tp_recv() s'exécute dans le chemin de réception UDP L2TP sous une section critique côté lecture RCU et appelle finalement ppp_input(&po->chan). La socket PPPoX et son ppp_channel intégré sont sûrs vis-à-vis de RCU, mais la struct channel interne utilisée par ppp_input() est une allocation distincte.
Pour un canal lié avec PPPIOCGCHAN mais ni attaché à une unité PPP ni ponté, le chemin de fermeture libérait immédiatement cet objet interne :
RX : l2tp_udp_encap_recv -> pppol2tp_recv -> ppp_input(channel)
CLOSE : pppol2tp_release -> pppox_unbind_sock
-> ppp_unregister_channel -> ppp_release_channel -> kfree(channel)
Le chemin de réception peut donc opérer sur la file skb et la file d'attente de veille du canal déjà libéré. Le correctif ajoute un callback RCU à struct channel et reporte le vidage de la file et la libération jusqu'à l'expiration d'une période de grâce RCU.
La vulnérabilité a été découverte et corrigée en amont par Norbert Szetei de Doyensec. Le correctif principal est ec4215683e47424c9c4762fd3c60f552a3119142.
L'enregistrement CNA Linux identifie la lignée vulnérable comme commençant avec Linux 4.15. Les noyaux des fournisseurs peuvent porter le correctif sous un autre numéro de version ; le code source exact ou le journal des modifications du paquet prévaut donc sur ce tableau.
| Ligne du noyau | Première version corrigée | Correctif |
|---|---|---|
| 6.6.y | 6.6.148 | 4bb84e964ff0 |
| 6.12.y | 6.12.101 | 3ab32218d718 |
| 6.18.y | 6.18.42 | c9574b8a8ede |
| 7.1.y | 7.1.6 | 06213c85d8c0 |
| Principal | 7.2-rc4 | ec4215683e47 |
Les lignes de fournisseurs plus anciennes encore prises en charge nécessitent un backport. Au 2026-08-12, le traqueur CVE d'Ubuntu marque le paquet linux de Jammy comme needs-triage ; aucun paquet Ubuntu Jammy corrigé n'a été identifié. Le code source testé 5.15.0-187.197 appelle encore kfree(pch) directement et est vulnérable.
| Propriété | Valeur |
|---|---|
| Distribution | Ubuntu 22.04.5 LTS (Jammy) |
| Paquet du noyau | linux-image-5.15.0-187-generic / 5.15.0-187.197 |
| Version du noyau | 5.15.0-187-generic #197-Ubuntu |
| Architecture | x86-64 |
| VM | QEMU/KVM, -cpu host, quatre vCPU, 5 Gio de RAM |
| Identité initiale | uid=1001(poc) gid=1001(poc) groups=1001(poc) |
| Capacités initiales | héritables, permises, effectives et ambiantes toutes à zéro |
| Identité finale | uid=0(root) gid=0(root) dans les espaces de noms initiaux |
| Modifications au démarrage | Aucune ; ligne de commande standard, KASLR activé |
Le noyau n'a pas été recompilé. L'image cloud minimale ne contenait pas linux-modules-extra-5.15.0-187-generic ; ce paquet officiel Ubuntu a donc été installé pour fournir l2tp_ppp. Une installation Jammy normale utilisant le métapaquet linux-generic dépend déjà du paquet modules-extra correspondant. Le module du protocole se charge automatiquement lorsque l'exploit crée sa socket PPPoL2TP.
| Exigence | État Ubuntu 5.15.0-187 | Utilisation par l'exploit |
|---|---|---|
| PPP | CONFIG_PPP=y | Intégré |
| L2TP / PPPoL2TP | CONFIG_L2TP=m, CONFIG_PPPOL2TP=m | Module officiel linux-modules-extra |
| Clés utilisateur | CONFIG_KEYS=y | Recycle le canal kmalloc-256 libéré |
| AppArmor | CONFIG_SECURITY_APPARMOR=y | Reste actif ; les fausses credentials incluent une étiquette unconfined valide |
| KASLR | CONFIG_RANDOMIZE_BASE=y | Reste actif ; le décalage est récupéré à l'exécution |
| SMAP | CONFIG_X86_SMAP=y | Reste actif |
| Espaces de noms utilisateur/réseau | Activés par Ubuntu, mais non utilisés | Aucune configuration d'espace de noms ni gain de capacité requis |
/dev/ppp | Non requis | Le canal est lié mais jamais connecté à une unité PPP |
Le détecteur automatique de KASLR utilise un canal auxiliaire temporel de prefetch x86 et nécessite RDTSCP avec KPTI inactif. Le CPU hôte testé expose rdtscp, smep et smap et n'est pas affecté par Meltdown, donc Ubuntu laisse KPTI inactif sans aucune modification au démarrage. Sur un CPU où /proc/cpuinfo signale le drapeau pti, le détecteur refuse de s'exécuter. Il s'agit d'une condition matérielle spécifique à l'exploit : la CVE sous-jacente reste atteignable, mais cette version ne revendique pas de contournement de KASLR sur un système à KPTI actif. Un décalage fourni manuellement n'existe que pour des diagnostics contrôlés.
struct channel libérée. Le chemin RX encore en cours traite les octets de clé contrôlés comme sa file skb et sa file d'attente de veille.core_pattern comme espace de divulgation et expose un pointeur d'allocation de clé.override_creds() avec la cred forgée. Les champs UID/GID, les capacités et les pointeurs utilisateur, namespace, ucount et groupe requis correspondent à la compilation Ubuntu exacte./proc/self/exe vers un fichier unique dans /tmp, le change en propriété root avec le mode 4755 et vérifie ces attributs./usr/bin/id.