
PD2229B के लिए 43499(ghostlock) संभाव्यता अध्ययन
| आइटम | मान |
|---|---|
| भेद्यता प्रकार | rt_mutex / futex PI पथ में स्टैक-आधारित Use-After-Free |
| परिचय संस्करण | Linux 2.6.39-rc1 (मई 2011, commit 8161239a8bcc) |
| फिक्स संस्करण | मुख्यलाइन 7.1 (commit 3bfdc63936dd), स्थिर शाखाएँ: 6.1.175 / 6.6.140 / 6.12.86 / 6.18.27 / 7.0.4 |
| पूर्वापेक्षा | CONFIG_FUTEX_PI=y (मुख्यधारा कर्नेल में डिफ़ॉल्ट रूप से सक्षम) |
| CVSS | 7.8 High |
| शोषण स्थिरता | NebuSec मूल श्रृंखला 97%, लगभग 5 सेकंड में root |
| kernelCTF इनाम | $92,337 USD |
प्रभावित कर्नेल रेंज:
| आइटम | मान |
|---|---|
| SoC | Qualcomm SM8475 (Snapdragon 8 Gen 1 Plus) |
| कर्नेल संस्करण | 5.10.233-gki-g6e61de9f5b58 #1 SMP PREEMPT (नवंबर 24, 2025) |
| Android संस्करण | 15 (OriginOS 5) |
| संकलन समय | 2025/11/25 |
| Android पैच | 2025/11/01 |
CONFIG_FUTEX_PI | y ✅ |
CONFIG_UNMAP_KERNEL_AT_EL0 | y (KPTI सक्षम) |
kptr_restrict | enforced |
CONFIG_IO_URING | y ✅ (vmlinux प्रतीक द्वारा पुष्टि, और seccomp io_uring_setup को इंटरसेप्ट नहीं करता) |
1. KASLR बाईपास → prefetch timing / PR_SET_MM_MAP auxv
2. UAF ट्रिगर → तीन-थ्रेड PI निर्भरता डेडलॉक → FUTEX_CMP_REQUEUE_PI -EDEADLK लौटाता है
3. स्टैक पुनर्प्राप्ति → PR_SET_MM_MAP auxv को waiter स्टैक फ्रेम में कॉपी करता है
4. rb_erase प्रतिबंधित लेखन → inet6_protos[IPPROTO_UDP] को ओवरराइट करता है
5. CEA + ROP → नियंत्रण प्रवाह अपहरण
6. core_pattern फ्लिप → root shell (97% सफलता दर)
| चरण | स्थिति | विवरण |
|---|---|---|
| 1. KASLR बाईपास | ✅ लागू | perf_event_open + callchain सैंपलिंग साइड-चैनल (OPPO Find X6 Pro 5.15.149 अनुकूलन विधि के समान) |
| 2. UAF ट्रिगर | ✅ लागू | तीन-थ्रेड PI डेडलॉक सफल, FUTEX_CMP_REQUEUE_PI -EDEADLK लौटाता है |
| 3. स्टैक पुनर्प्राप्ति प्रिमिटिव | ❌ आर्किटेक्चरल विफलता | सभी ज्ञात syscall के स्टैक फ्रेम waiter के साथ ओवरलैप नहीं होते (धारा 3 देखें) |
| 4. rb_erase प्रतिबंधित लेखन | ❌ अवरुद्ध | पूर्वापेक्षा पूरी नहीं हुई |
| 5. inet6_protos ओवरराइट | ❌ शुरू नहीं | चरण 4 पर निर्भर |
| 6. ROP / नियंत्रण प्रवाह अपहरण | ❌ शुरू नहीं | चरण 5 पर निर्भर |
| 7. root shell | ❌ शुरू नहीं | चरण 6 पर निर्भर |
futex पथ कुल गहराई:
__arm64_sys_futex 0x90
+ do_futex 0xc0
+ futex_wait_requeue_pi 0x1b0
= 0x300
waiter स्थिति = SYS_SP - 0x300 + 0x20 = SYS_SP - 0x2e0
pselect पथ:
core_sys_select स्टैक फ्रेम 0x1c0, stack_fds sp+0x50 पर
कवरेज रेंज: SYS_SP - 0x1c0 + 0x50 = SYS_SP - 0x170 से शुरू
waiter (SYS_SP - 0x2e0) से अंतर 0x170 (368 बाइट्स) → कोई ओवरलैप नहीं
| # | विधि | सिस्टम कॉल | PD2229 परिणाम | मुख्य विफलता कारण |
|---|---|---|---|---|
| 1 | stamp_prctl | PR_SET_MM_MAP | ❌ EPERM | Android हार्ड इंटरसेप्ट |
| 2 | stamp_pselect | pselect6 (NFDS=320) | ❌ कोई ओवरलैप नहीं | waiter fd_set से 120B नीचे |
| 3 | stamp_pselect | pselect6 (NFDS>336) | ❌ हीप आवंटन | kvmalloc पथ |
| 4 | stamp_socket | MCAST_JOIN_SOURCE_GROUP | ❌ अपर्याप्त कवरेज | केवल lock फ़ील्ड लिखता है |
| 5 | stamp_sendmsg | sendmsg | ❌ waiter से 80B दूर | स्टैक फ्रेम 0x90 गहराई अपर्याप्त |
| 6 | stamp_sendmmsg | sendmmsg | ❌ waiter से 112B दूर | स्टैक फ्रेम अपर्याप्त |
| 7 | stamp_recvmmsg | recvmmsg | ❌ task/lock शून्य करता है | 0x1d0 स्टैक फ्रेम महत्वपूर्ण पॉइंटर्स को नष्ट करता है |
| 8 | stamp_process_vm | process_vm_writev | ❌ कोई ओवरलैप नहीं | चाइल्ड थ्रेड स्टैक अलग से आवंटित |
| 9 | stamp_keyctl | KEYCTL_INSTANTIATE_IOV | ❌ EOPNOTSUPP | सिस्टम कॉल समर्थित नहीं + स्टैक फ्रेम 0x40 |
| 10 | stamp_tcp | TCP_ZEROCOPY_RECEIVE | ❌ स्टैक फ्रेम अपर्याप्त | अनुमानित गहराई पर्याप्त नहीं |
| 11 | stamp_futex | FUTEX_CMP_REQUEUE_PI पुनरावर्ती | ❌ तार्किक रूप से असंभव | UAF विंडो को नष्ट करता है |
| 12 | binder ioctl | BINDER_WRITE_READ | ❌ EACCES | shell के पास /dev/binder अनुमति नहीं |
| 13 | poll | poll | ❌ हीप आवंटन | pollfd हीप पर |
| 14 | epoll_wait | epoll_wait | ❌ फ्रेम बहुत उथला | स्टैक फ्रेम 0xE0 |
| 15 | sched_setattr | sched_setattr | ❌ गहराई अपर्याप्त | स्टैक फ्रेम 0xb0 |
| 16 | timerfd_settime | timerfd_settime | ❌ कोई स्टैक कॉपी नहीं | कोई बड़ा स्टैक बफर नहीं |
| 17 | io_uring_register | IORING_REGISTER_* | ❌ दोहरी विफलता | ①स्टैक फ्रेम केवल 0xF0, copy_from_user लक्ष्य निश्चित sp+0x8 (waiter के sp+0x1D0 से 424 बाइट्स का अंतर); ②हालाँकि io_uring_setup seccomp द्वारा इंटरसेप्ट नहीं किया गया (ENOSYS के बजाय EFAULT लौटाता है), स्टैक लेआउट मेल नहीं खाता |
17/17 सभी विफल।
PD2229 के SM8475 5.10 GKI कंपाइलर (PGO + LTO + BOLT) द्वारा उत्पन्न स्टैक लेआउट, core_sys_select के stack_fds और futex_wait_requeue_pi के rt_mutex_waiter के बीच आर्किटेक्चरल गैर-ओवरलैप का कारण बनता है। यह कंपाइलर द्वारा निर्धारित एक वस्तुनिष्ठ तथ्य है, न कि शोषण तकनीक की समस्या।
JoinChang रिपॉजिटरी स्पष्ट रूप से बताती है: "The pselect stack overlay only works when the freed rt_mutex_waiter lands within the user-controllable region of the stack_fds buffer" — PD2229 इस शर्त को पूरा नहीं करता।
PR_SET_MM_MAP auxv को कर्नेल स्टैक में कॉपी करता हैPR_SET_MM_MAP Android पर EPERM द्वारा इंटरसेप्ट किया गयाPSELECT_SHIFT = -2