Hunt-Benito/zephyr-lwm2m-firmware-update-oob-read-cve-2026-10672-truncated-package-uri
GitHub: Hunt-Benito/zephyr-lwm2m-firmware-update-oob-read-cve-2026-10672-truncated-package-uri
针对 Zephyr RTOS LwM2M 固件更新越界读取漏洞(CVE-2026-10672)的概念验证项目,包含 C 语言漏洞复现代码和 Python CoAP 恶意服务器。
Stars: 0 | Forks: 0
# CVE-2026-10672 — Zephyr LwM2M 固件更新越界读取 PoC
针对 **CVE-2026-10672** 的概念验证,这是 Zephyr RTOS 的
LwM2M 固件更新拉取客户端(`subsys/net/lib/lwm2m/lwm2m_pull_context.c`)中的一个越界读取漏洞。
## 漏洞
- **CVE**: CVE-2026-10672
- **CVSS**: 8.2 高危 (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:L)
- **CWE**: CWE-125 (越界读取)
- **组件**: `lwm2m_pull_context.c` 中的 `lwm2m_pull_context_start_transfer()`
- **根本原因**: 当服务器端提供的 Package URI (`/5/0/1`) ≥ 128 字节时,`memcpy(context.uri, uri, LWM2M_PACKAGE_URI_LEN)` 会精确地
向 `char uri[128]` 拷贝 128 字节,且不包含 NUL 终止符。随后的 `strlen(context.uri)`、
`http_parser_parse_url()` 以及 CoAP `PROXY_URI` 选项的追加操作会导致读取越过
缓冲区边界,进入相邻的结构体内存(`is_firmware_uri`、`result_cb` /
`write_cb` 函数指针,以及 DTLS 连接上下文)。越界读取的字节会随出站的 CoAP 请求泄露。
- **缓冲区**: `context.uri[128]` (`CONFIG_LWM2M_SWMGMT_PACKAGE_URI_LEN`,默认值为 128;
`LWM2M_PACKAGE_URI_LEN` 被 `#define` 为该值)
- **受影响版本**: Zephyr v3.0.0 到 v4.4.0(引入该拷贝操作的 pull-context 重构
首次发布于 v3.0.0)
- **已修复版本**: Zephyr v4.4.1 和 v4.3.1
- **修复提交**: [`99a164df5cea5af76e32b57c6d51854f018969a2`](https://github.com/zephyrproject-rtos/zephyr/commit/99a164df5cea5af76e32b57c6d51854f018969a2)
— 添加了 `strlen(uri) >= sizeof(context.uri)` → `-ENOMEM` 判断,并切换为使用 `strcpy()`。
## 目录
| 文件 | 用途 |
|---|---|
| `poc.c` | 独立的 C 语言漏洞复现/修复代码路径。如实重新声明了 `struct firmware_pull_context`(包含 `uri[128]` 缓冲区及其相邻的被越界读取的字段)以及存在泄露的 CoAP `PROXY_URI` 使用者。 |
| `lwm2m_evil_server.py` | 最小化的 CoAP/LwM2M 服务器,通过 UDP (NoSec 模式) 向易受攻击的客户端的 `/5/0/1` 发送超大 Package URI —— 即攻击的网络投递部分。无外部依赖。 |
## 构建并运行 C 语言复现代码
```
gcc -O0 -g -o poc poc.c
./poc
```
预期结果:一个 200 字节的 Package URI 会生成一个大小为 **141 字节** 的 CoAP `PROXY_URI` 选项
—— 即 128 字节的 URI 加上从 `context.is_firmware_uri`、
结构体填充 (padding) 以及 `result_cb`/`write_cb` 函数指针中泄露的 **13 字节**。修复后的代码路径会以 `-ENOMEM` 拒绝该 URI,并且不进行任何拷贝。
### ASan 验证
```
gcc -O0 -g -fsanitize=address -o poc-asan poc.c
./poc-asan
```
探测程序精确分配了 128 字节,用非 NUL 字节填充(模拟一个填满且没有终止符的
`context.uri`),并调用 `strlen()`:
```
ERROR: AddressSanitizer: heap-buffer-overflow
READ of size 129 at 0x...
0x... is located 0 bytes after 128-byte region [...,0x...)
```
## 运行恶意的 LwM2M 服务器
```
# 构建并检查 CoAP 数据包而不发送:
python3 lwm2m_evil_server.py --dry-run --uri-len 200
# 发送至易受攻击的客户端(NoSec CoAP, UDP/5683):
python3 lwm2m_evil_server.py --target 10.0.0.42 --port 5683 --uri-len 200 --listen 2
```
该脚本会发送一个 CoAP **PUT `/5/0/1`** 请求(即对 Package URI 资源进行 LwM2M Write 操作),
随后发送一个 CoAP **POST `/5/0/2`** 请求(即 LwM2M Execute *Update*,这将
启动固件拉取并触发该漏洞)。在实际生产环境的 LwM2M 中,会话通过
DTLS (UDP/5684) 进行;此攻击场景中的攻击者是恶意的/被攻破的管理服务器,
或者在未强制执行 DTLS 服务器身份验证时的路径内中间人 (on-path adversary)。
## 完整文章
https://www.hunt-benito.com/blog/zephyr-lwm2m-firmware-update-oob-read-cve-2026-10672-truncated-package-uri/
## 免责声明
仅供授权的安全研究和教育目的使用。请勿将这些工具用于您不拥有或未获得明确测试许可的设备。
标签:CWE-125, LwM2M, Maven, Zephyr RTOS, 客户端加密, 漏洞验证, 物联网安全, 逆向工具