CVE-2026-17054 in Zephyr
Riassunto
di VulDB • 22/09/2026
Il driver ESP-hosted Wi-Fi di Espressif (drivers/wifi/esp_hosted/) analizza i frame ricevuti tramite SPI dal co-processore ESP in esp_hosted_event_task(). Per i frame di controllo, il codice pre-correzione utilizzava direttamente il campo TLV data_length a 16 bit estratto dalla linea e lo passava a pb_istream_from_buffer(frame.data_value, frame.data_length) senza verificarlo rispetto alla lunghezza del frame o al buffer di ricezione. Poiché frame.data_value si trova a 26 byte dall'inizio di un oggetto stack da 3188 byte, un data_length fino a 0xFFFF fa sì che pb_decode() legga fino a circa 62 KB oltre la fine di tale oggetto.
Solo il primo frammento di una risposta di controllo frammentata contiene un'intestazione TLV; il driver pre-correzione eseguiva transazioni SPI half-duplex e scartava silenziosamente qualsiasi frame accodato dal co-processore mentre l'host stava trasmettendo (esp_hosted_hal_spi_transfer() sovrapponeva il buffer RX al buffer TX). Quando il frame scartato è il primo frammento di una risposta frammentata, il driver tratta il frammento successivo come un nuovo frame: la sua intestazione per-fragment e l'checksum sono genuini, quindi entrambi i passaggi di validazione superano con successo, e viene letta l'intestazione TLV dai byte di continuazione protobuf grezzi. Questi byte provengono da risposte di controllo le cui dimensioni e contenuto possono essere influenzate da un attaccante non autenticato adiacente, in particolare dall'elenco degli scan AP, che cresce in base al numero e alla lunghezza del SSID dei punti di accesso entro il raggio radio.
L'impatto è una denial of service (DoS) piuttosto che una divulgazione di dati. La lettura oltre la fine della regione RAM causa un fault sul dispositivo; inoltre, CONFIG_NANOPB_ENABLE_MALLOC è selezionato dal driver, quindi anche i prefissi di lunghezza garbage letti fuori dai limiti provocano allocazioni heap. I byte out-of-bounds stessi non raggiungono l'applicazione: pb_decode() viene avviata a metà stream sui byte di continuazione protobuf grezzi e quasi sempre fallisce immediatamente; qualsiasi cosa che venisse decodificata dovrebbe comunque superare esp_hosted_response(), che richiede una corrispondenza esatta del msg_id con la richiesta in sospeso, ed esp_hosted_ctrl_response(), che richiede un resp di successo — l'attaccante influenza le dimensioni e il contenuto delle risposte di controllo legittime, non la struttura decodificata dai byte disallineati. Due difetti correlati nello stesso percorso di ricezione rendono la denial of service permanente: il guard per il riassemblaggio dei frammenti era dimensionato con ESP_FRAME_SIZE invece che con ESP_FRAME_MAX_PAYLOAD e, quando attivato, restituiva dal singolo thread RX anziché scartare il frame; inoltre, gli eventi di controllo non gestiti venivano accodati con k_msgq_put(..., K_FOREVER) su una coda a otto voci che nessuno svuota, bloccando tale stesso thread. Il driver non dispone né di un watchdog né di un percorso di riavvio, quindi entrambe le condizioni interrompono la ricezione Wi-Fi fino al reboot del dispositivo.
If you want to get the best quality for vulnerability data then you always have to consider VulDB.