
CVE-2026-10672에 대한 개념 증명 익스플로잇으로, Zephyr RTOS LwM2M 펌웨어 업데이트 풀 클라이언트의 out-of-bounds read(경계를 벗어난 읽기) 취약점입니다. 독립형 C 재현 코드와 테스트용 악성 CoAP/LwM2M 서버를 포함합니다.
CVE-2026-10672에 대한 개념 증명(PoC)으로, Zephyr RTOS의 LwM2M 펌웨어 업데이트 풀 클라이언트(subsys/net/lib/lwm2m/lwm2m_pull_context.c)에서 발생하는 범위를 벗어난 읽기(out-of-bounds read)입니다.
lwm2m_pull_context.c의 lwm2m_pull_context_start_transfer()memcpy(context.uri, uri, LWM2M_PACKAGE_URI_LEN)는 서버가 제공한 Package URI(/5/0/1)가 128바이트 이상일 때 char uri[128]에 NUL 종결자 없이 정확히 128바이트를 복사합니다. 이후 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 소비자 코드를 충실히 재선언합니다. |
gcc -O0 -g -o poc poc.c
./poc
예상 결과: 200바이트 Package 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(Package URI 리소스에 대한 LwM2M Write)을 보낸 다음 CoAP POST /5/0/2(LwM2M Execute Update, 펌웨어 풀을 시작하여 버그를 유발함)을 보냅니다. 실제 LwM2M 환경에서는 세션이 DTLS(UDP/5684)를 통해 실행되며, 공격 범위에 해당하는 대상은 악의적/손상된 관리 서버이거나, DTLS 서버 인증이 적용되지 않는 경우 경로상(on-path) 공격자입니다.
승인된 보안 연구 및 교육 목적으로만 사용하십시오. 소유하지 않았거나 테스트에 대한 명시적 허가를 받지 않은 기기에 이러한 도구를 사용하지 마십시오.
PROXY_URIlwm2m_evil_server.py | 취약한 클라이언트의 /5/0/1에 UDP(NoSec 모드)로 과대 크기의 Package URI를 전달하는 최소한의 CoAP/LwM2M 서버입니다. 공격의 네트워크 전달 부분을 담당합니다. 외부 의존성이 없습니다. |