🇰🇷 한글 설명
Linux 커널의 accel/ethosu 드라이버에서 DMA 명령의 길이를 초기화하지 않았을 때 발생하는 취약점입니다. 초기화되지 않은 DMA 길이가 산술 연산 과정에서 오버플로를 일으켜 경계 검사를 우회하며, 이로 인해 하드웨어가 잘못된 물리 주소로 DMA를 실행할 수 있습니다.
💡 쉬운 설명
컴퓨터 부품에 데이터를 옮기라고 명령할 때, 데이터의 크기를 제대로 설정하지 않으면 시스템이 엉뚱한 메모리 영역을 건드릴 수 있는 문제입니다. 이로 인해 보안이 중요한 데이터가 유출되거나 시스템이 오작동할 위험이 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
accel/ethosu: reject DMA commands with uninitialized length
cmd_state_init() initializes the command state with memset(0xff),
leaving dma->len at U64_MAX to signal missing setup. The only setter
is NPU_SET_DMA0_LEN; if userspace omits this command and issues
NPU_OP_DMA_START, dma->len remains U64_MAX.
In dma_length(), a positive stride added to U64_MAX wraps to a small
value. With size0 == 1, check_mul_overflow() does not trigger and
dma_length() returns 0 instead of U64_MAX. The caller's U64_MAX check
then passes, region_size[] stays 0, and the bounds check in
ethosu_job.c is bypassed, allowing hardware to execute DMA with stale
physical addresses.
Fix by checking for U64_MAX at the start of dma_length() before any
arithmetic, consistent with the sentinel value used throughout the
driver to detect uninitialized fields.
📍 영향받는 시스템
Linux kernel (accel/ethosu driver 포함 버전)
⚔️ 공격 벡터
사용자 공간(userspace)에서 DMA 길이를 설정하지 않은 채 DMA 시작 명령을 내려 경계 검사를 우회함
🛡️ 대응 방법
Linux 커널을 최신 보안 패치가 적용된 버전으로 업데이트하여 dma_length() 함수 내의 초기값 검증 로직을 적용해야 함
🔧 검증 코드
출력된 커널 버전이 해당 취약점이 수정된 패치 버전 이후인지 확인하십시오.