
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 header sk_buff dopo che un callback dell'header del dispositivo
rialloca la testa dell'skb.
Questo repository è destinato esclusivamente a ricerca di sicurezza autorizzata, analisi di vulnerabilità del kernel, ambienti CTF e test difensivi.
Non eseguire codice proof-of-concept contro sistemi senza esplicita autorizzazione.
Il record CVE identifica la vulnerabilità come un puntatore obsoleto all'header PPPoE che
può diventare non valido quando dev_hard_header() rialloca la testa dell'skb.
La vulnerabilità esiste in:
drivers/net/ppp/pppoe.c
all'interno di:
pppoe_sendmsg()
La sequenza vulnerabile è concettualmente:
pppoe_sendmsg()
│
▼
Salva il puntatore all'header PPPoE
│
▼
dev_hard_header()
│
▼
la testa dell'skb può essere riallocata
│
▼
Il vecchio puntatore diventa obsoleto
│
▼
PPPoE scrive attraverso il puntatore obsoleto
│
▼
Use-After-Free
│
▼
Corruzione della memoria del kernel
Il codice di networking di Linux consente ai callback dell'header del dispositivo di riallocare
la testa dell'sk_buff. Un puntatore nella vecchia testa non può quindi essere riutilizzato in modo sicuro
dopo che dev_hard_header() ritorna.
Il problema centrale è una violazione del ciclo di vita.
pppoe_sendmsg() ottiene un puntatore all'header PPPoE prima di invocare:
dev_hard_header()
Tuttavia, quel callback può causare lo spostamento della testa dell'skb.
Concettualmente:
Prima del callback:
skb
┌──────────────────────────────┐
│ Ethernet │ PPPoE │ Payload │
└──────────┴───────┴───────────┘
▲
│
puntatore obsoleto
Dopo l'espansione dell'skb:
vecchia testa skb ──X──► liberata
nuova testa skb
┌────────────────────────────────────┐
│ Ethernet │ PPPoE │ Payload │
└──────────┴───────┴─────────────────┘
▲
│
posizione valida
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.
L'attivazione documentata coinvolge una race attorno a copy_from_user() e cambiamenti
alle operazioni dell'header di un dispositivo team.
Una sequenza descritta è:
PPPoE sendmsg()
│
▼
copy_from_user() si blocca
│
│
├───────────────┐
│ │
▼ ▼
Il dispositivo team cambia Viene aggiunta la prima porta
le operazioni dell'header non-Ethernet
│
▼
Callback GRE delegato
│
▼
Espansione della testa skb
│ │
└───────────────┘
│
▼
puntatore PPPoE obsoleto
│
▼
scrittura use-after-free
Il record CVE nota 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 la testa dell'skb.
La vulnerabilità può causare:
Il vettore CVSS pubblicato del 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:
Socket PF_PPPOX / PPPoE
│
▼
pppoe_sendmsg()
│
▼
sk_buff (skb)
│
▼
dev_hard_header()
│
▼
Callback dell'header del dispositivo di rete
│
▼
Potenziale espansione della testa skb
│
▼
Puntatore all'header PPPoE obsoleto
│
▼
Scrittura UAF
Il codice vulnerabile non è quindi semplicemente un parser generico di pacchetti PPPoE; la condizione critica è l'interazione tra trasmissione del socket PPPoE e riallocazione dinamica della testa skb.
La correzione upstream è intitolata:
pppoe: reload header pointer after dev_hard_header()
La correzione ricarica l'header PPPoE attraverso l'offset dell'header di rete dell'skb dopo la creazione dell'header del dispositivo.
La proprietà importante è:
Prima:
puntatore all'header
│
▼
dev_hard_header()
│
▼
l'skb si sposta
│
▼
puntatore = obsoleto ❌
Dopo:
dev_hard_header()
│
▼
l'skb può spostarsi
│
▼
ricarica l'header usando l'offset dell'skb
│
▼
puntatore = valido ✅
pskb_expand_head() aggiorna l'offset rilevante dell'skb quando la testa dell'skb viene
rilocata, rendendo sicura la ricerca basata sull'offset dopo la riallocazione.
Un laboratorio controllato può essere strutturato come:
┌───────────────────────────────────────────────┐
│ Linux VM │
│ │
│ ┌───────────────┐ │
│ │ PPPoE Socket │ │
│ └───────┬───────┘ │
│ │ │
│ ▼ │
│ ┌───────────────┐ │
│ │ pppoe_sendmsg │ │
│ └───────┬───────┘ │
│ │ │
│ ▼ │
│ ┌───────────────┐ │
│ │ Team │ │
│ └───────┬───────┘ │
│ │ │
│ ▼ │
│ ┌───────────────┐ │
│ │ GRE │ │
│ └───────────────┘ │
│ │
└───────────────────────────────────────────────┘
Strumenti utili per il debug del kernel:
gdb
pwndbg
gef
crash
objdump
readelf
pahole
Monitorare i messaggi del kernel:
sudo dmesg -w
Ispezionare il supporto PPPoE:
lsmod | grep pppoe
Verificare i moduli PPP disponibili:
find /lib/modules/$(uname -r) -iname '*pppoe*'
Verificare il kernel attualmente in esecuzione:
uname -r
Verificare la configurazione relativa a PPPoE:
grep -E 'CONFIG_PPP|CONFIG_PPPOE' \
/boot/config-$(uname -r)
Le opzioni rilevanti tipiche includono:
CONFIG_PPP
CONFIG_PPP_ASYNC
CONFIG_PPP_SYNC_TTY
CONFIG_PPPOE
Per la ricerca controllata sul kernel:
01. Compilare il kernel vulnerabile
↓
02. Avviare una VM isolata
↓
03. Abilitare il supporto PPPoE
↓
04. Creare una topologia di rete controllata
↓
05. Configurare l'interazione team/GRE
↓
06. Esercitare pppoe_sendmsg()
↓
07. Monitorare il ciclo di vita dell'skb
↓
08. Catturare la diagnostica del kernel
↓
09. Applicare la patch upstream
↓
10. Ripetere e confrontare
L'obiettivo è riprodurre in modo sicuro la violazione del ciclo di vita della memoria e confrontare il comportamento vulnerabile e quello corretto.
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
La mitigazione raccomandata è aggiornare a un kernel Linux contenente la correzione upstream o un backport appropriato della distribuzione.
Per Debian/Kali:
sudo apt update
sudo apt full-upgrade
Poi riavviare:
sudo reboot
Verificare il kernel in esecuzione:
uname -r
I backport delle distribuzioni possono utilizzare numeri di versione diversi, quindi gli amministratori dovrebbero verificare il pacchetto installato rispetto all'avviso di sicurezza della distribuzione. Debian attualmente elenca versioni corrette tra cui 6.1.187-1 per Bookworm e 6.12.101-1 per Trixie.
Gli alberi stabili di Linux contengono la correzione su più rami mantenuti. Il record CVE elenca i commit stabili corrispondenti e identifica il file sorgente interessato come:
drivers/net/ppp/pppoe.c
La storia vulnerabile inizia con l'implementazione PPPoE del kernel Linux e
la serie di commit correttivi termina con la correzione upstream rappresentata da
7a56e7c9b08e08fd55a1bcada24cf4fe3782b722 nei dati CVE.
Un puntatore in un skb non può essere considerato valido dopo un callback in grado di riallocare la testa dell'skb.
I callback di networking possono modificare il layout di memoria sottostante.
La patch dimostra perché un offset relativo all'skb è più sicuro che mantenere un puntatore grezzo attraverso un'operazione potenzialmente rilocante.
Lo stato vulnerabile dipende da attività concorrenti attorno alla trasmissione dei pacchetti e alla configurazione del dispositivo di rete.
Un puntatore obsoleto nel codice di networking del kernel può diventare una primitiva di corruzione della memoria con conseguenze su riservatezza, integrità e 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
| Campo | Dettagli |
|---|
| CVE | CVE-2026-68121 |
| Nome in codice | PPPoEject |
| Componente | Linux Kernel |
| 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 |
| Proprietà di sicurezza | Vulnerabile | Corretto |
|---|
| Puntatore all'header salvato prima del callback | ✅ | — |
| La testa skb può spostarsi | ✅ | ✅ |
| Puntatore aggiornato dopo il callback | ❌ | ✅ |
| Dereferenziazione di puntatore obsoleto | Possibile | Prevenuta |
| Scrittura use-after-free | Possibile | Mitigata |
| Corruzione della memoria del kernel | Possibile | Mitigata |