
Exploit proof-of-concept per CVE-2026-10672, una lettura fuori dai limiti nel client pull di aggiornamento firmware LwM2M di Zephyr RTOS. Include una riproduzione C standalone e un server CoAP/LwM2M dannoso per i test.
Proof of concept per CVE-2026-10672, una lettura fuori dai limiti (out-of-bounds read) nel client di pull per l'aggiornamento firmware LwM2M di Zephyr RTOS (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) copia esattamente 128 byte in char uri[128] senza terminatore NUL quando l'URI del pacchetto fornito dal server (/5/0/1) è ≥ 128 byte. Le successive strlen(context.uri), http_parser_parse_url() e l'opzione CoAP PROXY_URI leggono oltre il buffer nella memoria adiacente della struct (is_firmware_uri, i puntatori a funzione result_cb / write_cb e il contesto di connessione DTLS). I byte letti oltre i limiti vengono esfiltrati nella richiesta CoAP in uscita.context.uri[128] (CONFIG_LWM2M_SWMGMT_PACKAGE_URI_LEN, default 128; LWM2M_PACKAGE_URI_LEN è definita con #define a tale valore)99a164df5cea5af76e32b57c6d51854f018969a2
— aggiunge strlen(uri) >= sizeof(context.uri) → -ENOMEM e passa a strcpy().| File | Scopo |
|---|---|
poc.c |
gcc -O0 -g -o poc poc.c
./poc
Previsto: un URI del pacchetto di 200 byte produce un'opzione CoAP PROXY_URI di 141 byte
— l'URI di 128 byte più 13 byte persi (leaked) da context.is_firmware_uri,
dal padding della struct e dai puntatori a funzione result_cb/write_cb. Il percorso
di codice corretto rifiuta l'URI con -ENOMEM e non copia nulla.
gcc -O0 -g -fsanitize=address -o poc-asan poc.c
./poc-asan
La sonda alloca esattamente 128 byte, li riempie con byte non NUL (rispecchiando un
context.uri completo senza terminatore) e chiama 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
Lo script invia una PUT CoAP /5/0/1 (scrittura LwM2M della risorsa Package URI)
seguita da una POST CoAP /5/0/2 (esecuzione LwM2M di Update, che
avvia il pull del firmware e innesca il bug). In produzione la sessione LwM2M
avviene su DTLS (UDP/5684); l'attaccante in questione è un server di gestione
malintenzionato o compromesso, oppure un avversario sul percorso (on-path) quando
l'autenticazione del server DTLS non è applicata.
Solo per ricerca di sicurezza autorizzata e scopi educativi. Non utilizzare questi strumenti contro dispositivi che non possiedi o per i quali non hai esplicito permesso di test.
Riproduzione C autonoma dei percorsi di codice vulnerabile/corretto. Ridichiara fedelmente struct firmware_pull_context (il buffer uri[128] più i campi adiacenti che subiscono la lettura oltre i limiti) e il consumer CoAP PROXY_URI che perde dati. |
lwm2m_evil_server.py | Server CoAP/LwM2M minimale che fornisce l'URI del pacchetto sovradimensionato a /5/0/1 di un client vulnerabile su UDP (modalità NoSec) — la parte di consegna di rete dell'attacco. Nessuna dipendenza esterna. |