
CVE-2025-39866 के लिए प्रमाण की अवधारणा (UAF और दौड़ की स्थिति)
लेखक: Byte Reaper
यह POC CVE-2025-39866 भेद्यता का शोषण करने का प्रयास करता है, जो Linux सिस्टम < 6.12.16 में थ्रेड्स के लिए स्पिनलॉक की कमी के कारण एक रेस कंडीशन उत्पन्न करता है। पहला थ्रेड wb स्ट्रक्ट का उपयोग करने का प्रयास करता है जबकि थ्रेड 2 इस स्ट्रक्ट को मुक्त कर देता है, जिससे पहला थ्रेड एक फ्री पॉइंटर से निपटता है और सिस्टम में कर्नेल पैनिक हो जाता है। हम भेद्यता के शोषण के विचार को निम्नलिखित चरणों में विभाजित कर सकते हैं:
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
बग की मुख्य समस्या थ्रेड सिंक्रोनाइज़ेशन के लिए "स्पिनलॉक" की कमी है। यहाँ समाधान है:
पहला (Slab/Slub Allocation), प्रत्येक थ्रेड के लिए एक विशिष्ट slab/slub आवंटित करें, और कोई भी थ्रेड दूसरे थ्रेड की मेमोरी आकार को नियंत्रित या हेरफेर नहीं कर सकता।
दूसरा (Synchronization), Workqueue को इस प्रकार कॉन्फ़िगर करें कि हस्तक्षेप और रेस कंडीशन से बचा जा सके, जहाँ प्रत्येक थ्रेड अपना कार्य पूरा करता है और दूसरे थ्रेड पर जाता है, बजाय एक ही समय में WB स्विच करने या wb_wakeup_delayed फ़ंक्शन का उपयोग करने के।
तीसरा (HLE/RTM): कर्नेल में HLE/RTM को सक्रिय करना प्रोसेसर आर्किटेक्चर पर निर्भर करता है, लेकिन यदि यह इन दोनों सुविधाओं का समर्थन करता है, तो कर्नेल में इनका उपयोग क्यों न करें, उदाहरण के लिए, प्रोग्राम के प्रवाह को निर्देशित करने में या जब कोई त्रुटि होती है, तो XBEGIN, XABORT, XEN जैसे निर्देशों के माध्यम से क्रैश "रोलबैक" करने के बजाय किसी अन्य अपवाद पर वापस जाने का प्रयास करें।
MIT