
CVE-2026-98180에 대한 개념 증명(PoC) 및 KASAN으로 확인된 KUnit 재현기입니다. 이 취약점은 권한 없는 SYNC_IOC_FILE_INFO를 통해 도달 가능한, 스케줄러를 포함하는 ring 및 VM 객체의 drm/msm use-after-free입니다.
사용자 공간으로 내보내진 drm_sched_fence는 자신을 생성한 drm_gpu_scheduler에 대한 원시 포인터를 유지한다. drm/msm에서 해당 스케줄러는 struct msm_ringbuffer와 struct msm_gem_vm에 내장되어 있으며, 두 구조체 모두 단순한 kfree()로 해제되었다. 따라서 사용자 공간이 보유한 완료된 fence는 자신의 스케줄러보다 오래 살아남고, 이후 비특권 ioctl인 SYNC_IOC_FILE_INFO가 drm_sched_fence_get_timeline_name()을 통해 해제된 slab 메모리를 역참조하게 만든다.
BUG: KASAN: slab-use-after-free in drm_sched_fence_get_timeline_name
Read of size 8
drm_sched_fence_get_timeline_name()은 return fence->sched->name;이다.
스케줄러 fence ops는 .release 콜백을 유지하므로, fence가 시그널될 때 ops가 분리(detach)되지 않는다. sync_file 또는 drm_syncobj를 통해 내보내진 시그널된 fence는 ring 또는 VM이 해제된 후에도 내장된 스케줄러를 계속 가리킨다. dma-fence 수명 계약에 따르면, 내보내는 쪽은 시그널된 fence를 뒷받침하는 데이터를 RCU 유예 기간 동안 살아 있게 유지해야 하지만, drm/msm은 그렇게 하지 않았다.
| 수정 | 01c8d1f385f7 — drm/msm: RCU-free the scheduler-containing ring and VM objects |
| 도입 커밋 | 1d8a5ca436ee (drm/msm: Conversion to drm scheduler), 92395af63a99 (drm/msm: Add VM_BIND submitqueue) |
| 백포트 | 6.18-stable, 7.2-stable (Greg Kroah-Hartman, 2026-09-22) |
| 도달 가능성 | 비특권 — fence fd에 대한 SYNC_IOC_FILE_INFO |
| 영향 | 해제된 slab의 UAF 읽기 (정보 유출 / 해제된 객체의 name 포인터 임의 읽기) |
수정은 두 포함 객체 모두에 대해 kfree()를 kfree_rcu()로 교체한다:
- kfree(vm);
+ kfree_rcu(vm, rcu);
...
- kfree(ring);
+ kfree_rcu(ring, rcu);
이 버그는 일반적인 drm/sched 수명 처리에 있으므로, KUnit 목(mock) 스케줄러를 사용하여 Adreno 하드웨어 없이 재현된다. 이것이 evidence/kasan-report.txt에 있는 증거이다.
cd poc && ./run-repro.sh # applies 0001-…patch, builds KUnit + KASAN, runs
poc/0001-drm-sched-kunit-uaf-repro.patch — 하드웨어 독립적인 KUnit 재현기 (KASAN으로 확인됨)poc/poc_userspace_drm_sched_uaf.c — 영향을 받는 드라이버에서의 비특권 사용자 공간 ioctl 시퀀스poc/kunitconfig, poc/run-repro.sh — 빌드/실행 하네스evidence/kasan-report.txt — KASAN slab-use-after-free 보고서poc_userspace_drm_sched_uaf.c는 해당 장치를 사용할 수 있었기 때문에 AMD XDNA를 구체적인 예로 삼아 작성되었다. 동일한 형태가 msm(MSM_SUBMITQUEUE / VM_BIND가 sync_file_create() + fd_install()을 통해 완료된 fence를 내보냄)과 nouveau에도 적용된다.
동일한 dma-fence 수명 부류는 코어에서도 수정되었다:
3ed11c671ff7
— dma-buf/dma-fence: fix checking signaling bit for timeline and driver name v3
(Christian König 작성, 이 저장소 작성자가 보고 및 테스트).
JongHyuk Kim(MalHyuk) — [email protected]이 발견하고 수정했다.
패치는 Rob Clark과 Greg Kroah-Hartman이 서명했다.
Patchwork: https://patchwork.freedesktop.org/patch/750234/
재현기 코드는 파생된 커널 소스와 동일하게 GPL-2.0이다.