
Repository di ricerca per CVE-2026-68121, una use-after-free nel kernel Linux in pppoe_sendmsg() relativa a PPPoE che consente l'escalation locale dei privilegi, con PoC, analisi della causa radice e configurazione del laboratorio.
PPPoEject
Una vulnerabilità di corruzione della memoria del kernel Linux nel percorso di trasmissione PPPoE,
causata da un puntatore obsoleto a un'intestazione sk_buff dopo che un callback di intestazione del dispositivo
rialloca l'intestazione dell'skb.
Questo repository è destinato esclusivamente alla ricerca di sicurezza autorizzata, all'analisi di vulnerabilità del kernel, ad ambienti CTF e a test difensivi.
Non eseguire codice proof-of-concept contro sistemi senza esplicita autorizzazione.
| Campo | Dettagli |
|---|---|
| CVE | CVE-2026-68121 |
| Nome in codice | PPPoEject |
| Componente | Kernel Linux |
| Sottosistema | PPPoE / Networking |
| File interessato | drivers/net/ppp/pppoe.c |
| Funzione principale | pppoe_sendmsg() |
| Classe di bug | Use-After-Free |
| Impatto | Corruzione della memoria del kernel |
| Impatto potenziale | Escalation dei privilegi locale |
| CVSS v3.1 | 7.8 — Alto |
| Vettore di attacco | Locale |
| Complessità di attacco | Bassa |
| Privilegi richiesti | Bassi |
| Interazione utente | Nessuna |
| Stato | Corretto |
Il record CVE identifica la vulnerabilità come un puntatore obsoleto all'intestazione PPPoE che
può diventare non valido quando dev_hard_header() rialloca l'intestazione dell'skb.
La vulnerabilità esiste in:
drivers/net/ppp/pppoe.c
all'interno di:
pppoe_sendmsg()
La sequenza vulnerabile è concettualmente:
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
Il codice di networking di Linux consente ai callback dell'header del dispositivo di riallocare la testa di sk_buff. Un puntatore alla vecchia testa non può quindi essere riutilizzato in modo sicuro dopo che dev_hard_header() è ritornato.
Il problema centrale è una violazione del ciclo di vita.
pppoe_sendmsg() ottiene un puntatore all'header PPPoE prima di invocare:
dev_hard_header()
Tuttavia, quella callback può causare lo spostamento della testa dello skb.
Concettualmente:
Before callback:
skb
┌──────────────────────────────┐
│ Ethernet │ PPPoE │ Payload │
└──────────┴───────┴───────────┘
▲
│
stale pointer
After skb expansion:
old skb head ──X──► freed
new skb head
┌────────────────────────────────────┐
│ Ethernet │ PPPoE │ Payload │
└──────────┴───────┴─────────────────┘
▲
│
valid location
Il vecchio puntatore fa ancora riferimento all'allocazione liberata.
Quando PPPoE successivamente scrive l'header attraverso quel puntatore, il kernel esegue una scrittura use-after-free.
Il trigger documentato coinvolge una race attorno a copy_from_user() e modifiche
alle operazioni sull'header di un dispositivo team.
Una sequenza descritta è:
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
Il record CVE rileva che ciò può verificarsi quando la prima porta non Ethernet viene aggiunta a un dispositivo team vuoto e il callback dell'header GRE delegato espande l'head dello skb.
La vulnerabilità può causare:
Il vettore CVSS pubblicato della CVE è:
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
con un punteggio base di 7.8 Alto.
I componenti rilevanti sono:
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
Il codice vulnerabile non è quindi semplicemente un parser generico di pacchetti PPPoE; la condizione critica è l'interazione tra la trasmissione del socket PPPoE e la riallocazione dinamica della testa dell'skb.
La correzione upstream è intitolata:
pppoe: reload header pointer after dev_hard_header()
La correzione ricarica l'intestazione PPPoE tramite l'offset dell'intestazione di rete dello skb dopo la creazione dell'intestazione del dispositivo.
La proprietà importante è:
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() aggiorna l'offset rilevante dello skb quando la testa dello skb viene riallocata, rendendo sicura la ricerca basata sull'offset dopo la riallocazione.