CVE-2026-87043 in Zephyrinformazioni

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.

Responsabile

Zephyr

Prenotare

08/09/2026

Divulgazione

04/11/2026

Moderazione

accettato

EPSS

0.00000

KEV

no

Attività

molto basso

Fonti

Do you want to use VulDB in your project?

Use the official API to access entries easily!