
Proof-of-Concept-Exploit für eine lokale Privilege-Escalation bei einer Race Condition in der Linux-qdisc-Rate-Table, die mithilfe von BPF-Heap-Grooming und einem Pipe-Leak Root-Rechte erlangt.

Dieses Repository enthält einen Proof-of-Concept-Exploit zur lokalen Privilegieneskalation für CVE-2026-68138, eine Race-Bedingung im Rate-Table-Code der Linux-Traffic-Control. In der getesteten QEMU-Umgebung eskaliert der PoC von einem normalen Prozess mit äußerer UID 1000 zu einer Shell mit UID 0 im initialen User-Namespace.
Warnung
Dieser Code beschädigt absichtlich den Zustand des Kernel-Heaps. Verwenden Sie ihn ausschließlich in einer isolierten, wegwerfbaren VM, die Ihnen gehört. Eine verpasste Race oder eine verfrühte Bereinigung kann den Gast zum Absturz bringen (Kernel-Panic). Führen Sie ihn nicht auf einer Workstation, einem Server oder einem System Dritter aus.
qdisc_get_rtab() und qdisc_put_rtab() verwalten eine prozessglobale einfach verkettete Liste, qdisc_rtab_list, sowie einen einfachen nicht-atomaren int refcnt. Historisch hielten die Aufrufer den RTNL-Mutex, der den Zugriff auf die Liste und den Referenzzähler serialisierte.
Der Flower-Klassifizierer setzt TCF_PROTO_OPS_DOIT_UNLOCKED. Eine RTM_NEWTFILTER-Anfrage für eine Flower-Regel kann folglich eine Police-Action erreichen und die qdisc-Rate-Table-Helfer ohne RTNL aufrufen:
tc_new_tfilter()
-> fl_change()
-> tcf_exts_validate_ex()
-> tcf_action_init()
-> tcf_police_init()
-> qdisc_get_rtab()/qdisc_put_rtab()
Parallele Anfragen, die dieselbe Rate-Tabelle verwenden, können zu einer Race-Bedingung auf der globalen Liste und ihrem Referenzzähler führen. Das Ergebnis ist ein Use-after-Free oder Double-Free von struct qdisc_rate_table, einem 1056-Byte-Objekt, das auf dem getesteten x86-64-Kernel aus kmalloc-2k alloziert wird.
Da die Liste global und nicht pro Netzwerk-Namespace ist, konkurrieren Anfragen aus getrennten Netzwerk-Namespaces weiterhin um dasselbe Objekt.
Der Linux-CNA-Eintrag identifiziert den Einführungs-Commit 470502de5bdb, der in Linux 5.1 veröffentlicht wurde.
| Linie | Status | Commit/Version |
|---|---|---|
| Linux vor 5.1 | Nicht betroffen | Die einführende Änderung fehlt |
| Linux 5.1 bis 7.1.5 | Betroffen, sofern kein Hersteller-Backport vorhanden ist | 470502de5bdb bis zu dem Commit vor dem stabilen Fix |
| Linux 7.1.y | Behoben | 7.1.6, fb29e1b41052 |
| Linux-7.2-Entwicklungsreihe | Betroffen vor rc5 | rc1 bis rc4 |
| Mainline | Behoben | 7.2-rc5, f43ee0c0730d |
Distributionskernel backporten Korrekturen häufig, ohne auf die oben gezeigte Upstream-Version zu wechseln. Prüfen Sie, ob einer der beiden Fixing-Commits – oder die entsprechende Änderung des qdisc-Rate-Table-Spinlocks – im exakt verwendeten Kernelquelltext des Systems vorhanden ist.
Der Exploit wurde gegen den verwundbaren Commit 92d3817649df2b0b6a008a686c8275c88d7ef594, dem direkten Parent des Mainline-Fixes, entwickelt und validiert. Als Kontrolle mit behobenem Kernel diente f43ee0c0730d6191629b5ee1ceae27b1ebfdc047.
Stand 2026-08-12 lieferte die Ubuntu-CVE-Tracker-Suche keinen Eintrag für diese CVE. Die folgende Tabelle ist daher eine direkte Inspektion des Quellcodes und keine Sicherheitsstatus-Bewertung durch Canonical. Jeder verlinkte Ubuntu-Tag enthält weiterhin das ungeschützte qdisc_rtab_list und weist den korrigierenden qdisc_rtab_lock nicht auf.
| Ubuntu-Linie | UntersuCHtes Paket/Tag | Quellcode-Ergebnis |
|---|---|---|
| Ubuntu 22.04 GA | 5.15.0-187.197 | Verwundbarer Code vorhanden; vollständiger Exploit in QEMU reproduziert |
| Ubuntu 22.04 HWE | 6.8.0-136.136~22.04.1 | Verwundbarer Code vorhanden; Exploit-Kette nicht getestet |
| Ubuntu 24.04 HWE | 7.0.0-28.28~24.04.1 | Verwundbarer Code vorhanden; diese Exploit-Kette ist mit dessen Allocator-Härtung nicht kompatibel |
| Ubuntu 26.04 | 7.0.0-28.28 | Verwundbarer Code vorhanden; diese Exploit-Kette ist mit dessen Allocator-Härtung nicht kompatibel |
Zum Zeitpunkt der Inspektion wurde kein korrigiertes Ubuntu-Paket identifiziert. Zukünftige Ubuntu-Pakete sollten auf ein Backport-Äquivalent zu den verlinkten Upstream-Fixes geprüft werden, anstatt nur anhand ihrer Versionsnummer beurteilt zu werden.
Der buildspezifische Ubuntu-22.04-Exploit, das QEMU-Labor, die exakte Image-Checksumme und die Bedingungen sind in ubuntu/README.md dokumentiert. Er wurde gegen den offiziellen Kernel 5.15.0-187-generic #197-Ubuntu mit aktiviertem Memory-Cgroup-Accounting validiert.
Der zugrunde liegende Fehler und diese spezielle Exploit-Kette haben unterschiedliche Anforderungen. Der PoC wurde validiert mit:
CONFIG_USER_NS=y und CONFIG_NET_NS=y;CONFIG_NET_CLS=y, CONFIG_NET_CLS_FLOWER=y, CONFIG_NET_CLS_ACT=y und CONFIG_NET_ACT_POLICE=y;CONFIG_TMPFS_XATTR=y für den simple_xattr-Heap-Spray;CONFIG_MODULES=y und ein nutzbares /sbin/modprobe für den finalen Root-Helfer;CONFIG_MEMCG=n, sodass sich die von dieser Kette verwendeten qdisc/BPF/pipe/xattr-Allokationen den erwarteten kmalloc-2k-Cache teilen;CONFIG_SLAB_BUCKETS=y, Freelist-Randomisierung und Freelist-Härtung waren im erfolgreichen Testkernel aktiviert. KASLR wird nicht grundsätzlich mit einer hartcodierten Adresse umgangen: Der PoC erhält die benötigten Page- und Operations-Zeiger aus dem Pipe-Leak. Das mitgelieferte Labor verwendete nokaslr, um das Debugging zu vereinfachen.
Kernel mit aktiviertem Memory-Cgroup-Accounting oder anderen Allocator-/Cache-Layouts erfordern eine andere Reclaim-Strategie. Der PoC erhebt bewusst keinen Anspruch auf Portabilität über beliebige Distributionskonfigurationen hinweg.
Die separate Ubuntu-Variante implementiert diese andere Reclaim-Strategie; ihre Anforderungen sind bewusst enger gefasst und in ubuntu/README.md aufgelistet.
Vier Worker-Threads betreten verschiedene Netzwerk-Namespaces und erzeugen Flower-Filter mit Police-Actions. Drei Worker durchlaufen den erfolgreichen Aktionspfad; einer liefert nach dem Erwerb beider Rate-Table-Referenzen einen absichtlich ungültigen Estimator und erzwingt so den Bereinigungspfad. Diese Kombination macht die gleichzeitige Manipulation von Referenzzähler und Liste reproduzierbar, ohne den Flower-Klassifizierer-Zustand zwischen den Workern zu teilen.
qdisc_rate_table mit klassischem BPF wiederverwenden