
Dépôt de recherche pour CVE-2026-68121, une vulnérabilité use-after-free dans le noyau Linux au niveau de PPPoE dans pppoe_sendmsg() permettant une élévation de privilèges locale, avec PoC, analyse de la cause racine et configuration de laboratoire.
PPPoEject
Une vulnérabilité de corruption de mémoire du noyau Linux dans le chemin de transmission PPPoE,
causée par un pointeur obsolète vers un en-tête sk_buff après qu'un callback d'en-tête de périphérique
a réalloué la tête du skb.
Ce dépôt est destiné uniquement à la recherche en sécurité autorisée, à l'analyse de vulnérabilités du noyau, aux environnements CTF et aux tests défensifs.
N'exécutez pas de code de preuve de concept contre des systèmes sans autorisation explicite.
| Champ | Détails |
|---|---|
| CVE | CVE-2026-68121 |
| Nom de code | PPPoEject |
| Composant | Linux Kernel |
| Sous-système | PPPoE / Networking |
| Fichier affecté | drivers/net/ppp/pppoe.c |
| Fonction principale | pppoe_sendmsg() |
| Classe de bug | Use-After-Free |
| Impact | Corruption de mémoire du noyau |
| Impact potentiel | Élévation de privilèges locale |
| CVSS v3.1 | 7.8 — Élevé |
| Vecteur d'attaque | Local |
| Complexité d'attaque | Faible |
| Privilèges requis | Faibles |
| Interaction utilisateur | Aucune |
| Statut | Corrigé |
L'enregistrement CVE identifie la vulnérabilité comme un pointeur d'en-tête PPPoE obsolète qui
peut devenir invalide lorsque dev_hard_header() réalloue la tête du skb.
La vulnérabilité existe dans :
drivers/net/ppp/pppoe.c
dans :
pppoe_sendmsg()
La séquence vulnérable est conceptuellement :
pppoe_sendmsg()
│
▼
Save PPPoE header pointer
│
▼
dev_hard_header()
│
▼
skb head may be reallocated
│
▼
Old pointer becomes stale
│
▼
PPPoE writes through stale pointer
│
▼
Use-After-Free
│
▼
Kernel memory corruption
Le code réseau de Linux permet aux callbacks d'en-tête de périphérique de réallouer la tête du sk_buff. Un pointeur vers l'ancienne tête ne peut donc pas être réutilisé en toute sécurité après le retour de dev_hard_header().
Le problème central est une violation de durée de vie.
pppoe_sendmsg() obtient un pointeur vers l'en-tête PPPoE avant d'invoquer :
dev_hard_header()
Cependant, ce callback peut entraîner le déplacement de la tête du skb.
Conceptuellement :
Before callback:
skb
┌──────────────────────────────┐
│ Ethernet │ PPPoE │ Payload │
└──────────┴───────┴───────────┘
▲
│
stale pointer
After skb expansion:
old skb head ──X──► freed
new skb head
┌────────────────────────────────────┐
│ Ethernet │ PPPoE │ Payload │
└──────────┴───────┴─────────────────┘
▲
│
valid location
L'ancien pointeur référence toujours l'allocation libérée.
Lorsque PPPoE écrit ensuite l'en-tête via ce pointeur, le noyau effectue une écriture après libération (use-after-free).
Le déclencheur documenté implique une condition de course autour de copy_from_user() et des modifications
des opérations d'en-tête d'un périphérique team.
Une séquence décrite est :
PPPoE sendmsg()
│
▼
copy_from_user() blocks
│
│
├───────────────┐
│ │
▼ ▼
Team device changes First non-Ethernet
header operations port is added
│
▼
Delegated GRE callback
│
▼
skb head expansion
│ │
└───────────────┘
│
▼
stale PPPoE pointer
│
▼
use-after-free write
L'enregistrement CVE note que cela peut se produire lorsque le premier port non-Ethernet est ajouté à un périphérique team vide et que le callback GRE délégué de l'en-tête développe la tête du skb.
La vulnérabilité peut entraîner :
Le vecteur CVSS publié de la CVE est :
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
avec un score de base de 7.8 Élevé.
Les composants concernés sont :
PF_PPPOX / PPPoE socket
│
▼
pppoe_sendmsg()
│
▼
sk_buff (skb)
│
▼
dev_hard_header()
│
▼
Network device header callback
│
▼
Potential skb head expansion
│
▼
PPPoE stale header pointer
│
▼
UAF write
Le code vulnérable n'est donc pas simplement un analyseur générique de paquets PPPoE ; la condition critique réside dans l'interaction entre la transmission via socket PPPoE et la réallocation dynamique de la tête de skb.
Le correctif amont est intitulé :
pppoe: reload header pointer after dev_hard_header()
Le correctif recharge l'en-tête PPPoE via l'offset d'en-tête réseau du skb après la création de l'en-tête de périphérique.
La propriété importante est :
Before:
header pointer
│
▼
dev_hard_header()
│
▼
skb moves
│
▼
pointer = stale ❌
After:
dev_hard_header()
│
▼
skb may move
│
▼
reload header using skb offset
│
▼
pointer = valid ✅
pskb_expand_head() met à jour l'offset skb concerné lorsque la tête du skb est
relocalisée, rendant la recherche basée sur l'offset sûre après réallocation.
| Propriété de sécurité | Vulnérable | Corrigé |
|---|---|---|
| Pointeur d'en-tête sauvegardé avant le callback | ✅ | — |
| La tête du skb peut se déplacer | ✅ | ✅ |
| Pointeur rafraîchi après le callback | ❌ | ✅ |
| Déréférencement de pointeur obsolète | Possible | Empêché |
| Écriture use-after-free | Possible | Atténué |
| Corruption de la mémoire du noyau | Possible | Atténué |