CVE-2026-19571 in Zephyr
Riassunto
di VulDB • 09/10/2026
Il backend del comando host ITE IT8xxx2 SHI (subsys/mgmt/ec_host_cmd/backends/ec_host_cmd_backend_shi_ite.c) copiava l'intestazione della richiesta di 8 byte dal FIFO Rx SPI direttamente nel buffer di ricezione condiviso data->in_msg e solo in seguito verificava la versione del protocollo e la lunghezza derivata del pacchetto. Il gestore delle interruzioni accettava anche un'asserzione dello slave select (chip-select) e un'interruzione RVLI (Rx-valid-length) in qualsiasi stato del driver diverso da SHI_STATE_DISABLED, consentendo così l'analisi di una nuova intestazione mentre il thread dei comandi host stava ancora elaborando la richiesta precedente dallo stesso identico buffer.
Il processore host è il controller SPI e gestisce sia lo slave select che il clock. Dopo aver inviato una richiesta ben formata, può immediatamente de-asserire lo slave select — restituendo il driver allo stato pronto (ready) e riabilitando il FIFO — e avviare una seconda transazione contenente un'intestazione con data_len = 0xFFFF. Questi otto byte vengono scritti in in_msg prima che la lunghezza eccessiva venga rifiutata, finendo così in un buffer i cui contenuti sono già stati validati da verify_rx() in subsys/mgmt/ec_host_cmd/ec_host_cmd_handler.c. Se ciò avviene nella finestra temporale precedente l'esecuzione di args.input_buf_size = rx_header->data_len da parte del thread dei comandi host, il framework fornisce al gestore del comando registrato una lunghezza di input di 65535 byte su un buffer di sole 256 byte.
Il risultato è una lettura fuori dai limiti (out-of-bounds) fino a circa 64 KiB oltre il buffer della richiesta: i gestori dei comandi che copiano o ripetono input_buf_size byte rivelano la memoria adiacente del controller embedded al processore host oppure causano un overflow del buffer di risposta, mentre una lettura oltre la fine della SRAM provoca un fault nel controller. La stessa condizione di gara consente anche lo scambio tra cmd_id e cmd_ver dopo la verifica del checksum e dopo la ricerca del gestore. Lo sfruttamento richiede la capacità di pilotare il bus inter-processore SHI (un sistema operativo host compromesso o l'accesso fisico alle linee SPI) e di vincere una race condition temporale, che il controller SPI può tentare indefinitamente.
La correzione analizza l'intestazione in una struct locale ec_host_cmd_request_header e la copia in in_msg solo dopo che la lunghezza è stata limitata da sizeof(data->in_msg), ignorando le interruzioni di chip-select e RVLI al di fuori degli stati SHI_STATE_READY_TO_RECV/SHI_STATE_RECEIVING. Rimane una race condition residua, ma contenuta: un'interruzione di fine transazione reimposta ancora lo stato a ready mentre il thread dei comandi host possiede il buffer, consentendo così a una seconda richiesta valida di sovrascrivere i contenuti della richiesta in corso d'elaborazione, a differenza del backend NPCX che rimane bloccato in SHI_STATE_CNL_RESP_NOT_RDY mentre il buffer è in uso.
If you want to get the best quality for vulnerability data then you always have to consider VulDB.