Realtek rtl819x 非主线(out-of-tree)“Jungle SDK” 中的 rtl8192cd Wi-Fi 内核驱动程序暴露了两个 IOCTL —— write_mem(0x89F5)和 read_mem(0x89F6),且没有任何访问控制检查。任何能够打开由该驱动程序支持的无线网络接口的本地用户,都可以读取或写入任意内核虚拟内存,从而直接获取 root 权限。
这些处理程序由 8192cd_cfg.h 中的 _IOCTL_DEBUG_CMD_ 控制,而该宏是无条件定义的(没有 #ifdef DEBUG),因此调试命令集会被编译进所有生产构建中。
一个参考漏洞利用程序(kpwn)可以从非特权 shell 获得 uid=0,且零硬编码地址 —— task_struct 布局和 init_task 位置均在运行时自动检测,因此可跨内核版本和 OEM 构建移植。
该漏洞位于 Realtek rtl819x Jungle SDK 内核 Wi-Fi 驱动程序中,涉及直至 v3.4.14B 的所有已知版本。披露时没有修复。主线 Linux 的 rtlwifi / rtw88 / rtw89 是不同的代码库,不受影响。
共享驱动核心会编译为多种变体(rtl8192cd、rtl8192es、rtl8192ee、rtl8192fe、rtl8188ee 等)。任何包含该 Wi-Fi 驱动程序的 Jungle SDK 构建均受影响。
Realtek Jungle SDK 根据 OEM 合同被广泛再分发。CVE-2021-35395 厂商列表中记录的厂商(该 CVE 针对同一 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 |
| 模块 | rtl8192es.ko |
已确认:向模块 .bss 写入 0xDEADBEEF,并回读和恢复;通过 init_task 遍历和凭据覆盖,从非特权 shell 实现从 uid=1000 到 uid=0 的完整 LPE(本地权限提升)。
在 8192cd_cfg.h 中:
#define _IOCTL_DEBUG_CMD_
未由 #ifdef DEBUG 控制。调试命令集随每个生产构建发布。
驱动程序的 rtl_ioctl() 分发器将 0x89F5 和 0x89F6(位于无线驱动程序用于厂商扩展的标准 SIOCDEVPRIVATE+5/+6 私有 IOCTL 范围内)路由到 write_mem 和 read_mem。这些处理程序解析用户提供的字符串:
dw,<addr>,<count> —— 从内核虚拟地址 addr 读取 count 个 32 位字dw,<addr>,<count>,<value> —— 将 value 的 count 个 32 位字写入 addr地址使用 _atoi(base 16) 解析,然后通过 memcpy() 直接作用于内核虚拟地址空间,结果再通过 copy_to_user() 返回。这里存在:
capable() 检查access_ok() 检查.bss 中一个 2000 字节的全局缓冲区(tmpbuf1)读取原语每次调用限制为 128 字节;写入原语接受任意长度。
同样的访问控制缺陷也适用于调试命令集中的其他处理程序(通过 0x89F3/0x89F4/0x89F8–0x89FD 读写硬件寄存器、通过 0x89F1 写 MIB、eFuse 读写、制造测试模式)。它们可通过相同的代码路径访问,任何修补此漏洞的人都应对其进行全面审计。

参考漏洞利用程序 kpwn.c(随本公告一并发布):
init_task 自动检测 task_struct 偏移量(comm、cred、tasks、pid),而 init_task 本身通过对内核 .data 的暴力扫描定位。/sys/class/net/* 读取原语,自动检测存在漏洞的接口。/proc/kallsyms 可读时只需 44 次 IOCTL,当 kptr_restrict=2 时约 7600 次 IOCTL(完整 .data 扫描路径)。在每次测试运行中都能无条件获得 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)
| 日期 | 2026-02-23 |