🇰🇷 한글 설명
Linux 커널의 DRM Xe 드라이버에서 userptr 메모리 처리 시 hmm_range_fault()가 반환하는 EFAULT를 잘못 처리하는 문제가 해결되었습니다. 해당 오류 상황에서 이미 무효화된 userptr VMA가 rebind 리스트에 남아 커널 경고와 널 포인터 역참조(NPD)를 유발할 수 있었습니다.
💡 쉬운 설명
그래픽 카드 드라이버가 메모리 접근 실패 상황을 잘못 처리해서 시스템이 경고를 띄우거나 멈출 수 있었습니다. 이번 패치로 이 잘못된 처리 과정이 바로잡혔습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
drm/xe/userptr: fix EFAULT handling
Currently we treat EFAULT from hmm_range_fault() as a non-fatal error
when called from xe_vm_userptr_pin() with the idea that we want to avoid
killing the entire vm and chucking an error, under the assumption that
the user just did an unmap or something, and has no intention of
actually touching that memory from the GPU. At this point we have
already zapped the PTEs so any access should generate a page fault, and
if the pin fails there also it will then become fatal.
However it looks like it's possible for the userptr vma to still be on
the rebind list in preempt_rebind_work_func(), if we had to retry the
pin again due to something happening in the caller before we did the
rebind step, but in the meantime needing to re-validate the userptr and
this time hitting the EFAULT.
This explains an internal user report of hitting:
[ 191.738349] WARNING: CPU: 1 PID: 157 at drivers/gpu/drm/xe/xe_res_cursor.h:158 xe_pt_stage_bind.constprop.0+0x60a/0x6b0 [xe]
[ 191.738551] Workqueue: xe-ordered-wq preempt_rebind_work_func [xe]
[ 191.738616] RIP: 0010:xe_pt_stage_bind.constprop.0+0x60a/0x6b0 [xe]
[ 191.738690] Call Trace:
[ 191.738692] <TASK>
[ 191.738694] ? show_regs+0x69/0x80
[ 191.738698] ? __warn+0x93/0x1a0
[ 191.738703] ? xe_pt_stage_bind.constprop.0+0x60a/0x6b0 [xe]
[ 191.738759] ? report_bug+0x18f/0x1a0
[ 191.738764] ? handle_bug+0x63/0xa0
[ 191.738767] ? exc_invalid_op+0x19/0x70
[ 191.738770] ? asm_exc_invalid_op+0x1b/0x20
[ 191.738777] ? xe_pt_stage_bind.constprop.0+0x60a/0x6b0 [xe]
[ 191.738834] ? ret_from_fork_asm+0x1a/0x30
[ 191.738849] bind_op_prepare+0x105/0x7b0 [xe]
[ 191.738906] ? dma_resv_reserve_fences+0x301/0x380
[ 191.738912] xe_pt_update_ops_prepare+0x28c/0x4b0 [xe]
[ 191.738966] ? kmemleak_alloc+0x4b/0x80
[ 191.738973] ops_execute+0x188/0x9d0 [xe]
[ 191.739036] xe_vm_rebind+0x4ce/0x5a0 [xe]
[ 191.739098] ? trace_hardirqs_on+0x4d/0x60
[ 191.739112] preempt_rebind_work_func+0x76f/0xd00 [xe]
Followed by NPD, when running some workload, since the sg was never
actually populated but the vma is still marked for rebind when it should
be skipped for this special EFAULT case. This is confirmed to fix the
user report.
v2 (MattB):
- Move earlier.
v3 (MattB):
- Update the commit message to make it clear that this indeed fixes the
issue.
(cherry picked from commit 6b93cb98910c826c2e2004942f8b060311e43618)
📍 영향받는 시스템
Linux 커널 (Intel Xe DRM 드라이버를 사용하는 버전, 패치된 커널 업데이트 적용 필요)
⚔️ 공격 벡터
로컬 사용자가 특정 GPU 작업 부하와 메모리 매핑/해제를 반복해 커널 경고 및 NPD를 유발할 수 있으며, 원격 공격 경로는 확인되지 않았습니다.
🛡️ 대응 방법
배포판이 제공하는 최신 Linux 커널 보안/안정화 업데이트를 설치하고 재부팅하십시오.
🔧 검증 코드
출력된 커널 버전이 해당 CVE의 수정 커밋(6b93cb98910c)이 반영된 배포판 패치 버전 이상인지 배포판 보안 공지와 대조하여 확인합니다.