
# GhostLock (CVE-2026-43499) लॉक्ड बूटलोडर वाले Android डिवाइसों के लिए कर्नेल एक्सप्लॉइट
लॉक्ड बूटलोडर वाले Android डिवाइसों के लिए कर्नेल एक्सप्लॉइट। बूटलोडर अनलॉक किए बिना या बूट इमेज संशोधित किए बिना अस्थायी रूट + KernelSU इंस्टॉलेशन प्राप्त करता है। मल्टी-डिवाइस ऑफसेट टेबल के साथ कर्नेल संस्करण का रनटाइम स्वतः-पता लगाना।
CVE-2026-43499 — Futex PI (प्रायोरिटी इनहेरिटेंस) यूज़-आफ्टर-फ्री
Linux कर्नेल 5.7 ~ 7.1 को प्रभावित करता है। स्थिर 6.1.175, 6.6.140, 6.12.86 में ठीक किया गया। सितंबर 2026 तक अधिकांश Android डिवाइस पैच रहित हैं।
pselect6 syscall fd_set डेटा को कर्नेल स्टैक पर कॉपी करता है। जब futex PI वेटर तंत्र के साथ संयोजित किया जाता है, तो एक मुक्त स्टैक फ्रेम को rt_mutex_waiter संरचना के रूप में पुनः प्राप्त किया जा सकता है। PI चेन वॉक के दौरान rb-tree रीबैलेंस तब नियंत्रित मानों को मनमाने कर्नेल पतों पर लिखता है।
pselect स्टैक ओवरले के लिए आवश्यक है कि मुक्त rt_mutex_waiter उपयोगकर्ता-नियंत्रित stack_fds क्षेत्र (words 0–14) के भीतर आए। यह कहाँ आता है यह कर्नेल संस्करण के बजाय कंपाइलर PGO/LTO प्रोफाइल द्वारा निर्धारित होता है। देखें स्टैक लेआउट।
6.1 संभाव्यता पर नोट: OPLUS 6.1 कर्नेल PGO द्वारा
do_futexइनलाइन करने के कारण लगातार असंभव हैं। हालाँकि, कुछ गैर-OPLUS 6.1 कर्नेल (vivo) मानक कॉल चेन बनाए रखते हैं और संभव हैं (vivo T4, X Fold3 Pro)। संभाव्यता प्रति-डिवाइस जाँची जानी चाहिए।
दो रूट पथ, डिवाइस क्षमताओं के आधार पर स्वचालित रूप से चुने जाते हैं:
off_ashmem_misc_fops != 0 की आवश्यकता है (BSS में स्थिर miscdevice के साथ C ashmem)।
PI लेखन (mode=4) → miscdevice fops को नकली fops पर पुनर्निर्देशित करें
→ configfs r/w → pipe physrw (1-बाइट सटीक कर्नेल r/w)
→ SELinux enforcing = 0 (एकल बाइट, कोई policycap भ्रष्टाचार नहीं)
→ UMH: system_unbound_wq में work_struct इंजेक्ट करें
→ रूट स्क्रिप्ट → ksud लेट-लोड → KSU इंस्टॉल
उपलब्ध: OnePlus 13, OPPO Pad 4 Pro, 5.10/6.1 C ashmem डिवाइस। Rust ashmem (6.12 GKI) पर उपलब्ध नहीं — हीप-आवंटित miscdevice।
लेखन 1 (mode=1) → SELinux enforcing = 0 (8-बाइट लेखन, आसन्न बाइट्स को भ्रष्ट करता है)
लेखन 2 (mode=2) → task->cred = init_cred (uid=0, सभी क्षमताएँ)
रूट शेल → ksud लेट-लोड → KSU → SELinux नीति सुधार
W1+W2 के बाद, एक्सप्लॉइट SELinux नीति बाइनरी के config फ़ील्ड को पैच करता है (ANDROID_NETLINK_ROUTE + GETNEIGH के लिए |= 0xC0000000) और नेटवर्क कनेक्टिविटी बहाल करने के लिए /sys/fs/selinux/load के माध्यम से पुनः लोड करता है।
ऐप (seccomp) → लेखन 1 → mini-adb TCP → adb shell: पूर्ण एक्सप्लॉइट → रूट
बूट-समय लॉन्चर अलग GhostLock Anchor ऐप द्वारा प्रदान किया जाता है।
NFDS=320 के साथ, core_sys_select कर्नेल स्टैक पर 256-बाइट stack_fds बफर आवंटित करता है:
stack_fds: 0 5 10 14 | 15 20 25 29
├─in─┤─out─┤─ex──┤ ├res_in┤res_out┤res_ex┤
◄── USER CONTROLLED ──►│◄── KERNEL ZEROED ──►
एक्सप्लॉइट fd_set इनपुट बिटमैप्स में नकली वेटर फ़ील्ड (task, lock) रखता है। 6.12 नेस्टेड वेटर (14 words) के लिए: अधिकतम संभव वेटर word = 3। 5.10/6.1 कॉम्पैक्ट वेटर (10 words) के लिए: अधिकतम संभव वेटर word = 7।
वेटर स्थिति कॉल चेन गहराई पर निर्भर करती है:
सभी कर्नेल लेखन लीनियर-मैप उपनाम का उपयोग करते हैं। बूटलोडर kernel_phys_load चुनता है, जो प्रति SoC भिन्न होता है:
| SoC | kernel_phys_load |
|---|---|
| SM8845 (Ace 6T, 15T) | 0xa8000000 |
| SM8750 (OnePlus 13, OPPO Pad 4 Pro) | 0xa8000000 |
गलत मान चुपचाप विफल हो जाता है। इसे रूटेड यूनिट पर पढ़ें:
su -c 'grep -i "Kernel code" /proc/iomem' # c7810000-... → 0xc7800000
रनटाइम पर ओवरराइड करें: KPHYS=0xc7800000 /data/local/tmp/a/e
/data/local/tmp/a/e # डिफ़ॉल्ट (shift=0)
PSELECT_SHIFT=-2 /data/local/tmp/a/e # OnePlus 13 (6.6)
5.10 कर्नेल 0xffffffc008000000 (VA_BITS=39, 6.x डिफ़ॉल्ट 0xffffffc080000000 से भिन्न) का उपयोग करते हैं। यह डिवाइस ऑफसेट प्रविष्टि में kimage_text_base फ़ील्ड के माध्यम से स्वचालित रूप से संभाला जाता है।
make NDK_ROOT=/path/to/android-ndk
या सीधे:
NDK=/path/to/android-ndk
"$NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android35-clang" \
-O2 -Wall -Isrc/core -Isrc/devices -DTARGET_CONFIG_H=\"target.h\" \
src/core/main.c src/core/util.c src/core/slide.c \
src/core/fops.c src/core/pipe_physrw.c src/core/root.c \
src/core/miniadb.c src/core/umh_root.c \
-o ./ghostlock -fPIE -pie -pthread
GhostLock अस्थायी रूट प्रदान करता है। KernelSU इंस्टॉलेशन के लिए ksud की आवश्यकता होती है जो प्रत्येक KMI संस्करण के लिए kernelsu.ko बंडल करता है।
adb shell mkdir -p /data/local/tmp/a
adb push ./ghostlock /data/local/tmp/a/e
adb shell chmod 755 /data/local/tmp/a/e
adb shell /data/local/tmp/a/e
बूट पूरा होने और ADB तैयार होने के बाद चलाएँ।
केवल boot.img की आवश्यकता है — कोई रूट, कोई डिवाइस एक्सेस आवश्यक नहीं।
पूर्ण वर्कफ़्लो के लिए kallsyms टूल्स गाइड देखें, या:
python tools/extract_target.py --kallsyms kallsyms.txt
python tools/extract_btf.py kernel
कर्नेल बाइनरी में futex_wait_requeue_pi को लक्षित करने वाले सभी ब्रांच निर्देशों की खोज करके जाँचें कि क्या do_futex PGO-इनलाइन है। यदि __arm64_sys_futex इसे सीधे कॉल करता है (do_futex को बायपास करते हुए), तो डिवाइस संभवतः संभव नहीं है।
निकाले गए ऑफसेट के साथ src/devices/<name>/offsets.h जोड़ें और इसे src/devices/offsets.h में शामिल करें। उपयुक्त struct offsets मैक्रो का उपयोग करें:
5.10/6.1 कॉम्पैक्ट वेटर डिवाइसों के लिए, .kimage_text_base=0xffffffc008000000ULL भी सेट करें।
केवल अधिकृत सुरक्षा अनुसंधान और शैक्षिक उद्देश्यों के लिए।
| डिवाइस | SoC | कर्नेल | GKI शाखा | SHIFT |
|---|
| OnePlus Ace 6T (PLR110) | SM8845 | 6.12.38 | android16-5 | 0 |
| OnePlus 15 (CPH2745/2747/2749) | SM8850 | 6.12.23 | android16-5 | 0 |
| Xiaomi 17 (pudding) | SM8850 | 6.12.23 / 6.12.69 | android16-5 / android16-6 | 0 |
| OnePlus 13 (IN2060) | SM8750 | 6.6.89 | android15-8 | -2 |
| OPPO Pad 4 Pro | SM8750 | 6.6.89 | android15-8 | -2 |
| डिवाइस | SoC | कर्नेल | नोट्स |
|---|
| OnePlus 15T (PLZ110) | SM8845 | 6.12.38 | Ace 6T के समान कर्नेल |
| OPPO Reno10 Pro+ (CPH2521) | SM8475 | 5.10.236 | 5.10 कॉम्पैक्ट वेटर, वेटर word=0 |
| Vivo X Fold3 Pro (PD2337) | SM8650 | 6.1.124 | 6.1 कॉम्पैक्ट वेटर, वेटर word=3 |
| Vivo T4 | SM8650 | 6.1.145 | 6.1 कॉम्पैक्ट वेटर, वेटर word=3 |
| डिवाइस | SoC | कर्नेल | मूल कारण |
|---|
| OPPO Find X9 Ultra | SM8750 | 6.12.58 | PGO do_futex को समाप्त करता है → वेटर word=14 |
| OnePlus 12 | SM8650 | 6.1.141 | PGO do_futex को इनलाइन करता है → वेटर word=13/19 |
| OnePlus 13R / Ace 5 | SM8650 | 6.1.x | OPLUS 6.1: वेटर word=13 |
| realme RMX5070 | SM6650 | 6.1.141 | OPLUS 6.1: वेटर word=13 |
| OPPO Pad 5 (OPD2502) | MT6878 | 6.1.134 | OPLUS 6.1: वेटर word=13 |
| Motorola Edge 60 Fusion | MT6878 | 6.1.145 | गैर-OPLUS 6.1: समान परिणाम |
| iQOO Neo 10 CN | SM8650 | 6.1.84 | do_futex फ्रेम 0xD0 → वेटर word=-11 |
| OPPO PKW110 | — | 5.15.180 | do_futex फ्रेम 0x140 → वेटर word=-29 |
| iQOO Z9 5G | — | 5.15.178 | do_futex फ्रेम बहुत बड़ा |
| CPH2763 (OPPO) | — | 6.1.115 | OPLUS 6.1: PGO इनलाइन, वेटर word=24 |
| पैटर्न | कॉल चेन | संभव |
|---|
| android16-5 (6.12) | sys_futex → do_futex → fwrpi | ✅ वेटर word=2 |
| android15-8 (6.6) | sys_futex → do_futex → fwrpi | ✅ वेटर word=2 (SHIFT=-2) |
| vivo 6.1 | sys_futex → do_futex → fwrpi | ✅ वेटर word=3 |
| OPLUS 6.1 | sys_futex → fwrpi (PGO इनलाइन) | ❌ वेटर word=13+ |
| android16-6 (X9 Ultra) | sys_futex → fwrpi (PGO इनलाइन) | ❌ वेटर word=14 |
| 5.10 OPLUS | sys_futex → do_futex → fwrpi | ✅ वेटर word=0 |
| SM8650 (vivo T4, X Fold3 Pro) |
0xa8000000 |
| SM8850 (OnePlus 15, Xiaomi 17) | 0xc7800000 |
libksud.so| CI रिलीज़ | ReSukiSU CI से डाउनलोड करें |
| कर्नेल | वेटर लेआउट | मैक्रो |
|---|
| 6.12.x | नेस्टेड (14 words) | STRUCT_OFFSETS_6_12 |
| 6.6.x | नेस्टेड (14 words) | STRUCT_OFFSETS_6_6 |
| 6.1.x (vivo) | कॉम्पैक्ट (10 words) | STRUCT_OFFSETS_6_1 |
| 5.10.x | कॉम्पैक्ट (10 words) | STRUCT_OFFSETS_5_10 |
| फ़ाइल | विवरण |
|---|
src/core/main.c | एक्सप्लॉइट प्रवेश, W1/W2, UMH पथ, बूटस्ट्रैप, रूट स्क्रिप्ट, SELinux नीति सुधार |
src/core/fops.c | pselect मार्ग, PI लेखन, CFI चरण, कॉम्पैक्ट वेटर समर्थन |
src/core/util.c | हीप स्प्रे, KernelSnitch, स्लैब ड्रेन, पेलोड सेटअप |
src/core/pipe_physrw.c | पाइप बफर भौतिक मेमोरी r/w |
src/core/umh_root.c | वर्कक्यू इंजेक्शन के माध्यम से UMH रूट |
src/core/miniadb.c | मिनी ADB क्लाइंट (TCP + RSA प्रमाणीकरण) |
src/core/target.h | मेमोरी लेआउट, struct फ़ील्ड डिफ़ॉल्ट (6.12) |
src/core/runtime_struct_offsets.h | प्रति-डिवाइस struct फ़ील्ड ओवरराइड |
src/devices/offsets.h | डिवाइस ऑफसेट टेबल + STRUCT_OFFSETS_* मैक्रो |
tools/extract_target.py | kallsyms से ऑफसेट निष्कर्षण |
tools/extract_btf.py | BTF से struct ऑफसेट निष्कर्षण |
tools/kallsyms/ | एंड-टू-एंड kallsyms पुनर्प्राप्ति वर्कफ़्लो |