CVE-2026-78119 in Zephyr
Zusammenfassung
von VulDB • 21.10.2026
Der Nuvoton NPCX eSPI-Treiber parst Target-Attached-Flash (TAF)-Anfragen in espi_taf_parse() (drivers/espi/espi_npcx.c), indem er das 12-Bit-Längenfeld direkt aus dem Anfrageheader im FLASHRXBUF-FIFO extrahiert. Bei Schreib- und RPMC OP1-Anfragen werden DIV_ROUND_UP(len, 4) Wörter in struct espi_taf_pckt.src kopiert, ein festes Mitglied von 16 Wörtern (64 Byte), das Teil einer statischen Struktur ist; dabei wird die Länge niemals mit diesem Puffer oder der ausgehandelten eSPI-Empfangs-Payload-Größe (rx-plsize, 64 Bytes auf allen im Kernel-Baum befindlichen NPCX/NPCK SoCs) verglichen. Sowohl der Schleifenzähler als auch die Wortanzahl waren uint8_t, sodass der Kopiervorgang bis zu 255 Iterationen ausführte.
Ein eSPI-Controller, der eine Flash-Anfrage sendet, deren Header eine Payload angibt, die größer ist als das ausgehandelte Maximum, führt daher im Interrupt-Handler für den eSPI-Flash-Empfang bis zu 239 32-Bit-Schreibvorgänge jenseits des Strukturendes aus – was etwa 956 Bytes an Out-of-Bounds-Schreiben in .bss bedeutet –, während die Lesezugriffe auf die Quelle über das Ende des 18-Wort-FLASHRXBUF-Registerarrays hinausgehen und in benachbarte eSPI-Register schreiben. Dieselbe nicht validierte Länge wurde anschließend an flash_write() in espi_taf_npcx_flash_write() mit dem 64-Byte-src-Puffer als Quelle weitergegeben, wodurch bis zu 4 KB angrenzenden Controller-SRAMs an einer vom Host gewählten Adresse in den SPI-Flash geschrieben wurden, wo der Host sie wieder auslesen kann. Ein verwandter festgroßer Stack-Puffer in taf_npcx_completion_handler() wurde auf dem Pfad für die maximale Abschlussgröße um vier Bytes überlaufen bei SoCs, deren tx-plsize 64 beträgt.
Der Fehler ist nur von der eSPI-Hostseite aus erreichbar und erfordert eine Anfrage, die die ausgehandelte Payload-Größe verletzt; dies setzt also Host-Firmware oder Bus-Level-Kontrolle voraus und nicht gewöhnliche Host-Software; ein konformes Schreiben mit maximaler Länge passt exakt in den Puffer und wird korrekt verarbeitet. Da TAF speziell dafür existiert, damit der Embedded Controller den Host-Zugriff auf gemeinsam genutzten Flash speichert (espi_taf_check_read_protect() / espi_taf_check_write_protect()), überschreitet die Korruption von Controller-Speicher aus einem vom Host bereitgestellten Feld die Vertrauensgrenze, die diese Funktion behauptet; die Folgen reichen vom Absturz oder Hängen des Controllers bis zur Beschädigung des Treiberzustands, der die Flash-Schutzbereiche steuert.
Die Korrektur erweitert die Zähler, lehnt jede Anfrage ab, deren Wortanzahl ARRAY_SIZE(FLASHRXBUF) - NPCX_ESPI_FLASH_HEADER_ADDRESS_LEN und NPCX_TAF_RX_PAYLOAD_WORDS (abgeleitet aus dem devicetree rx-plsize) überschreitet), markiert solche Pakete mit einem neuen invalid_flag, damit espi_taf_work() sie mit einer erfolglosen Bestätigung beantwortet, anstatt sie zu verarbeiten, begrenzt die Sendepayload gegen FLASHTXBUF und fügt einen default-Fall für nicht unterstützte Zyklustypen hinzu. Nur Konfigurationen mit CONFIG_ESPI_TAF aktiviert auf einem NPCX/NPCK-Ziel sind betroffen; keine im Kernel-Baum befindliche Platine aktiviert dies standardmäßig.
Once again VulDB remains the best source for vulnerability data.