
Prova de conceito e reprodutor KUnit confirmado por KASAN para CVE-2026-98180, um use-after-free em drm/msm de objetos ring e VM contendo o scheduler, alcançáveis via SYNC_IOC_FILE_INFO sem privilégios.
Um drm_sched_fence exportado para o espaço do usuário mantém um ponteiro bruto para o
drm_gpu_scheduler que o produziu. No drm/msm esse scheduler está embutido
em struct msm_ringbuffer e struct msm_gem_vm, ambos liberados
com um simples kfree(). Um fence finalizado mantido pelo espaço do usuário, portanto, sobrevive
ao seu scheduler, e um SYNC_IOC_FILE_INFO posterior — um ioctl não privilegiado —
faz drm_sched_fence_get_timeline_name() desreferenciar memória 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() é return fence->sched->name;.
As ops do scheduler fence mantêm um callback .release, então o fence não é
desanexado das ops quando sinaliza. Um fence sinalizado exportado via sync_file ou
drm_syncobj continua apontando para o scheduler embutido depois que o ring ou a VM é
liberado. Segundo o contrato de tempo de vida do dma-fence, o exportador deve manter os dados
que sustentam um fence sinalizado vivos por um período de carência RCU; o drm/msm não o fez.
| Correção | 01c8d1f385f7 — drm/msm: RCU-free the scheduler-containing ring and VM objects |
| Introduzido por | 1d8a5ca436ee (drm/msm: Conversion to drm scheduler), 92395af63a99 (drm/msm: Add VM_BIND submitqueue) |
| Backportado | 6.18-stable, 7.2-stable (Greg Kroah-Hartman, 2026-09-22) |
| Alcançabilidade | não privilegiado — SYNC_IOC_FILE_INFO em um fd de fence |
| Impacto | leitura UAF de slab liberado (vazamento de informação / leitura arbitrária do ponteiro de nome do objeto liberado) |
A correção substitui kfree() por kfree_rcu() para ambos os objetos contêineres:
- kfree(vm);
+ kfree_rcu(vm, rcu);
...
- kfree(ring);
+ kfree_rcu(ring, rcu);
O bug está no tratamento genérico de tempo de vida do drm/sched, então ele se reproduz sem
hardware Adreno usando um scheduler mock de KUnit. Essa é a evidência em
evidence/kasan-report.txt.
cd poc && ./run-repro.sh # applies 0001-…patch, builds KUnit + KASAN, runs
poc/0001-drm-sched-kunit-uaf-repro.patch — reprodutor KUnit independente de hardware (confirmado por KASAN)poc/poc_userspace_drm_sched_uaf.c — a sequência de ioctl não privilegiada do espaço do usuário em um driver afetadopoc/kunitconfig, poc/run-repro.sh — harness de build/execuçãoevidence/kasan-report.txt — o relatório KASAN de slab-use-after-freepoc_userspace_drm_sched_uaf.c foi escrito tendo o AMD XDNA como exemplo prático
porque esse dispositivo estava disponível; a mesma forma se aplica ao msm
(MSM_SUBMITQUEUE / VM_BIND exportam um fence finalizado através de
sync_file_create() + fd_install()) e ao nouveau.
A mesma classe de tempo de vida do dma-fence também foi corrigida no núcleo:
3ed11c671ff7
— dma-buf/dma-fence: fix checking signaling bit for timeline and driver name v3
(escrito por Christian König; reportado e testado pelo autor deste repositório).
Encontrado e corrigido por JongHyuk Kim(MalHyuk) — [email protected].
Patch assinado por Rob Clark e Greg Kroah-Hartman.
Patchwork: https://patchwork.freedesktop.org/patch/750234/
O código do reprodutor é GPL-2.0, em conformidade com os fontes do kernel dos quais deriva.