totekuh/CVE-2026-36355
GitHub: totekuh/CVE-2026-36355
这是一个针对 Realtek rtl819x Jungle SDK Wi-Fi 驱动程序的本地提权漏洞,可通过调试 IOCTL 未授权读写内核内存获取 root 权限。
Stars: 0 | Forks: 0
# CVE-2026-36355: Realtek rtl819x Jungle SDK - 通过调试 IOCTL 进行未经身份验证的内核内存读写
- **CVE**: CVE-2026-36355
- **CWE**: CWE-782, CWE-787, CWE-200
- **发现者**: Daniil Gordeev
- **披露日期**: 2026-05-03
## 概述
`rtl8192cd` Wi-Fi 内核驱动程序在 Realtek rtl819x 外部"Jungle SDK"中暴露了两个 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 漏洞列表(针对同一 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` |
| 日期 | 2026-02-23 |
已确认:向模块 `.bss` 写入 `0xDEADBEEF` 并读取验证和恢复;通过 `init_task` 遍历和凭证覆盖,从 `uid=1000` 到 `uid=0` 的完整本地提权,来自非特权 shell。
## 技术细节
### 根本原因
在 `8192cd_cfg.h` 中:
```
#define _IOCTL_DEBUG_CMD_
```
未通过 `#ifdef DEBUG` 进行门控。调试命令集在每个生产版本中都包含。
### 存在漏洞的处理程序
驱动程序的 `rtl_ioctl()` 分发器将 `0x89F5` 和 `0x89F6`(无线驱动程序用于供应商扩展的标准 `SIOCDEVPRIVATE+5/+6` 私有 IOCTL 范围)路由到 `write_mem` 和 `read_mem`。处理程序解析用户提供的字符串:
- 读取:`dw,,` — 从内核虚拟地址 `addr` 读取 `count` 个 32 位字
- 写入:`dw,,,` — 将 `count` 个 32 位字的 `value` 写入 `addr`
地址使用 `_atoi(基数 16)` 解析,传递给 `memcpy()` 对抗内核虚拟地址空间,结果通过 `copy_to_user()` 返回。存在:
- 无 `capable()` 检查
- 无 `capable()` 检查
- 无地址的 `access_ok()` 检查
- 无地址范围的边界检查
- 无锁定 — 调试命令集中的所有 59 个 IOCTL 共享 `.bss` 中的单个 2000 字节全局缓冲区(`tmpbuf1`)
每次调用的读取原语上限为 128 字节;写入原语接受任意长度。
其他调试命令集中的处理程序也存在相同的访问控制漏洞(通过 `0x89F3`/`0x89F4`/`0x89F8`–`0x89FD` 进行硬件寄存器读写,通过 `0x89F1` 进行 MIB 写入,eFuse 读写,制造测试模式)。它们可通过相同代码路径访问,任何修补此漏洞的人都应进行全面审计。
## 概念验证

参考漏洞利用程序 `kpwn.c`(与本公告一同发布):
- 以任何非特权用户运行,无需 root。
- 通过遍历 `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)
```
标签:0day挖掘, CVE-2026-36355, CWE-200, CWE-782, CWE-787, debug ioctl, exploit, IoT漏洞, Jungle SDK, Realtek, root, rtl819x, Web报告查看器, Wi-Fi驱动漏洞, 内存读写漏洞, 内核安全, 内核漏洞, 协议分析, 安全渗透, 客户端加密, 嵌入式安全, 未认证访问, 本地提权, 权限提升, 驱动安全