
CVE-2026-36355: Realtek rtl819x Jungle SDK - Leitura/Gravação de Memória do Kernel Não Autenticada via ioctls de Depuração
O driver de kernel Wi-Fi rtl8192cd no "Jungle SDK" fora da árvore do Realtek rtl819x expõe dois IOCTLs — write_mem (0x89F5) e read_mem (0x89F6) — sem verificações de controle de acesso. Qualquer usuário local capaz de abrir uma interface de rede sem fio baseada no driver pode ler ou escrever memória virtual arbitrária do kernel, levando diretamente ao root.
Os manipuladores são condicionados por _IOCTL_DEBUG_CMD_ em 8192cd_cfg.h, que é definido incondicionalmente (sem #ifdef DEBUG), então o conjunto de comandos de depuração é compilado em todas as versões de produção.
Um exploit de referência (kpwn) alcança uid=0 a partir de um shell sem privilégios, com zero endereços codificados — o layout de task_struct e a localização de init_task são ambos detectados automaticamente em tempo de execução, tornando-o portátil entre versões de kernel e compilações OEM.
A vulnerabilidade reside no driver de kernel Wi-Fi Realtek rtl819x Jungle SDK, em todas as versões conhecidas até v3.4.14B. Nenhuma correção no momento da divulgação. Os drivers principais do Linux rtlwifi / rtw88 / rtw89 são bases de código diferentes e não são afetados.
O núcleo compartilhado do driver é compilado em múltiplas variantes (rtl8192cd, rtl8192es, rtl8192ee, rtl8192fe, rtl8188ee, etc.). Qualquer compilação do Jungle SDK que inclua o driver Wi-Fi é afetada.
O Realtek Jungle SDK é amplamente redistribuído sob contratos OEM. Os fornecedores documentados na lista de fornecedores do CVE-2021-35395 (que visava um componente diferente, em espaço de usuário, do mesmo SDK) incluem D-Link, TOTOLINK, Tenda, NEC, I-O DATA, Elecom, Buffalo, Humax, H3C e IP-COM. Se cada linha de produto específica inclui o driver de kernel vulnerável requer inspeção da liberação de código-fonte GPL por produto; este aviso não afirma isso sem verificação independente.
| Dispositivo | Ortel 4G LTE CPE (OEM: MeiG Smart FORGE_SLT711) |
| SoC | Qualcomm MDM9607, ARMv7 Cortex-A7 |
| Kernel | Linux 3.18.48 |
| Módulo |
Confirmado: escrita de 0xDEADBEEF no .bss do módulo com leitura de volta e restauração; LPE completo de uid=1000 para uid=0 através de caminhada em init_task e sobrescrita de credenciais, a partir de um shell sem privilégios.
Em 8192cd_cfg.h:
#define _IOCTL_DEBUG_CMD_
Não condicionado por #ifdef DEBUG. O conjunto de comandos de depuração é enviado em todas as versões de produção.
O despachante rtl_ioctl() do driver roteia 0x89F5 e 0x89F6 (no intervalo padrão de IOCTL privado SIOCDEVPRIVATE+5/+6 usado por drivers sem fio para extensões de fornecedor) para write_mem e read_mem. Os manipuladores analisam uma string fornecida pelo usuário:
dw,<addr>,<count> — lê count palavras de 32 bits do endereço virtual do kernel addrdw,<addr>,<count>,<value> — escreve count palavras de 32 bits de value em addrO endereço é analisado com _atoi(base 16), passado para memcpy() contra o espaço de endereço virtual do kernel, e o resultado é copiado de volta via copy_to_user(). Existe:
capable()access_ok() no endereçotmpbuf1) no .bssA primitiva de leitura é limitada a 128 bytes por chamada; a primitiva de escrita aceita comprimento arbitrário.
A mesma lacuna de controle de acesso se aplica a outros manipuladores no conjunto de depuração (leitura/escrita de registros de hardware via 0x89F3/0x89F4/0x89F8–0x89FD, escritas MIB via 0x89F1, leitura/escrita de eFuse, modo de teste de fabricação). Eles são acessíveis pelo mesmo caminho de código e merecem uma auditoria completa por qualquer pessoa que corrija este bug.

Exploit de referência kpwn.c (publicado junto com este aviso):
task_struct (comm, cred, tasks, pid) percorrendo init_task, que é localizado por varredura de força bruta do .data do kernel./sys/class/net/* pela primitiva de leitura./proc/kallsyms é legível, ~7600 IOCTLs quando kptr_restrict=2 (caminho de varredura completa do .data). Produz um shell root incondicionalmente em cada execução de teste.# 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| Data | 2026-02-23 |