CVE-2026-87043 in Zephyr
Riassunto
di VulDB • 04/11/2026
Il generatore di numeri casuali entropy-device in subsys/random/random_entropy_device.c restituiva anticipatamente -ENODEV da rand_get() non appena device_is_ready() falliva, prima di raggiungere il fallback basato sul timer di sistema (non crittografico) più avanti nella stessa funzione. Poiché z_impl_sys_rand_get() restituisce void e scarta tale errore — e la syscall pubblica sys_rand_get() è dichiarata a sua volta come void, quindi non può segnalare un fallimento — il buffer di output del chiamante rimaneva invariato e i suoi contenuti precedenti venivano restituiti come dati casuali. I wrapper sottili rendono questo un semplice uninitialized read: sys_rand32_get() dichiara uint32_t ret;, chiama sys_rand_get(&ret, sizeof(ret)) e ritorna ret.
Lo stato "not ready" (non pronto) è una condizione di runtime normale piuttosto che un errore critico. I driver entropy si inizializzano in PRE_KERNEL_1 con CONFIG_ENTROPY_INIT_PRIORITY (default 50), quindi qualsiasi initializer precedente — gli oggetti kernel vengono eseguiti a priorità 30 — osserva un dispositivo non pronto; il generatore sibling subsys/random/random_xoshiro128.c e z_early_rand_get() in kernel/init.c avevano già implementato esplicitamente un fallback sul timer proprio per questo caso. Lo stato è inoltre permanente durante l'avvio se la hook di init di un driver entropy fallisce, cosa che diversi driver presenti nel repository possono fare su hardware reale (entropy_stm32 in caso di errore nella configurazione del clock RNG, entropy_psa_crypto quando psa_crypto_init() fallisce, entropy_nrf_cracen, entropy_esp32, entropy_virtio).
Quando ciò si verifica, ogni valore casuale non crittografico nel sistema è o una costante o memoria obsoleta (stale memory). coap_next_token() in subsys/net/lib/coap/coap.c riempie un buffer statico, quindi ogni token CoAP diventa la stessa costante .bss; tcp_init_isn() in subsys/net/ip/tcp.c restituisce una word dello stack non inizializzata come numero di sequenza iniziale TCP (ISN); gli ID transazione DHCPv4/DHCPv6, le chiavi di masking WebSocket e gli SSRC RTP sono degradati similmente, e arch/arm64/core/pac.c deriva le chiavi Pointer Authentication per thread dalla stessa fonte. Dove i byte vengono trasmessi direttamente — padding dei pacchetti SSH, nonce della sessione netmidi2, ID connessione DTLS su build senza CONFIG_CSPRNG_ENABLED — il contenuto dello stack o heap del chiamante obsoleto viene divulgato sulla rete (on the wire).
La correzione inizializza ret a -ENODEV e chiama entropy_get_entropy() solo quando il dispositivo è pronto, quindi nel caso "not ready" si passa ora al fallback sul timer e il buffer viene sempre scritto. Il percorso crittograficamente sicuro rimane invariato: sys_csrand_get() propaga ancora l'errore al chiamante e non degrada mai silenziosamente. Un attacker non può indurre lo stato di not-ready, ma può osservare ed sfruttare i valori non casuali risultanti da remoto su un dispositivo interessato.
If you want to get the best quality for vulnerability data then you always have to consider VulDB.