🇰🇷 한글 설명
Linux 커널의 DRM(Direct Rendering Manager) 서브시스템에서 drm_vblank_init() 호출 중 drmm_add_action_or_reset()이 실패하면, worker가 NULL인 vblank에 대해 drm_vblank_init_release()가 직접 호출되어 kthread_destroy_worker()에서 널 포인터 역참조가 발생할 수 있습니다. 해당 커밋은 drm_vblank_destroy_worker() 호출 전에 NULL 검사를 추가하여 문제를 해결했습니다.
💡 쉬운 설명
리눅스 그래픽 드라이버의 초기화 실패 처리 과정에서 빈 값을 확인하지 않아 시스템이 비정상 종료될 수 있는 문제입니다. 커널에 NULL 검사를 추가하는 방식으로 수정되었습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
drm: Fix potential null-ptr-deref in drm_vblank_destroy_worker()
drm_vblank_init() call drmm_add_action_or_reset() with
drm_vblank_init_release() as action. If __drmm_add_action() failed, will
directly call drm_vblank_init_release() with the vblank whose worker is
NULL. As the resule, a null-ptr-deref will happen in
kthread_destroy_worker(). Add the NULL check before calling
drm_vblank_destroy_worker().
BUG: null-ptr-deref
KASAN: null-ptr-deref in range [0x0000000000000068-0x000000000000006f]
CPU: 5 PID: 961 Comm: modprobe Not tainted 6.0.0-11331-gd465bff130bf-dirty
RIP: 0010:kthread_destroy_worker+0x25/0xb0
Call Trace:
<TASK>
drm_vblank_init_release+0x124/0x220 [drm]
? drm_crtc_vblank_restore+0x8b0/0x8b0 [drm]
__drmm_add_action_or_reset+0x41/0x50 [drm]
drm_vblank_init+0x282/0x310 [drm]
vkms_init+0x35f/0x1000 [vkms]
? 0xffffffffc4508000
? lock_is_held_type+0xd7/0x130
? __kmem_cache_alloc_node+0x1c2/0x2b0
? lock_is_held_type+0xd7/0x130
? 0xffffffffc4508000
do_one_initcall+0xd0/0x4f0
...
do_syscall_64+0x35/0x80
entry_SYSCALL_64_after_hwframe+0x46/0xb0
📍 영향받는 시스템
패치 이전의 Linux 커널 (DRM vblank 코드 포함, 특히 vkms 등 가상 디스플레이 드라이버 사용 환경)
⚔️ 공격 벡터
로컬 사용자가 드라이버 초기화 실패를 유발하는 상황에서 커널 패닉 또는 서비스 거부 상태를 만들 수 있으며, 원격 공격 경로는 확인되지 않았습니다.
🛡️ 대응 방법
배포판 제공 최신 커널 패키지로 업데이트하거나, 해당 수정이 포함된 Linux 커널 버전으로 재부팅합니다.
🔧 검증 코드
출력된 커널 버전이 CVE 수정이 포함된 안정 버전(배포판 보안 공지 기준)보다 낮거나 같으면 취약할 수 있으며, 드라이버 모듈 목록은 DRM 관련 드라이버가 로드되어 있는지 확인하는 용도입니다.
uname -r && (grep -i drm /proc/modules 2>/dev/null | head -5)