
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 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 de 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.
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
au sein de :
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 provoquer 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 use-after-free.
Le déclenchement documenté implique une condition de course autour de copy_from_user() et des
changements dans les 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 d'en-tête GRE délégué étend 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 est l'interaction entre la transmission de socket PPPoE et la réallocation dynamique de la tête du 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, ce qui rend la recherche basée sur l'offset sûre après réallocation.
Un laboratoire contrôlé peut être structuré comme suit :
┌───────────────────────────────────────────────┐
│ Linux VM │
│ │
│ ┌───────────────┐ │
│ │ PPPoE Socket │ │
│ └───────┬───────┘ │
│ │ │
│ ▼ │
│ ┌───────────────┐ │
│ │ pppoe_sendmsg │ │
│ └───────┬───────┘ │
│ │ │
│ ▼ │
│ ┌───────────────┐ │
│ │ Team │ │
│ └───────┬───────┘ │
│ │ │
│ ▼ │
│ ┌───────────────┐ │
│ │ GRE │ │
│ └───────────────┘ │
│ │
└───────────────────────────────────────────────┘
Outils utiles de débogage du noyau :
gdb
pwndbg
gef
crash
objdump
readelf
pahole
Surveiller les messages du noyau :
sudo dmesg -w
Inspecter la prise en charge PPPoE :
lsmod | grep pppoe
Vérifier les modules PPP disponibles :
find /lib/modules/$(uname -r) -iname '*pppoe*'
Vérifier le noyau actuellement en cours d'exécution :
uname -r
Vérifier la configuration liée à PPPoE :
grep -E 'CONFIG_PPP|CONFIG_PPPOE' \
/boot/config-$(uname -r)
Les options pertinentes typiques incluent :
CONFIG_PPP
CONFIG_PPP_ASYNC
CONFIG_PPP_SYNC_TTY
CONFIG_PPPOE
Pour la recherche contrôlée sur le noyau :
01. Build vulnerable kernel
↓
02. Boot isolated VM
↓
03. Enable PPPoE support
↓
04. Create controlled networking topology
↓
05. Configure team/GRE interaction
↓
06. Exercise PPPoE sendmsg()
↓
07. Monitor skb lifetime
↓
08. Capture kernel diagnostics
↓
09. Apply upstream patch
↓
10. Repeat and compare
L'objectif est de reproduire la violation de durée de vie mémoire en toute sécurité et de comparer le comportement vulnérable et corrigé.
CVE-2026-68121-PPPoEject/
│
├── README.md
│
├── exploit/
│ ├── poc.c
│ └── Makefile
│
├── analysis/
│ ├── root-cause.md
│ ├── pppoe-sendmsg.md
│ ├── skb-lifetime.md
│ └── patch-analysis.md
│
├── kernel/
│ ├── vulnerable/
│ └── patched/
│
├── lab/
│ ├── setup.sh
│ ├── cleanup.sh
│ └── topology.md
│
├── screenshots/
│
├── docs/
│ └── research-notes.md
│
└── LICENSE
L'atténuation recommandée consiste à mettre à jour vers un noyau Linux contenant le correctif amont ou un backport approprié de la distribution.
Pour Debian/Kali :
sudo apt update
sudo apt full-upgrade
Puis redémarrer :
sudo reboot
Vérifier le noyau en cours d'exécution :
uname -r
Les backports de distribution peuvent utiliser des numéros de version différents, les administrateurs doivent donc vérifier leur paquet installé par rapport à l'avis de sécurité de la distribution. Debian liste actuellement les versions corrigées incluant 6.1.187-1 pour Bookworm et 6.12.101-1 pour Trixie.
Les arbres stables de Linux contiennent le correctif sur plusieurs branches maintenues. L'enregistrement CVE liste les commits stables correspondants et identifie le fichier source affecté comme :
drivers/net/ppp/pppoe.c
L'historique vulnérable commence avec l'implémentation PPPoE du noyau Linux et
la série de commits corrigés se termine par le correctif amont représenté par
7a56e7c9b08e08fd55a1bcada24cf4fe3782b722 dans les données CVE.
Un pointeur vers un skb ne peut pas être supposé valide après un callback capable de réallouer la tête du skb.
Les callbacks réseau peuvent modifier la disposition mémoire sous-jacente.
Le correctif démontre pourquoi un offset relatif au skb est plus sûr que de conserver un pointeur brut à travers une opération susceptible de relocaliser.
L'état vulnérable dépend d'une activité concurrente autour de la transmission de paquets et de la configuration du périphérique réseau.
Un pointeur obsolète dans le code réseau du noyau peut devenir une primitive de corruption mémoire avec des conséquences sur la confidentialité, l'intégrité et la disponibilité.
drivers/net/ppp/pppoe.cpppoe_sendmsg()pppoe: reload header pointer after dev_hard_header()Linux Kernel · PPPoE · Use-After-Free · Kernel Security · LPE
Research • Analyze • Reproduce • Harden
| 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 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é |
| 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 mémoire du noyau | Possible | Atténué |