CVE-2026-74276 in Linux
요약
\~에 의해 VulDB • 2026. 08. 16.
리눅스 커널에서 다음 취약점이 해결되었습니다:
spi: xilinx: FIFO 점유 레지스터를 사용하여 버퍼 크기 결정
드라이버가 FIFO 크기를 결정하는 방식에 문제가 있습니다. 현재 드라이버는 다음과 같이 동작합니다: SPI 하드웨어를 정지하고 TX FIFO 레지스터에 데이터를 쓰기 시작하여 상태 레지스터에서 'TX FIFO FULL' 신호가 발생할 때까지 반복합니다. 그러나 하드웨어에는 FIFO 외에도 1바이트를 저장할 수 있는 쉬프트 레지스터도 포함되어 있습니다. 이는 SPI 하드웨어가 정지된 상태에서 FIFO로 바이트를 쓸 때 TX FIFO EMPTY 플래그가 여전히 설정되어 있음을 통해 확인할 수 있습니다. 따라서 예를 들어 FIFO 크기가 16인 경우, 현재 방식은 17을 반환합니다.
이것은 특히 드라이버를 irq 모드에서 사용할 때 문제가 됩니다. TX FIFO에 대해 결정된 동일한 크기가 RX FIFO에도 적용됩니다. SPI 트랜잭션이 FIFO 크기 이상의 바이트(예: FIFO 크기가 16일 경우)를 쓰려고 할 때 다음과 같은 일이 발생합니다:
드라이버는 SPI 하드웨어를 정지하고 17바이트를 TX FIFO에 쓴 후, SPI 하드웨어를 시작하여 대기 상태(sleep)로 들어갑니다. 하드웨어는 그 다음 17바이트(FIFO + 쉬프트 레지스터)를 시프트 아웃하면서 동시에 RX FIFO로 바이트를 읽어들입니다. 그러나 RX FIFO에는 공간이 16개뿐이므로 하나의 바이트가 손실됩니다. 그런 다음 TX FIFO EMPTY 신호가 발생하여 드라이버를 다시 깨우며, 이 드라이버는 빠른 경로(fast path)를 통해 RX FIFO에서 16바이트를 읽습니다. 하지만 마지막 17번째 바이트(이미 손실됨)를 읽기 전에 다음과 같은 코드를 실행합니다:
sr = xspi->read_fn(xspi->regs + XSPI_SR_OFFSET); if (!(sr & XSPI_SR_RX_EMPTY_MASK)) {
xilinx_spi_rx(xspi); rx_words--; }
드라이버는 상태 레지스터를 읽고 RX FIFO가 비어 있지 않은지 확인합니다. 그러나 이 경우 RX FIFO는 이미 비어 있으므로, 이 조건문은 무한 while 루프에서 계속 반복되어 드라이버를 영구적으로 잠급니다(locking).
이 패치는 FIFO 크기를 결정하는 로직을 수정하여 문제를 해결합니다.
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.