
CVE-2026-36355: Realtek rtl819x Jungle SDK - Lectura/Escritura no autenticada de memoria del kernel a través de ioctls de depuración
El controlador de kernel Wi-Fi rtl8192cd del "Jungle SDK" fuera del árbol de Realtek rtl819x expone dos IOCTLs — write_mem (0x89F5) y read_mem (0x89F6) — sin comprobaciones de control de acceso. Cualquier usuario local que pueda abrir una interfaz de red inalámbrica respaldada por el controlador puede leer o escribir memoria virtual arbitraria del kernel, lo que conduce directamente a root.
Los manejadores están controlados por _IOCTL_DEBUG_CMD_ en 8192cd_cfg.h, que está definido incondicionalmente (sin #ifdef DEBUG), por lo que el conjunto de comandos de depuración se compila en todas las compilaciones de producción.
Un exploit de referencia (kpwn) consigue uid=0 desde un shell sin privilegios, con cero direcciones hardcodeadas — tanto el diseño de task_struct como la ubicación de init_task se detectan automáticamente en tiempo de ejecución, lo que lo hace portable entre versiones de kernel y compilaciones de OEM.
La vulnerabilidad se encuentra en el controlador de kernel Wi-Fi Realtek rtl819x Jungle SDK, en todas las versiones conocidas hasta la v3.4.14B. No hay corrección en el momento de la divulgación. Los rtlwifi / rtw88 / rtw89 del kernel principal de Linux son bases de código diferentes y no están afectados.
El núcleo compartido del controlador se compila en múltiples variantes (rtl8192cd, rtl8192es, rtl8192ee, rtl8192fe, rtl8188ee, etc.). Cualquier compilación del Jungle SDK que incluya el controlador Wi-Fi está afectada.
El Realtek Jungle SDK se redistribuye ampliamente bajo contratos OEM. Los proveedores documentados en la lista de proveedores de CVE-2021-35395 (que apuntaba a un componente diferente, de espacio de usuario, del mismo SDK) incluyen D-Link, TOTOLINK, Tenda, NEC, I-O DATA, Elecom, Buffalo, Humax, H3C e IP-COM. Si cada línea de producto específica incluye el controlador de kernel vulnerable requiere inspección de la publicación del código fuente GPL por producto; este aviso no lo afirma sin verificación independiente.
| Dispositivo | Ortel 4G LTE CPE (OEM: MeiG Smart FORGE_SLT711) |
| SoC | Qualcomm MDM9607, ARMv7 Cortex-A7 |
| Kernel | Linux 3.18.48 |
| Módulo |
Confirmado: escritura de 0xDEADBEEF en .bss del módulo con lectura posterior y restauración; LPE completo de uid=1000 a uid=0 mediante recorrido de init_task y sobrescritura de credenciales, desde un shell sin privilegios.
En 8192cd_cfg.h:
#define _IOCTL_DEBUG_CMD_
No está controlado por #ifdef DEBUG. El conjunto de comandos de depuración se incluye en todas las compilaciones de producción.
El despachador rtl_ioctl() del controlador enruta 0x89F5 y 0x89F6 (en el rango estándar de IOCTL privados SIOCDEVPRIVATE+5/+6 utilizado por los controladores inalámbricos para extensiones de proveedor) a write_mem y read_mem. Los manejadores analizan una cadena proporcionada por el usuario:
dw,<addr>,<count> — lee count palabras de 32 bits desde la dirección virtual del kernel addrdw,<addr>,<count>,<value> — escribe count palabras de 32 bits de value en addrLa dirección se analiza con _atoi(base 16), se pasa a memcpy() contra el espacio de direcciones virtuales del kernel, y el resultado se devuelve con copy_to_user(). No hay:
capable()access_ok() en la direccióntmpbuf1) en .bssLa primitiva de lectura está limitada a 128 bytes por llamada; la primitiva de escritura acepta longitud arbitraria.
La misma brecha de control de acceso se aplica a otros manejadores del conjunto de depuración (lectura/escritura de registros de hardware mediante 0x89F3/0x89F4/0x89F8–0x89FD, escrituras MIB mediante 0x89F1, lectura/escritura de eFuse, modo de prueba de fabricación). Son accesibles a través de la misma ruta de código y merecen una auditoría completa por parte de cualquiera que parchee este error.

Exploit de referencia kpwn.c (publicado junto con este aviso):
task_struct (comm, cred, tasks, pid) recorriendo init_task, que a su vez se localiza mediante un escaneo de fuerza bruta del .data del kernel./sys/class/net/* para la primitiva de lectura./proc/kallsyms es legible, ~7600 IOCTLs cuando kptr_restrict=2 (ruta completa de escaneo de .data). Produce un shell root incondicionalmente en cada ejecución de prueba.# 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| Fecha | 2026-02-23 |