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, 客户端加密, 漏洞验证, 物联网安全, 逆向工具