
CVE-2026-98180 के लिए प्रूफ-ऑफ-कॉन्सेप्ट और KASAN-पुष्ट KUnit रिप्रोड्यूसर, जो drm/msm में शेड्यूलर-युक्त रिंग और VM ऑब्जेक्ट्स का use-after-free है, जिसे अनप्रिविलेज्ड SYNC_IOC_FILE_INFO के माध्यम से पहुँचा जा सकता है।
userspace को एक्सपोर्ट किया गया drm_sched_fence उस drm_gpu_scheduler के प्रति एक रॉ पॉइंटर रखता है जिसने उसे उत्पन्न किया था। drm/msm में वह स्केड्यूलर struct msm_ringbuffer और struct msm_gem_vm में एम्बेडेड है, और इन दोनों को साधारण kfree() से मुक्त किया गया था। इसलिए userspace के पास मौजूद एक पूर्ण हो चुका fence अपने स्केड्यूलर से अधिक जीवित रहता है, और बाद में SYNC_IOC_FILE_INFO — एक अविशेषाधिकार प्राप्त ioctl — drm_sched_fence_get_timeline_name() को मुक्त slab मेमोरी को डीरेफ़रेंस करने पर मजबूर कर देता है।
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;।
स्केड्यूलर fence ops एक .release कॉलबैक रखते हैं, इसलिए सिग्नल होने पर fence ops-detached नहीं होता। sync_file या drm_syncobj के माध्यम से एक्सपोर्ट किया गया सिग्नल किया गया fence, रिंग या VM के मुक्त होने के बाद भी एम्बेडेड स्केड्यूलर की ओर इंगित करता रहता है। dma-fence लाइफ़टाइम अनुबंध के अनुसार, एक्सपोर्टर को सिग्नल किए गए fence के पीछे की डेटा को एक RCU grace period तक जीवित रखना चाहिए; 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) |
| पहुँच | अविशेषाधिकार प्राप्त — fence fd पर SYNC_IOC_FILE_INFO |
| प्रभाव | मुक्त slab का UAF रीड (info-leak / मुक्त ऑब्जेक्ट के name पॉइंटर का मनमाना रीड) |
फ़िक्स दोनों कंटेनिंग ऑब्जेक्ट्स के लिए kfree() को kfree_rcu() से बदल देता है:
- kfree(vm);
+ kfree_rcu(vm, rcu);
...
- kfree(ring);
+ kfree_rcu(ring, rcu);
यह बग सामान्य drm/sched लाइफ़टाइम हैंडलिंग में है, इसलिए यह KUnit mock स्केड्यूलर का उपयोग करके 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 — प्रभावित ड्राइवर पर अविशेषाधिकार प्राप्त userspace 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 एक पूर्ण fence को 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 के sign-off हैं।
Patchwork: https://patchwork.freedesktop.org/patch/750234/
पुनरुत्पादक कोड GPL-2.0 है, जो उन कर्नेल स्रोतों से मेल खाता है जिनसे यह व्युत्पन्न है।