
ユーザー空間にエクスポートされた drm_sched_fence は、それを生成した drm_gpu_scheduler への生ポインタを保持し続けます。drm/msm では、そのスケジューラは struct msm_ringbuffer と struct msm_gem_vm に埋め込まれており、どちらも単純な kfree() で解放されていました。そのため、ユーザー空間が保持する完了済みフェンスはスケジューラより長く生存し、その後の SYNC_IOC_FILE_INFO — 非特権の ioctl — によって drm_sched_fence_get_timeline_name() が解放済みスラブメモリを参照します。
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; です。
スケジューラのフェンス ops は .release コールバックを保持しているため、フェンスはシグナル時に ops からデタッチされません。sync_file や drm_syncobj 経由でエクスポートされたシグナル済みフェンスは、リングまたは VM が解放された後も埋め込みスケジューラを指し続けます。dma-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) |
| 到達可能性 | 非特権 — フェンス fd に対する SYNC_IOC_FILE_INFO |
| 影響 | 解放済みスラブの UAF 読み取り (情報漏洩 / 解放済みオブジェクトの name ポインタの任意読み取り) |
この修正は、両方の包含オブジェクトについて kfree() を kfree_rcu() に置き換えます:
- kfree(vm);
+ kfree_rcu(vm, rcu);
...
- kfree(ring);
+ kfree_rcu(ring, rcu);
このバグは汎用的な drm/sched のライフタイム処理にあるため、KUnit のモックスケジューラを使用して 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() を介して完了済みフェンスをエクスポートします) および 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 です。