
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 Speicherbeschädigungsschwachstelle 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 ohne ausdrückliche Autorisierung aus.
Der CVE-Eintrag identifiziert die Schwachstelle als 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 anfällige Sequenz ist konzeptionell:
pppoe_sendmsg()
│
▼
PPPoE-Header-Zeiger speichern
│
▼
dev_hard_header()
│
▼
skb-Head kann neu zugewiesen werden
│
▼
Alter Zeiger wird veraltet
│
▼
PPPoE schreibt über veralteten Zeiger
│
▼
Use-After-Free
│
▼
Kernel-Speicherbeschädigung
Der Linux-Netzwerkcode erlaubt Geräte-Header-Callbacks, den sk_buff-Head neu
zuzuweisen. Ein Zeiger in den alten Head kann daher nach der Rückkehr von
dev_hard_header() nicht sicher wiederverwendet werden.
Das Kernproblem ist eine Lebensdauer-Verletzung.
pppoe_sendmsg() erhält einen Zeiger auf den PPPoE-Header, bevor es Folgendes
aufruft:
dev_hard_header()
Dieser Callback kann jedoch bewirken, dass sich der skb-Head verschiebt.
Konzeptionell:
Vor dem Callback:
skb
┌──────────────────────────────┐
│ Ethernet │ PPPoE │ Payload │
└──────────┴───────┴───────────┘
▲
│
veralteter Zeiger
Nach skb-Erweiterung:
alter skb-Head ──X──► freigegeben
neuer skb-Head
┌────────────────────────────────────┐
│ Ethernet │ PPPoE │ Payload │
└──────────┴───────┴─────────────────┘
▲
│
gültige Position
Der alte Zeiger verweist weiterhin auf die freigegebene Allokation.
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-Condition um copy_from_user()
und Änderungen an den Header-Operationen eines Team-Geräts.
Eine beschriebene Sequenz ist:
PPPoE sendmsg()
│
▼
copy_from_user() blockiert
│
│
├───────────────┐
│ │
▼ ▼
Team-Gerät ändert Erster Nicht-Ethernet-
Header-Operationen Port wird hinzugefügt
│
▼
Delegierter GRE-Callback
│
▼
skb-Head-Erweiterung
│ │
└───────────────┘
│
▼
veralteter PPPoE-Zeiger
│
▼
Use-After-Free-Schreibzugriff
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 Folgendes verursachen:
Der veröffentlichte CVSS-Vektor des CVE ist:
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()
│
▼
Header-Callback des Netzwerkgeräts
│
▼
Potenzielle skb-Head-Erweiterung
│
▼
Veralteter PPPoE-Header-Zeiger
│
▼
UAF-Schreibzugriff
Der anfällige 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()
Der Fix lädt den PPPoE-Header über den Network-Header-Offset des skb nach der Erstellung des Geräte-Headers neu.
Die wichtige Eigenschaft ist:
Vorher:
Header-Zeiger
│
▼
dev_hard_header()
│
▼
skb verschiebt sich
│
▼
Zeiger = veraltet ❌
Nachher:
dev_hard_header()
│
▼
skb kann sich verschieben
│
▼
Header über skb-Offset neu laden
│
▼
Zeiger = gültig ✅
pskb_expand_head() aktualisiert den relevanten skb-Offset, wenn der skb-Head
verschoben wird, wodurch die offsetbasierte Suche nach der Neuzuweisung sicher
wird.
Ein kontrolliertes Labor kann wie folgt strukturiert werden:
┌───────────────────────────────────────────────┐
│ Linux-VM │
│ │
│ ┌───────────────┐ │
│ │ PPPoE-Socket │ │
│ └───────┬───────┘ │
│ │ │
│ ▼ │
│ ┌───────────────┐ │
│ │ pppoe_sendmsg │ │
│ └───────┬───────┘ │
│ │ │
│ ▼ │
│ ┌───────────────┐ │
│ │ Team │ │
│ └───────┬───────┘ │
│ │ │
│ ▼ │
│ ┌───────────────┐ │
│ │ GRE │ │
│ └───────────────┘ │
│ │
└───────────────────────────────────────────────┘
Nützliche Kernel-Debugging-Werkzeuge:
gdb
pwndbg
gef
crash
objdump
readelf
pahole
Kernel-Meldungen überwachen:
sudo dmesg -w
PPPoE-Unterstützung prüfen:
lsmod | grep pppoe
Verfügbare PPP-Module prüfen:
find /lib/modules/$(uname -r) -iname '*pppoe*'
Den aktuell laufenden Kernel prüfen:
uname -r
PPPoE-bezogene Konfiguration prüfen:
grep -E 'CONFIG_PPP|CONFIG_PPPOE' \
/boot/config-$(uname -r)
Typische relevante Optionen sind:
CONFIG_PPP
CONFIG_PPP_ASYNC
CONFIG_PPP_SYNC_TTY
CONFIG_PPPOE
Für kontrollierte Kernel-Forschung:
01. Anfälligen Kernel bauen
↓
02. Isolierte VM starten
↓
03. PPPoE-Unterstützung aktivieren
↓
04. Kontrollierte Netzwerktopologie erstellen
↓
05. Team/GRE-Interaktion konfigurieren
↓
06. PPPoE sendmsg() ausführen
↓
07. skb-Lebensdauer überwachen
↓
08. Kernel-Diagnosedaten erfassen
↓
09. Upstream-Patch anwenden
↓
10. Wiederholen und vergleichen
Das Ziel ist, die Speicher-Lebensdauer-Verletzung sicher zu reproduzieren und das Verhalten von anfälligem und gepatchtem Zustand zu vergleichen.
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
Die empfohlene Gegenmaßnahme ist die Aktualisierung auf einen Linux-Kernel, der den Upstream-Fix oder einen entsprechenden Distributions-Backport enthält.
Für Debian/Kali:
sudo apt update
sudo apt full-upgrade
Danach neu starten:
sudo reboot
Den laufenden Kernel überprüfen:
uname -r
Distributions-Backports können unterschiedliche Versionsnummern verwenden, daher sollten Administratoren ihr installiertes Paket anhand der Sicherheitshinweise der Distribution überprüfen. Debian listet derzeit korrigierte Versionen auf, darunter 6.1.187-1 für Bookworm und 6.12.101-1 für Trixie.
Die Linux-Stable-Bäume enthalten den Fix über mehrere gepflegte Branches hinweg. Der CVE-Eintrag listet die entsprechenden Stable-Commits auf und identifiziert die betroffene Quelldatei als:
drivers/net/ppp/pppoe.c
Die anfällige Historie beginnt mit der PPPoE-Implementierung des Linux-Kernels,
und die korrigierte Commit-Serie endet bei dem Upstream-Fix, der durch
7a56e7c9b08e08fd55a1bcada24cf4fe3782b722 in den CVE-Daten repräsentiert wird.
Ein Zeiger in einen skb kann nicht als gültig angenommen werden, nachdem ein Callback ausgeführt wurde, der den skb-Head neu zuweisen kann.
Netzwerk-Callbacks können das zugrunde liegende Speicherlayout verändern.
Der Patch zeigt, warum ein skb-relativer Offset sicherer ist als das Beibehalten eines rohen Zeigers über eine potenziell verschiebende Operation hinweg.
Der anfällige Zustand hängt von gleichzeitiger Aktivität rund um die Paketübertragung und die Konfiguration von Netzwerkgeräten ab.
Ein veralteter Zeiger im Kernel-Netzwerkcode kann zu einem Speicherbeschädigungs-Primitiv mit Auswirkungen auf Vertraulichkeit, Integrität und Verfügbarkeit werden.
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
| 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-Speicherbeschädigung |
| Potenzieller Impact | Lokale Rechteausweitung |
| CVSS v3.1 | 7.8 — High |
| Angriffsvektor | Lokal |
| Angriffskomplexität | Niedrig |
| Erforderliche Rechte | Niedrig |
| Benutzerinteraktion | Keine |
| Status | Gepatcht |
| Sicherheitseigenschaft | Anfällig | Gepatcht |
|---|
| Header-Zeiger vor Callback gespeichert | ✅ | — |
| skb-Head kann sich verschieben | ✅ | ✅ |
| Zeiger nach Callback aktualisiert | ❌ | ✅ |
| Dereferenzierung eines veralteten Zeigers | Möglich | Verhindert |
| Use-After-Free-Schreibzugriff | Möglich | Entschärft |
| Kernel-Speicherbeschädigung | Möglich | Entschärft |