🇰🇷 한글 설명
Linux 커널의 sun6i SPI 드라이버에서 DMA 모드 사용 시 데이터 수신 완료 인터럽트와 FIFO 비우기 작업 간의 레이스 컨디션이 발생합니다. 이로 인해 DMA 엔진과 드라이버가 동시에 FIFO를 읽으려 시도하여 데이터가 손상되거나 버퍼 포인터가 올바르게 조정되지 않는 문제가 있습니다.
💡 쉬운 설명
데이터를 전송하는 과정에서 두 개의 작업이 동시에 같은 데이터를 읽으려고 경쟁하여 데이터가 깨지는 현상입니다. 이로 인해 장치로부터 받은 정보가 실제와 다르게 잘못 전달될 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
spi: sun6i: fix race between DMA RX transfer completion and RX FIFO drain
Previously the transfer complete IRQ immediately drained to RX FIFO to
read any data remaining in FIFO to the RX buffer. This behaviour is
correct when dealing with SPI in interrupt mode. However in DMA mode the
transfer complete interrupt still fires as soon as all bytes to be
transferred have been stored in the FIFO. At that point data in the FIFO
still needs to be picked up by the DMA engine. Thus the drain procedure
and DMA engine end up racing to read from RX FIFO, corrupting any data
read. Additionally the RX buffer pointer is never adjusted according to
DMA progress in DMA mode, thus calling the RX FIFO drain procedure in DMA
mode is a bug.
Fix corruptions in DMA RX mode by draining RX FIFO only in interrupt mode.
Also wait for completion of RX DMA when in DMA mode before returning to
ensure all data has been copied to the supplied memory buffer.
📍 영향받는 시스템
sun6i SPI 드라이버를 사용하는 Linux 커널 기반 시스템
⚔️ 공격 벡터
로컬 시스템에서 특정 SPI 장치를 통해 DMA 모드로 데이터를 수신할 때 데이터 무결성 손상 유발
🛡️ 대응 방법
SPI 드라이버의 DMA 모드 시 FIFO 비우기 로직을 수정하고 DMA 완료를 대기하도록 커널 패치 적용
🔧 검증 코드
현재 실행 중인 커널 버전을 확인하여 해당 취약점이 해결된 패치 버전인지 확인합니다.