
إثبات المفهوم لـ CVE-2025-39866 (UAF and race condition)
المؤلف: Byte Reaper
يحاول هذا الإثبات استغلال ثغرة CVE-2025-39866، وهي خلل في أنظمة لينكس < 6.12.16 نتيجة لغياب قفل الدوران (spinlock) للخيوط، مما يسبب حالة سباق. يحاول الخيط الأول استخدام هيكل wb بينما يحرر الخيط الثاني هذا الهيكل، مما يؤدي إلى تعامل الخيط الأول مع مؤشر محرر، مما يسبب ذعر kernel للنظام. يمكننا تقسيم فكرة استغلال الثغرة إلى المراحل التالية:
step 1 : Create thread 1 "main pid"
- get root dentry
- create file txt writeback target
- create strcut inode
- Create object wb
- save pointer wb in wb_old
Step 2:
- Create Thread 2 (kthread) that schedules a work item.
- The work item runs “inode_switch_wbs_work_fn” which updates “inode->i_wb” and schedules the critical free via “wb_put_many”.
step 3 :
- thread 2 : free wb_olb
- thread 1 -> pointer - free object wb (free old)
-> access free address -> crash kernel (segfault)
Linux x86_64
kernel linux < 6.12.16
1 - He created a Makefile and included these commands to compile and build the kernel module:
obj-m += exploit.o
KDIR := /usr/src/linux-headers-6.12.38+kali-amd64
PWD := $(shell pwd)
all:
make -C $(KDIR) M=$(PWD) modules
clean:
make -C $(KDIR) M=$(PWD) clean
# make clean
# make
1 - You will find a file named "exploit.ko," which is a kernel module. To load it into the kernel space, use the insmod tool :
# insmod exploit.ko
wb، مثل تقليل عداد المرجع أو حذف ذاكرة التخزين المؤقت لـ wb من قائمة التخزين المؤقت. سأضيف أيضًا محاولات لتنفيذ رش الذاكرة (Memory Spraying) ومحاولات كشف التسريبات أو رفع الامتيازات في النظام. هذا مجرد إثبات مفهوم للثغرة.المشكلة الرئيسية في الخلل هي غياب "قفل الدوران" (spinlock) لمزامنة الخيوط. الحل هنا هو:
أولاً (تخصيص Slab/Slub)، تخصيص slab/slub محدد لكل خيط، ولا يمكن لأي خيط التحكم أو التلاعب بحجم ذاكرة خيط آخر.
ثانيًا (المزامنة)، تكوين Workqueue لتجنب التداخل وحالات السباق، حيث ينهي كل خيط مهمته وينتقل إلى خيط آخر بدلاً من تبديل wb في نفس الوقت أو استخدام دالة wb_wakeup_delayed.
ثالثًا (HLE/RTM): تفعيل HLE/RTM في النواة يعتمد على بنية المعالج، ولكن إذا كان يدعم هاتين الميزتين، فلماذا لا نستخدمهما في النواة، على سبيل المثال، في توجيه تدفق البرنامج أو عند حدوث خطأ، محاولة العودة إلى استثناء آخر بدلاً من الانهيار "التراجع" عبر تعليمات مثل XBEGIN، XABORT، XEND.
MIT