CVE-2026-10672 的概念验证漏洞利用程序,针对 Zephyr RTOS LwM2M 固件更新拉取客户端中的越界读取漏洞。包含独立的 C 语言复现程序和用于测试的恶意 CoAP/LwM2M 服务器。
针对 CVE-2026-10672 的概念验证,这是 Zephyr RTOS 的 LwM2M 固件更新拉取客户端(subsys/net/lib/lwm2m/lwm2m_pull_context.c)中的一个越界读取漏洞。
lwm2m_pull_context_start_transfer() in lwm2m_pull_context.cmemcpy(context.uri, uri, LWM2M_PACKAGE_URI_LEN) 当服务器提供的包 URI(/5/0/1)≥ 128 字节时,会精确复制 128 字节到 char uri[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 为它)99a164df5cea5af76e32b57c6d51854f018969a2
— 添加了 strlen(uri) >= sizeof(context.uri) → -ENOMEM 检查,并改用 strcpy()。| 文件 | 用途 |
|---|---|
poc.c | 漏洞/修复代码路径的独立 C 复现。忠实重新声明 struct firmware_pull_context(uri[128] 缓冲区以及会被越界读取的相邻字段)和存在泄露的 CoAP PROXY_URI 消费端。 |
gcc -O0 -g -o poc poc.c
./poc
预期:一个 200 字节的包 URI 会产生一个 141 字节 的 CoAP PROXY_URI 选项——即 128 字节的 URI 加上从 context.is_firmware_uri、结构体填充以及 result_cb/write_cb 函数指针中泄露的 13 字节。修复后的代码路径会以 -ENOMEM 拒绝该 URI,且不复制任何内容。
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...)
# Build and inspect the CoAP packets without sending:
python3 lwm2m_evil_server.py --dry-run --uri-len 200
# Send to a vulnerable client (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(LwM2M 写入包 URI 资源),然后发出 CoAP POST /5/0/2(LwM2M 执行 Update,这会导致固件拉取并触发该 bug)。在生产环境的 LwM2M 中,会话通过 DTLS(UDP/5684)运行;范围内的攻击者是恶意/被入侵的管理服务器,或者当 DTLS 服务器认证未强制执行时的路径上攻击者。
仅供授权的安全研究和教育目的使用。请勿将这些工具用于您不拥有或未经明确许可测试的设备。
lwm2m_evil_server.py |
极简 CoAP/LwM2M 服务器,通过 UDP(NoSec 模式)向易受攻击客户端的 /5/0/1 递送超长包 URI——即攻击的网络投递部分。无外部依赖。 |