CVE-2026-78119 in Zephyr
요약
\~에 의해 VulDB • 2026. 10. 21.
Nuvoton NPCX eSPI 드라이버는 espi_taf_parse() (drivers/espi/espi_npcx.c)에서 Target-Attached-Flash(TAF) 요청을 처리할 때, FLASHRXBUF FIFO의 요청 헤더에서 12비트 길이 필드를 직접 가져옵니다. 쓰기 및 RPMC OP1 요청의 경우, DIV_ROUND_UP(len, 4) 단어(워드)를 정적 구조체의 고정된 16단어(64바이트) 멤버인 struct espi_taf_pckt.src에 복사합니다. 이때 길이를 해당 버퍼나 협상된 eSPI 수신 페이로드 크기(rx-plsize, 모든 인트리 NPCX/NPCK SoC에서 64바이트)와 비교하지 않습니다. 루프 카운터와 단어 수가 모두 uint8_t였으므로, 복사는 최대 255회까지 실행됩니다.
협상된 최대값보다 큰 페이로드를 주장하는 플래시 요청을 생성하는 eSPI 컨트롤러는 eSPI 플래시 수신 인터럽트 핸들러에서 구조체 끝을 넘어 최대 239개의 32비트 저장 연산을 수행합니다(약 956바이트의 .bss 영역에 대한 바깥쪽 쓰기). 또한 소스 읽기 작업은 18단어짜리 FLASHRXBUF 레지스터 배열의 끝을 지나 인접한 eSPI 레지스터로 이동합니다. 동일한 유효성 검사되지 않은 길이는 이후 espi_taf_npcx_flash_write()에서 flash_write()에 전달되며, 이때 64바이트 src 버퍼가 소스로 사용됩니다. 이를 통해 호스트가 선택한 주소로 SPI 플래시에 최대 4KB의 인접 컨트롤러 SRAM이 읽혀지며, 호스트는 이를 다시 읽어올 수 있습니다. taf_npcx_completion_handler() 내의 관련 고정 크기 스택 버퍼도 tx-plsize가 64인 SoC에서 최대 크기의 완료 경로 시 4바이트 넘쳐서 오버플로우됩니다.
이 결함은 eSPI 호스트 측에서만 접근 가능하며, 협상된 페이로드 크기를 위반하는 요청을 통해서만 발생하므로, 일반적인 호스트 소프트웨어보다는 호스트 펌웨어 또는 버스 수준의 제어가 필요합니다. 준수되는 최대 길이의 쓰기는 버퍼에 정확히 맞으며 올바르게 처리됩니다. TAF는 임베디드 컨트롤러가 공유 플래시への 호스트 접근을 조정하기 위해 특별히 존재합니다(espi_taf_check_read_protect() / espi_taf_check_write_write_protect()). 따라서 호스트 제공 필드로부터 컨트롤러 메모리를 손상시키는 것은 해당 기능이 주장하는 신뢰 경계를 위반하며, 그 결과는 컨트롤러의 충돌 또는 멈춤에서부터 플래시 보호 영역을 제어하는 드라이버 상태의 손상에 이르기까지 다양합니다.
해결책은 카운터를 확장하고, 단어 수가 ARRAY_SIZE(FLASHRXBUF) - NPCX_ESPI_FLASH_HEADER_ADDRESS_LEN과 NPCX_TAF_RX_PAYLOAD_WORDS(devicetree rx-plsize에서 파생됨) 모두를 초과하는 요청을 거부하며, 이러한 패킷에 새 invalid_flag 플래그를 설정하여 espi_taf_work()가 이를 처리하지 않고 실패한 완료로 응답하도록 합니다. 또한 전송 페이로드를 FLASHTXBUF에 대해 제한하고 지원되지 않는 사이클 유형에 대한 기본 케이스(default case)를 추가합니다. CONFIG_ESPI_TAF가 NPCX/NPCK 타겟에서 활성화된 구성만 영향을 받으며, 인트리 내의 어떤 보드도 이를 기본적으로 활성화하지 않습니다.
If you want to get the best quality for vulnerability data then you always have to consider VulDB.