
Forschungs-Repository für CVE-2026-68121, einen Use-after-Free im Linux-Kernel-PPPoE in pppoe_sendmsg(), der lokale Rechteausweitung ermöglicht, mit PoC, Ursachenanalyse und Laboreinrichtung.
PPPoEject
Eine Speicherkorruptions-Schwachstelle im Linux-Kernel im PPPoE-Übertragungspfad,
verursacht durch einen veralteten Zeiger auf einen sk_buff-Header, nachdem ein
Geräte-Header-Callback den skb-Head neu zugewiesen hat.
Dieses Repository ist ausschließlich für autorisierte Sicherheitsforschung, Kernel-Schwachstellenanalyse, CTF-Umgebungen und defensives Testen gedacht.
Führen Sie Proof-of-Concept-Code nicht gegen Systeme aus, für die keine ausdrückliche Genehmigung vorliegt.
| Feld | Details |
|---|---|
| CVE | CVE-2026-68121 |
| Codename | PPPoEject |
| Komponente | Linux Kernel |
| Subsystem | PPPoE / Networking |
| Betroffene Datei | drivers/net/ppp/pppoe.c |
| Primäre Funktion | pppoe_sendmsg() |
| Fehlerklasse | Use-After-Free |
| Auswirkung | Kernel-Speicherkorruption |
| Potenzieller Impact | Lokale Privilegieneskalation |
| CVSS v3.1 | 7.8 — High |
| Angriffsvektor | Lokal |
| Angriffskomplexität | Niedrig |
| Erforderliche Privilegien | Niedrig |
| Benutzerinteraktion | Keine |
| Status | Gepatcht |
Der CVE-Eintrag identifiziert die Schwachstelle als einen veralteten PPPoE-Header-Zeiger,
der ungültig werden kann, wenn dev_hard_header() den skb-Head neu zuweist.
Die Schwachstelle befindet sich in:
drivers/net/ppp/pppoe.c
innerhalb von:
pppoe_sendmsg()
Die verwundbare Sequenz ist konzeptionell:
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
Der Linux-Netzwerkcode erlaubt es Geräte-Header-Callbacks, den sk_buff-Head neu zu allozieren. Ein Zeiger in den alten Head kann daher nach der Rückkehr von dev_hard_header() nicht sicher wiederverwendet werden.
Das Kernproblem ist eine Lifetime-Verletzung.
pppoe_sendmsg() erhält einen Zeiger auf den PPPoE-Header, bevor Folgendes aufgerufen wird:
dev_hard_header()
Der Callback kann jedoch dazu führen, dass sich der skb-Kopf verschiebt.
Konzeptionell:
Before callback:
skb
┌──────────────────────────────┐
│ Ethernet │ PPPoE │ Payload │
└──────────┴───────┴───────────┘
▲
│
stale pointer
After skb expansion:
old skb head ──X──► freed
new skb head
┌────────────────────────────────────┐
│ Ethernet │ PPPoE │ Payload │
└──────────┴───────┴─────────────────┘
▲
│
valid location
Der alte Zeiger verweist weiterhin auf die freigegebene Zuweisung.
Wenn PPPoE anschließend den Header über diesen Zeiger schreibt, führt der Kernel einen Use-after-free-Schreibzugriff aus.
Der dokumentierte Auslöser beinhaltet eine Race-Bedingung rund um copy_from_user() und Änderungen
an den Header-Operationen eines Team-Geräts.
Eine beschriebene Abfolge ist:
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
Der CVE-Eintrag merkt an, dass dies auftreten kann, wenn der erste Nicht-Ethernet-Port zu einem leeren Team-Gerät hinzugefügt wird und der delegierte GRE-Header-Callback den skb-Head erweitert.
Die Schwachstelle kann zu Folgendem führen:
Der veröffentlichte CVSS-Vektor der CVE lautet:
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
mit einem Basiswert von 7.8 High.
Die relevanten Komponenten sind:
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
Der verwundbare Code ist daher nicht einfach ein generischer PPPoE-Paketparser; die kritische Bedingung ist die Interaktion zwischen PPPoE-Socket-Übertragung und dynamischer skb-Head-Neuzuweisung.
Der Upstream-Fix trägt den Titel:
pppoe: reload header pointer after dev_hard_header()
Die Korrektur lädt den PPPoE-Header über den network-header offset des skb neu, nachdem der Geräte-Header erstellt wurde.
Die wichtige Eigenschaft ist:
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() aktualisiert den relevanten skb-Offset, wenn der skb-Kopf
verschoben wird, wodurch die offsetbasierte Suche nach einer Neuzuweisung sicher bleibt.
| Sicherheitseigenschaft | Anfällig | Gepatcht |
|---|---|---|
| Header-Zeiger vor Callback gespeichert | ✅ | — |
| skb-Kopf kann sich verschieben | ✅ | ✅ |
| Zeiger nach Callback aktualisiert | ❌ | ✅ |
| Dereferenzierung eines veralteten Zeigers | Möglich | Verhindert |
| Use-after-free-Schreibzugriff | Möglich | Abgemildert |
| Kernel-Speicherkorruption | Möglich | Abgemildert |
Ein kontrolliertes Labor kann wie folgt strukturiert werden: