🇰🇷 한글 설명
Linux 커널의 nouveau 드라이버 내 UVMM 구성 요소에서 NULL 포인터 역참조 취약점이 발견되었습니다. OP_MAP_SPARSE 작업 처리 중 오류가 발생하여 작업 취소(unwinding)가 진행될 때, 초기화되지 않은 ops 포인터를 참조하여 시스템 커널 패닉(oops)을 유발할 수 있습니다.
💡 쉬운 설명
그래픽 카드 드라이버가 작업을 처리하다가 오류가 났을 때, 정리 작업을 수행하는 과정에서 잘못된 메모리 주소를 건드려 컴퓨터 시스템이 멈추거나 충돌할 수 있는 문제입니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
drm/nouveau/uvmm: fix NULL deref unwinding an OP_MAP_SPARSE op
Each bind_job_op is zeroed by kzalloc_obj() in bind_job_op_from_uop(),
and the OP_MAP_SPARSE case in nouveau_uvmm_bind_job_submit() only creates
a region, so op->ops stays NULL for a successfully processed sparse map.
If a later op in the same job fails, the reverse unwind loop revisits that
op and calls drm_gpuva_ops_free(&uvmm->base, op->ops) unconditionally.
drm_gpuva_ops_free() dereferences its argument right away
(list_for_each_entry_safe on &ops->list), so a NULL op->ops oopses. The
path is reachable by any render-node fd holder, since NOUVEAU_VM_BIND is
DRM_RENDER_ALLOW.
Guard the free with IS_ERR_OR_NULL(), as nouveau_uvmm_bind_job_cleanup()
already does for the identical free.
📍 영향받는 시스템
Linux kernel (nouveau driver with UVMM support)
⚔️ 공격 벡터
렌더 노드 파일 디스크립터(render-node fd) 권한을 가진 로컬 사용자가 특수하게 조작된 바인드 작업을 제출하여 발생
🛡️ 대응 방법
Linux 커널을 최신 보안 패치가 적용된 버전으로 업데이트하거나, 해당 드라이버 코드에 IS_ERR_OR_NULL() 검사 로직을 적용해야 합니다.
🔧 검증 코드
현재 사용 중인 커널 버전과 nouveau 모듈의 정보를 확인하여 해당 취약점이 수정된 패치 버전인지 확인합니다.
uname -r && modinfo nouveau | grep -i uvmm