
إثبات مفهوم ومُعيد إنتاج KUnit مؤكَّد بـ KASAN للثغرة CVE-2026-98180، وهي ثغرة استخدام بعد التحرير (use-after-free) في drm/msm تخص كائنات الحلقة (ring) والذاكرة الافتراضية (VM) التي تحتوي على المُجدوِل، ويمكن الوصول إليها عبر SYNC_IOC_FILE_INFO من دون امتيازات.
يحتفظ drm_sched_fence المُصدَّر إلى مساحة المستخدم بمؤشر خام إلى
drm_gpu_scheduler الذي أنشأه. في drm/msm يكون هذا المجدول مضمَّنًا
داخل struct msm_ringbuffer وstruct msm_gem_vm، وكلاهما كان يُحرَّر
باستخدام kfree() عادي. لذلك فإن السياج (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;.
تحتفظ عمليات سياج المجدول بدالة .release، لذا فإن السياج لا يكون
منفصلًا عن عملياته عند إشارته. السياج المُشار إليه والمُصدَّر عبر 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) |
| إمكانية الوصول | غير مميَّز — SYNC_IOC_FILE_INFO على واصف ملف سياج (fence fd) |
| التأثير | قراءة UAF لذاكرة slab محرَّرة (تسريب معلومات / قراءة عشوائية لمؤشر اسم الكائن المحرَّر) |
يستبدل الإصلاح kfree() بـ kfree_rcu() لكلا الكائنين الحاويين:
- kfree(vm);
+ kfree_rcu(vm, rcu);
...
- kfree(ring);
+ kfree_rcu(ring, rcu);
الخطأ موجود في معالجة عمر drm/sched العامة، لذا يمكن إعادة إنتاجه دون
عتاد Adreno باستخدام مجدول وهمي KUnit. هذا هو الدليل في
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كُتب 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، بما يتوافق مع مصادر النواة التي يُشتق منها.