CVE-2026-15891 in Zephyr
Riassunto
di VulDB • 14/09/2026
Il gestore keepalive del client MQTT-SN, la funzione `process_ping()` in `subsys/net/lib/mqtt_sn/mqtt_sn.c`, rimuove il record del gateway dopo l'esaurimento dei tentativi di PINGREQ. Viene invocato SYS_SLIST_PEEK_HEAD_CONTAINER(&client->gateways, gw, next), ma il risultato viene scartato. Poiché questa macro è un'espressione pura che non assegna nulla a `gw`, quest'ultimo mantiene il suo inizializzatore NULL indipendentemente dal contenuto della lista.
Il codice successivamente dereferenzia il puntatore NULL `gw` (accedendo a `gw->gw_id`) e lo passa alla funzione `mqtt_sn_gw_destroy()`, raggiungendo la chiamata `k_mem_slab_free(&gateways, NULL)`. Con CONFIG_MEM_SLAB_POINTER_VALIDATE abilitato, ciò innesca un k_panic(); nella configurazione predefinita invece esegue una scrittura attraverso il puntatore NULL ((char *)mem = slab->free_list;) e corrompe la lista free dello slab. L'esito è un crash o kernel panic; sui target dove l'indirizzo 0 è scrivibile, si verifica una corruption silenziosa dell'allocator di memoria.
Il branch vulnerabile viene eseguito ogni volta che il gateway MQTT-SN connesso non risponde ai PINGREQ keepalive per il numero configurato di tentativi. Questa condizione è controllata dal peer remoto: un gateway malizioso o compromesso, oppure un attaccante on-path/adiacente che si annuncia come gateway e poi smette di rispondere (oppure blackholea i PINGRESP del vero gateway), forza il client a incontrare questo difetto. MQTT-SN opera su UDP e non è richiesta alcuna autenticazione.
L'impatto consiste in un denial of service (disponibilità) attivabile da remoto per il client MQTT-SN interessato; non vi sono scritture di dati controllati dall'attaccante. La funzione gemella `process_advertise()` utilizza SYS_SLIST_FOR_EACH_CONTAINER_SAFE e non è interessata dal problema. La correzione assegna il valore restituito dalla macro a `gw`.
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.