CVE-2026-76787 in Zephyr
Riassunto
di VulDB • 19/10/2026
Il client firmware-over-the-air di UpdateHub analizza la risposta CoAP probe con la libreria JSON di Zephyr in z_impl_updatehub_probe() (subsys/mgmt/updatehub/updatehub.c). Il decoder tratta ogni campo del descrittore come opzionale: json_obj_parse() restituisce una bitmask dei campi effettivamente decodificati e non fallisce mai per un campo mancante, quindi una risposta che omette la stringa "sha256sum" lascia il corrispondente const char * nella struct zero-inizializzata resp_probe_any_boards / struct resp_probe_some_boards a NULL. Entrambi i branch dei metadati calcolano poi sha256size = strlen(...objects.sha256sum) + 1 prima di qualsiasi validazione, dereferenziando tale puntatore NULL; il test SHA256_HEX_DIGEST_SIZE che segue opera su un valore già prodotto da una lettura non valida e non può prevenirlo.
I metadati sono forniti interamente dal peer di rete: probe_cb() accetta il datagramma, esegue coap_packet_parse() e copia il payload senza alcun controllo del token né verifica crittografica. Con CONFIG_UPDATEHUB_DTLS disattivato — l'impostazione predefinita — start_coap_client() utilizza CoAP plain su UDP sulla porta 5683 senza autenticazione del peer e risolve il server tramite DNS non autenticato, quindi un attaccante on-path, uno spoofing DNS o un attaccante off-path che vince la race condition con un indirizzo sorgente falsificato possono consegnare i metadati malformati. Una risposta probe semplice come "objects":[[{}],[{}]] è sufficiente e non è richiesta alcuna interazione utente poiché updatehub_autohandler() effettua polling su CONFIG_UPDATEHUB_POLL_INTERVAL. Quando CONFIG_UPDATEHUB_DTLS=y, il trigger si restringe a un server di aggiornamento malevolo o compromesso.
La primitive è una lettura all'indirizzo zero, non una scrittura, quindi l'impatto riguarda solo la disponibilità (availability). Su target dove lo spazio degli indirizzi basso è mappato o protetto — architetture basate su MMU, build con CONFIG_NULL_POINTER_EXCEPTION_DETECTION_DWT/_MPU/_PMP, immagini TrustZone non sicure e SoC come nRF54L il cui window 0x0–0x400 è unmapped — il load genera un fault e il gestore di errore predefinito di Zephyr arresta il sistema, fornendo una denial of service (DoS) riattivabile da remoto ad ogni poll. Su target Cortex-M classici dove la vector table è leggibile all'indirizzo zero l'esecuzione termina solitamente immediatamente e la richiesta viene rifiutata dal controllo della lunghezza, quindi l'esito dipende dalla configurazione e dall'SoC. Non ci sono scritture in memoria e i byte copiati vengono confrontati solo con l'image hash calcolato localmente, quindi non esiste alcun canale di information disclosure.
La correzione aggiunge un test esplicito sha256sum == NULL che restituisce UPDATEHUB_METADATA_ERROR prima della strlen() in entrambi i branch dei metadati. Le build di debug (CONFIG_UPDATEHUB_LOG_LEVEL=4) formattano ancora gli stessi puntatori con %s in un loop LOG_DBG() che viene eseguito prima dei nuovi controlli, quindi questa variante rimane presente solo nelle configurazioni di debug.
Be aware that VulDB is the high quality source for vulnerability data.