
Proof-of-concept e riproduttore KUnit confermato da KASAN per CVE-2026-98180, un use-after-free in drm/msm di oggetti ring e VM contenenti lo scheduler, raggiungibili tramite SYNC_IOC_FILE_INFO non privilegiato.
Un drm_sched_fence esportato verso lo userspace mantiene un puntatore grezzo al
drm_gpu_scheduler che lo ha prodotto. In drm/msm tale scheduler è incorporato
in struct msm_ringbuffer e struct msm_gem_vm, entrambi liberati
con una semplice kfree(). Un fence completato trattenuto dallo userspace sopravvive quindi
al suo scheduler, e un successivo SYNC_IOC_FILE_INFO — un ioctl non privilegiato —
fa sì che drm_sched_fence_get_timeline_name() dereferenzi memoria slab liberata.
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;.
Le ops del fence dello scheduler mantengono una callback .release, quindi il fence non
viene staccato dalle ops quando segnala. Un fence segnalato esportato tramite sync_file o
drm_syncobj continua a puntare allo scheduler incorporato dopo che il ring o la VM sono
stati liberati. Secondo il contratto di durata della dma-fence, l'esportatore deve mantenere
vivi i dati che supportano un fence segnalato per un periodo di grazia RCU; drm/msm non lo faceva.
| Fix | 01c8d1f385f7 — drm/msm: RCU-free the scheduler-containing ring and VM objects |
| Introdotto da | 1d8a5ca436ee (drm/msm: Conversion to drm scheduler), 92395af63a99 (drm/msm: Add VM_BIND submitqueue) |
| Backportato | 6.18-stable, 7.2-stable (Greg Kroah-Hartman, 2026-09-22) |
| Raggiungibilità | non privilegiato — SYNC_IOC_FILE_INFO su un fd di fence |
| Impatto | lettura UAF di slab liberata (info-leak / lettura arbitraria del puntatore name dell'oggetto liberato) |
La correzione sostituisce kfree() con kfree_rcu() per entrambi gli oggetti contenitori:
- kfree(vm);
+ kfree_rcu(vm, rcu);
...
- kfree(ring);
+ kfree_rcu(ring, rcu);
Il bug risiede nella gestione generica della durata in drm/sched, quindi si riproduce senza
hardware Adreno usando uno scheduler mock KUnit. Questa è la prova in
evidence/kasan-report.txt.
cd poc && ./run-repro.sh # applies 0001-…patch, builds KUnit + KASAN, runs
poc/0001-drm-sched-kunit-uaf-repro.patch — riproduttore KUnit indipendente dall'hardware (confermato da KASAN)poc/poc_userspace_drm_sched_uaf.c — la sequenza di ioctl non privilegiati dello userspace su un driver affettopoc/kunitconfig, poc/run-repro.sh — harness di build/esecuzioneevidence/kasan-report.txt — il report KASAN slab-use-after-freepoc_userspace_drm_sched_uaf.c è scritto prendendo AMD XDNA come esempio pratico
perché quel dispositivo era disponibile; la stessa forma si applica a msm
(MSM_SUBMITQUEUE / VM_BIND esportano un fence completato tramite
sync_file_create() + fd_install()) e a nouveau.
La stessa classe di durata della dma-fence è stata corretta anche nel core:
3ed11c671ff7
— dma-buf/dma-fence: fix checking signaling bit for timeline and driver name v3
(scritto da Christian König; segnalato e testato dall'autore di questo repo).
Trovato e corretto da JongHyuk Kim(MalHyuk) — [email protected].
Patch firmata da Rob Clark e Greg Kroah-Hartman.
Patchwork: https://patchwork.freedesktop.org/patch/750234/
Il codice del riproduttore è GPL-2.0, in linea con i sorgenti del kernel da cui deriva.