
Forschungs-Repository für CVE-2026-81000 (TUNderflow), einen Integer-Underflow im Receive-Headroom des Linux-Kernel-TUN/TAP-Treibers, der lokale Rechteausweitung ermöglicht, mit PoC, Ursachenanalyse und Laboreinrichtung.
TUNderflow
Eine Speicherbeschädigungs-Schwachstelle im Linux-Kernel im TUN/TAP-Netzwerk- Subsystem, verursacht durch unzureichende Grenzen für den Empfangs-Headroom und einen Integer- Unterlauf im Paketallokationspfad.
Dieses Repository ist für autorisierte Sicherheitsforschung, Schwachstellen- analyse, CTF-Umgebungen, Kernel-Debugging und defensives Testen gedacht.
Verwenden Sie Proof-of-Concept-Code nicht gegen Systeme ohne ausdrückliche Autorisierung.
| Feld | Details |
|---|---|
| CVE | CVE-2026-81000 |
| Codename | TUNderflow |
| Komponente | Linux-Kernel |
| Subsystem | TUN/TAP |
| Betroffener Code | drivers/net/tun.c |
| Primäre Funktion | tun_get_user() |
| Fehlerklasse | Integer-Unterlauf / Out-of-Bounds-Speicherzugriff |
| Auswirkung | Kernel-Speicherbeschädigung |
| Potenzieller Impact | Lokale Rechteausweitung |
| CVSS v3.1 | 7.8 — Hoch |
| Angriffsvektor | Lokal |
| Erforderliche Rechte | Niedrig |
| Benutzerinteraktion | Keine |
| Status | Gepatcht |
Die CVE-Meldung beschreibt das Problem als Integer-Unterlauf, der dazu führen kann,
dass skb->data außerhalb des allozierten skb-Head positioniert wird.
Die Schwachstelle befindet sich im TUN/TAP-Empfangspfad des Linux-Kernels.
Der betroffene Code verwendet den konfigurierten Empfangs-Headroom des TUN-Geräts sowohl als Paket-Headroom als auch bei der Berechnung, wie viele Paketdaten linear bleiben sollen.
Ein überdimensionierter Headroom-Wert kann daher eine ungültige Berechnung in folgendem Bereich erzeugen:
SKB_MAX_HEAD(align)
Wenn der übergebene Wert den nutzbaren Ein-Seiten-Skb-Head überschreitet, kann die Berechnung einen Unterlauf erleiden.
Konzeptionell:
Oversized receive headroom
│
▼
SKB_MAX_HEAD()
│
▼
Integer underflow
│
▼
Negative value
│
▼
size_t wrap
│
▼
Invalid skb data placement
│
▼
Kernel memory corruption
Die anfällige Implementierung befindet sich in:
drivers/net/tun.c
wobei tun_get_user() im Zentrum des verwundbaren Pfads steht.
Das zugrunde liegende Problem ist ein unzureichend begrenzter TUN-Empfangs-Headroom.
Der Kernel kann eine überdimensionierte Headroom-Anforderung über Netzwerkgeräte-Pfade empfangen, die den Wert an TUN/TAP weiterreichen.
Die Schwachstelle wird besonders interessant, wenn eine komplexe virtuelle Netzwerkkonfiguration dazu führt, dass ein großer Headroom-Wert ein TUN-Gerät erreicht.
Die öffentliche Offenlegung beschreibt ein Szenario mit:
Netkit
│
▼
VXLAN
│
▼
Open vSwitch
│
▼
TUN
Eine Beispielkonfiguration kann etwa 4160 Bytes Headroom an einen rohen TUN-Port weitergeben, wodurch die verwundbare Arithmetik einen Unterlauf erfährt.
Die Korruption tritt in der Speicherverwaltungslogik des Kernel-Netzwerks auf.
Mögliche Folgen sind:
Die öffentliche Offenlegung meldet die Schwachstelle als Teil einer Gruppe von Linux-Local-Root-Schwachstellen und gibt an, dass der veröffentlichte PoC eine Rechteausweitung von einem unprivilegierten lokalen Benutzer zu Root auf unterstützten Zielsystemen erreichen kann.
Die Ausnutzbarkeit ist umgebungsabhängig und erfordert die entsprechende TUN-/Netzwerkgerätekonfiguration sowie unterstützende Funktionalität.
ATTACKER
│
▼
Oversized network headroom
│
▼
Virtual network device
│
▼
Open vSwitch
│
▼
TUN/TAP
│
▼
tun_get_user()
│
▼
SKB_MAX_HEAD(align)
│
▼
Integer underflow
│
▼
size_t wraparound
│
▼
Invalid skb->data offset
│
▼
Kernel memory corruption
Die wichtigen Komponenten sind:
drivers/net/tun.c
│
├── tun_set_headroom()
│
├── tun_get_user()
│
└── tun_alloc_skb()
Die verwundbare Beziehung lässt sich vereinfacht darstellen als:
tun->align
│
├── skb headroom
│
└── linear-data calculation
Die Verwendung desselben überdimensionierten Werts in beiden Berechnungen erzeugt eine unsichere Beziehung zwischen dem angeforderten Spielraum und dem tatsächlichen skb-Head-Budget.
Die kritische Sicherheitseigenschaft lässt sich konzeptionell darstellen als:
usable_head < requested_headroom
was zu Folgendem führen kann:
SKB_MAX_HEAD(align) < 0
gefolgt von einer unsignierten Konvertierung:
negative value
↓
size_t
↓
very large unsigned value
Dies kann letztlich die skb-Zuweisung/Datenplatzierung beeinflussen.
Die offizielle Beschreibung weist ausdrücklich darauf hin, dass der resultierende Wert umschlägt, wenn
er der size_t-Variablen linear zugewiesen wird.
Der Upstream-Fix lautet:
447c9303942c439a117d9b76ce6d6e2116c38ee7
Commit:
net: tun: bound receive headroom
Die Korrektur begrenzt den von TUN gespeicherten Headroom gegen das verfügbare Ein-Seiten-skb-Head-Budget und den größten gültigen 16-Bit-skb-Header-Offset. Sie stellt außerdem sicher, dass ausreichend lineare Daten für die Verarbeitung von rohem TUN und TAP verfügbar sind.