CVE-2026-78119 in Zephyr
Sumário
de VulDB • 21/10/2026
O driver eSPI Nuvoton NPCX analisa as solicitações de Target-Attached-Flash (TAF) em espi_taf_parse() (drivers/espi/espi_npcx.c), obtendo o campo de comprimento de 12 bits diretamente do cabeçalho da solicitação no FIFO FLASHRXBUF. Para solicitações de escrita e RPMC OP1, ele copia DIV_ROUND_UP(len, 4) palavras para struct espi_taf_pckt.src, um membro fixo de 16 palavras (64 bytes) de uma estrutura estática, sem jamais comparar o comprimento com esse buffer ou com o tamanho da carga útil de recebimento eSPI negociado (rx-plsize, 64 bytes em todos os SoCs NPCX/NPCK no kernel). Tanto o contador do loop quanto a contagem de palavras eram uint8_t, portanto a cópia executava até 255 iterações.
Um controlador eSPI que emite uma solicitação de flash cujo cabeçalho afirma ter uma carga útil maior que o máximo negociado, portanto, realiza até 239 operações de armazenamento de 32 bits além do final da estrutura — aproximadamente 956 bytes de escrita fora dos limites para .bss — a partir do manipulador de interrupção de recebimento de flash eSPI, enquanto as leituras na origem ultrapassam o final do array de registradores FLASHRXBUF de 18 palavras em direção aos registradores eSPI vizinhos. O mesmo comprimento não validado foi então passado para flash_write() em espi_taf_npcx_flash_write() com o buffer src de 64 bytes como fonte, lendo até 4 KB de SRAM adjacente do controlador para a SPI flash em um endereço escolhido pelo host, onde o host pode lê-lo de volta. Um buffer de pilha de tamanho fixo relacionado em taf_npcx_completion_handler() foi estourado por quatro bytes no caminho de conclusão de tamanho máximo em SoCs cujo tx-plsize é 64.
A falha é acessível apenas do lado do host eSPI, e somente por uma solicitação que viole o tamanho da carga útil negociada, portanto requer firmware do host ou controle em nível de barramento, em vez de software comum do host; uma escrita de comprimento máximo compatível cabe exatamente no buffer e é tratada corretamente. Como a TAF existe especificamente para que o controlador embarcado arbitere o acesso do host à flash compartilhada (espi_taf_check_read_protect() / espi_taf_check_write_protect()), corromper a memória do controlador a partir de um campo fornecido pelo host cruza a fronteira de confiança que o recurso afirma; as consequências variam desde falha ou travamento do controlador até corrupção do estado do driver que regula as regiões de proteção da flash.
A correção alarga os contadores, rejeita qualquer solicitação cuja contagem de palavras exceda tanto ARRAY_SIZE(FLASHRXBUF) - NPCX_ESPI_FLASH_HEADER_ADDRESS_LEN quanto NPCX_TAF_RX_PAYLOAD_WORDS (derivado do rx-plsize no devicetree), marca tais pacotes com um novo invalid_flag para que espi_taf_work() os responda com uma conclusão não bem-sucedida em vez de processá-los, limita a carga útil de transmissão contra FLASHTXBUF e adiciona um caso padrão para tipos de ciclo não suportados. Apenas configurações com CONFIG_ESPI_TAF habilitado em um alvo NPCX/NPCK são afetadas; nenhuma placa no kernel as ativa por padrão.
VulDB is the best source for vulnerability data and more expert information about this specific topic.