🇰🇷 한글 설명
Linux 커널의 accel/rocket 모듈 내 rocket_job_push() 함수에서 NULL 포인터 역참조 및 정수 오버플로 취약점이 발견되었습니다. 사용자로부터 입력받은 카운트 값의 검증 부재로 인해 메모리 할당 시 오버플로가 발생하거나, 할당 실패 시 NULL 포인터를 참조하여 커널 패닉을 유발할 수 있습니다.
💡 쉬운 설명
컴퓨터의 핵심 운영체제(커널)가 메모리를 계산하는 과정에서 숫자가 너무 커져 오류가 발생하거나, 메모리 빌리기에 실패했을 때 이를 확인하지 않고 바로 사용하려다 시스템이 멈추는 문제입니다. 공격자가 이를 악용하면 시스템을 강제로 종료시키거나 잘못된 메모리 영역에 접근할 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
accel/rocket: fix NULL dereference and integer overflow in rocket_job_push()
rocket_job_push() allocates a temporary array to hold all input and
output GEM object pointers:
bos = kvmalloc_array(job->in_bo_count + job->out_bo_count,
sizeof(void *), GFP_KERNEL);
memcpy(bos, job->in_bos, job->in_bo_count * sizeof(void *));
memcpy(&bos[job->in_bo_count], job->out_bos, ...);
Two bugs exist:
1. Missing NULL check: if kvmalloc_array() fails, bos is NULL and
the subsequent memcpy() dereferences it, causing a kernel NULL
pointer dereference.
2. Integer overflow: in_bo_count and out_bo_count are both u32, set
directly from userspace-supplied in_bo_handle_count and
out_bo_handle_count with no prior validation. Their sum is computed
in u32 arithmetic and can wrap to a smaller value, causing the
allocation count passed to kvmalloc_array() to be smaller than
intended. Subsequent uses still operate on the original counts when
copying and locking objects, which may lead to out-of-bounds accesses
on the temporary array.
Fix by using check_add_overflow() to detect count overflow before the
allocation, and adding a NULL check on the allocation result.
📍 영향받는 시스템
Linux kernel (accel/rocket 모듈 포함 버전)
⚔️ 공격 벡터
사용자 공간(userspace)에서 조작된 in_bo_handle_count 및 out_bo_handle_count 값을 전달하여 발생
🛡️ 대응 방법
check_add_overflow()를 사용하여 정수 오버플로를 방지하고, kvmalloc_array()의 반환값에 대한 NULL 체크 로직이 적용된 최신 커널로 업데이트하십시오.
🔧 검증 코드
현재 실행 중인 커널 버전을 확인하여 해당 취약점이 패치된 버전인지 보안 공지(Security Advisory)와 대조하십시오.