
Prueba de concepto y reproductor KUnit confirmado por KASAN para CVE-2026-98180, un use-after-free en drm/msm de objetos ring y VM que contienen el planificador, accesibles mediante SYNC_IOC_FILE_INFO sin privilegios.
Un drm_sched_fence exportado al espacio de usuario mantiene un puntero sin procesar al
drm_gpu_scheduler que lo produjo. En drm/msm ese scheduler está embebido
en struct msm_ringbuffer y struct msm_gem_vm, ambos liberados
con un simple kfree(). Por lo tanto, un fence finalizado retenido por el espacio de usuario sobrevive
a su scheduler, y un SYNC_IOC_FILE_INFO posterior — un ioctl sin privilegios —
hace que drm_sched_fence_get_timeline_name() desreferencie memoria slab liberada.
BUG: KASAN: slab-use-after-free in drm_sched_fence_get_timeline_name
Read of size 8
drm_sched_fence_get_timeline_name() es return fence->sched->name;.
Las ops del scheduler fence mantienen un callback .release, por lo que el fence no
se desvincula de las ops cuando señala. Un fence señalado exportado vía sync_file o
drm_syncobj sigue apuntando al scheduler embebido después de que el ring o la VM se
liberan. Según el contrato de vida útil de dma-fence, el exportador debe mantener vivos los datos
que respaldan un fence señalado durante un período de gracia RCU; drm/msm no lo hacía.
| Corrección | 01c8d1f385f7 — drm/msm: RCU-free the scheduler-containing ring and VM objects |
| Introducido por | 1d8a5ca436ee (drm/msm: Conversion to drm scheduler), 92395af63a99 (drm/msm: Add VM_BIND submitqueue) |
| Retroportado | 6.18-stable, 7.2-stable (Greg Kroah-Hartman, 2026-09-22) |
| Alcanzabilidad | sin privilegios — SYNC_IOC_FILE_INFO sobre un fd de fence |
| Impacto | lectura UAF de slab liberado (fuga de información / lectura arbitraria del puntero de nombre del objeto liberado) |
La corrección reemplaza kfree() por kfree_rcu() para ambos objetos contenedores:
- kfree(vm);
+ kfree_rcu(vm, rcu);
...
- kfree(ring);
+ kfree_rcu(ring, rcu);
El error está en el manejo genérico de la vida útil de drm/sched, por lo que se reproduce sin
hardware Adreno usando un scheduler simulado de KUnit. Esa es la evidencia en
evidence/kasan-report.txt.
cd poc && ./run-repro.sh # aplica 0001-…patch, compila KUnit + KASAN, ejecuta
poc/0001-drm-sched-kunit-uaf-repro.patch — reproductor KUnit independiente del hardware (confirmado por KASAN)poc/poc_userspace_drm_sched_uaf.c — la secuencia de ioctl sin privilegios desde el espacio de usuario sobre un driver afectadopoc/kunitconfig, poc/run-repro.sh — arnés de compilación/ejecuciónevidence/kasan-report.txt — el informe KASAN de slab-use-after-freepoc_userspace_drm_sched_uaf.c está escrito contra AMD XDNA como ejemplo
práctico porque ese dispositivo estaba disponible; la misma forma se aplica a msm
(MSM_SUBMITQUEUE / VM_BIND exportan un fence finalizado mediante
sync_file_create() + fd_install()) y a nouveau.
La misma clase de vida útil de dma-fence también se corrigió en el núcleo:
3ed11c671ff7
— dma-buf/dma-fence: fix checking signaling bit for timeline and driver name v3
(autor: Christian König; reportado y probado por el autor de este repositorio).
Encontrado y corregido por JongHyuk Kim(MalHyuk) — [email protected].
Parche firmado por Rob Clark y Greg Kroah-Hartman.
Patchwork: https://patchwork.freedesktop.org/patch/750234/
El código del reproductor es GPL-2.0, en concordancia con las fuentes del kernel de las que deriva.