
Preuve de concept et reproducteur KUnit confirmé par KASAN pour CVE-2026-98180, un use-after-free dans drm/msm touchant des objets ring et VM contenant le scheduler, accessibles via SYNC_IOC_FILE_INFO non privilégié.
Un drm_sched_fence exporté vers l'espace utilisateur conserve un pointeur brut vers le
drm_gpu_scheduler qui l'a produit. Dans drm/msm, ce scheduler est intégré
dans struct msm_ringbuffer et struct msm_gem_vm, tous deux libérés
avec un simple kfree(). Une fence terminée détenue par l'espace utilisateur survit donc
à son scheduler, et un SYNC_IOC_FILE_INFO ultérieur — un ioctl non privilégié —
amène drm_sched_fence_get_timeline_name() à déréférencer de la mémoire slab libérée.
BUG: KASAN: slab-use-after-free in drm_sched_fence_get_timeline_name
Read of size 8
drm_sched_fence_get_timeline_name() est return fence->sched->name;.
Les ops de fence du scheduler conservent un callback .release, donc la fence n'est pas
détachée de ses ops lorsqu'elle signale. Une fence signalée exportée via sync_file ou
drm_syncobj continue de pointer vers le scheduler intégré après que le ring ou la VM a été
libéré. Selon le contrat de durée de vie dma-fence, l'exportateur doit maintenir en vie les données
sous-jacentes à une fence signalée pendant une période de grâce RCU ; drm/msm ne le faisait pas.
| Correctif | 01c8d1f385f7 — drm/msm: RCU-free the scheduler-containing ring and VM objects |
| Introduit par | 1d8a5ca436ee (drm/msm: Conversion to drm scheduler), 92395af63a99 (drm/msm: Add VM_BIND submitqueue) |
| Rétroporté | 6.18-stable, 7.2-stable (Greg Kroah-Hartman, 2026-09-22) |
| Accessibilité | non privilégié — SYNC_IOC_FILE_INFO sur un fd de fence |
| Impact | lecture UAF de slab libéré (fuite d'informations / lecture arbitraire du pointeur name de l'objet libéré) |
Le correctif remplace kfree() par kfree_rcu() pour les deux objets conteneurs :
- kfree(vm);
+ kfree_rcu(vm, rcu);
...
- kfree(ring);
+ kfree_rcu(ring, rcu);
Le bug se situe dans la gestion générique de la durée de vie drm/sched, il se reproduit donc sans
matériel Adreno à l'aide d'un scheduler mock KUnit. C'est la preuve fournie dans
evidence/kasan-report.txt.
cd poc && ./run-repro.sh # applies 0001-…patch, builds KUnit + KASAN, runs
poc/0001-drm-sched-kunit-uaf-repro.patch — reproducteur KUnit indépendant du matériel (confirmé par KASAN)poc/poc_userspace_drm_sched_uaf.c — la séquence d'ioctl non privilégiée en espace utilisateur sur un pilote affectépoc/kunitconfig, poc/run-repro.sh — harnais de compilation/exécutionevidence/kasan-report.txt — le rapport KASAN slab-use-after-freepoc_userspace_drm_sched_uaf.c est écrit pour AMD XDNA comme exemple concret
car ce périphérique était disponible ; la même forme s'applique à msm
(MSM_SUBMITQUEUE / VM_BIND exportent une fence terminée via
sync_file_create() + fd_install()) et à nouveau.
La même classe de durée de vie dma-fence a également été corrigée dans le cœur :
3ed11c671ff7
— dma-buf/dma-fence: fix checking signaling bit for timeline and driver name v3
(écrit par Christian König ; signalé et testé par l'auteur de ce dépôt).
Trouvé et corrigé par JongHyuk Kim(MalHyuk) — [email protected].
Patch signé par Rob Clark et Greg Kroah-Hartman.
Patchwork : https://patchwork.freedesktop.org/patch/750234/
Le code du reproducteur est sous GPL-2.0, en accord avec les sources du noyau dont il dérive.