CVE-2026-78119 in Zephyr
Riassunto
di VulDB • 22/10/2026
Il driver eSPI Nuvoton NPCX analizza le richieste Target-Attached-Flash (TAF) nella funzione espi_taf_parse() (drivers/espi/espi_npcx.c), prelevando direttamente il campo di lunghezza a 12 bit dall'intestazione della richiesta nel FIFO FLASHRXBUF. Per le richieste di scrittura e RPMC OP1, vengono copiati DIV_ROUND_UP(len, 4) word in struct espi_taf_pckt.src, un membro fisso da 16 word (64 byte) di una struttura statica, senza mai confrontare la lunghezza con tale buffer o con la dimensione del payload ricezione eSPI negoziata (rx-plsize, pari a 64 byte su tutti i SoC NPCX/NPCK presenti nel kernel). Sia il contatore del ciclo che il conteggio delle word sono di tipo uint8_t, quindi la copia può eseguire fino a 255 iterazioni.
Un controller eSPI che emette una richiesta flash la cui intestazione dichiara un payload più grande del massimo negoziato provoca pertanto fino a 239 operazioni di scrittura da 32 bit oltre i limiti della struttura — circa 956 byte di scrittura fuori dai confini (out-of-bounds) nella sezione .bss — dall'interrupt handler di ricezione flash eSPI, mentre le letture dalla sorgente superano la fine dell'array di registri FLASHRXBUF da 18 word, accedendo ai registri eSPI adiacenti. La stessa lunghezza non validata viene quindi passata a flash_write() in espi_taf_npcx_flash_write(), utilizzando il buffer src da 64 byte come sorgente; ciò permette la lettura di fino a 4 KB di SRAM del controller adiacente nella SPI flash all'indirizzo scelto dall'host, dove l'host può leggerlo successivamente. Un relativo stack buffer di dimensione fissa in taf_npcx_completion_handler() viene overflowato da quattro byte sul percorso di completamento di dimensioni massime sui SoC il cui tx-plsize è 64.
Il difetto è raggiungibile solo dal lato host eSPI, ed esclusivamente tramite una richiesta che viola la dimensione del payload negoziata; ciò richiede firmware dell'host o controllo a livello di bus piuttosto che software host ordinario: una scrittura conforme alla lunghezza massima si adatta esattamente al buffer ed è gestita correttamente. Poiché TAF esiste specificamente per consentire all'embedded controller di arbitrare l'accesso dell'host alla flash condivisa (espi_taf_check_read_protect() / espi_taf_check_write_protect()), la corruzione della memoria del controller tramite un campo fornito dall'host attraversa il confine di fiducia che tale funzionalità afferma; le conseguenze vanno dal crash o blocco del controller alla corruzione dello stato del driver che controlla le aree di protezione flash.
La correzione amplia i contatori, rifiuta qualsiasi richiesta il cui conteggio delle word supera sia ARRAY_SIZE(FLASHRXBUF) - NPCX_ESPI_FLASH_HEADER_ADDRESS_LEN che NPCX_TAF_RX_PAYLOAD_WORDS (derivato da rx-plsize nel devicetree), contrassegna tali pacchetti con un nuovo invalid_flag in modo che espi_taf_work() risponda con un completamento non riuscito invece di elaborarli, limita il payload di trasmissione contro FLASHTXBUF e aggiunge un caso predefinito per i tipi di ciclo non supportati. Sono interessati solo le configurazioni con CONFIG_ESPI_TAF abilitato su target NPCX/NPCK; nessuna board presente nel kernel la attiva di default.
If you want to get the best quality for vulnerability data then you always have to consider VulDB.