🇰🇷 한글 설명
Linux 커널의 Nouveau DRM 드라이버에서 스케줄러를 포함한 객체를 일반 kfree()로 해제하여, 해제 후에도 시그널된 fence가 참조하는 메모리에 접근하는 use-after-free 취약점입니다. 수정은 해당 객체를 kfree_rcu()로 해제하도록 변경하는 것입니다.
💡 쉬운 설명
그래픽 드라이버가 사용이 끝난 메모리를 너무 빨리 해제하여, 그 메모리를 여전히 참조하던 프로그램이 잘못된 데이터를 읽을 수 있습니다. 일반 사용자 권한으로도 이 문제를 유발할 수 있어 시스템 안정성이나 정보 노출 위험이 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
drm/nouveau: RCU-free the scheduler-containing nouveau_sched
struct nouveau_sched embeds a struct drm_gpu_scheduler (base).
nouveau_sched_destroy() calls nouveau_sched_fini() (which does
drm_sched_fini(&sched->base)) and then frees the object with plain
kfree(sched).
drm_sched_fence_get_timeline_name() returns fence->sched->name, and the
scheduler fence keeps a .release callback so it is not ops-detached on
signalling. A finished fence exported to userspace via drm_syncobj /
sync_file therefore keeps pointing at &sched->base after nouveau_sched_destroy(),
and a later get_timeline_name() -- reachable unprivileged through
SYNC_IOC_FILE_INFO -- dereferences freed memory (KASAN slab-use-after-free
read).
Per the dma-fence lifetime contract the exporter must keep the data backing a
signalled fence alive for an RCU grace period. Free the scheduler-containing
object with kfree_rcu() instead of kfree().
📍 영향받는 시스템
패치가 적용되지 않은 Nouveau 드라이버 포함 Linux 커널 (특정 수정 전 버전)
⚔️ 공격 벡터
로컬 사용자가 SYNC_IOC_FILE_INFO 등을 통해 해제된 fence의 타임라인 이름을 조회하여 메모리 오류를 유발
🛡️ 대응 방법
배포판에서 제공하는 Linux 커널 보안 업데이트를 적용하고 재부팅
🔧 검증 코드
출력된 커널 버전을 배포판 보안 공지의 패치된 버전과 비교하여, 같거나 더 높으면 수정된 것으로 판단합니다.