
# 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 सिसकॉल fd_set डेटा को कर्नेल स्टैक पर कॉपी करता है। जब futex PI वेटर तंत्र के साथ संयोजित किया जाता है, तो एक मुक्त स्टैक फ़्रेम को rt_mutex_waiter संरचना के रूप में पुनःप्राप्त किया जा सकता है। PI चेन वॉक के दौरान rb-tree रीबैलेंस तब नियंत्रित मानों को मनमाने कर्नेल पतों पर लिखता है।
| उपकरण | 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 |
| OnePlus 15 (PLK110) | SM8850 | 6.12.58 | android16-6 | 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 कॉम्पैक्ट वेटर, वेटर शब्द=0 |
| Sony Xperia 1 IV (nagara) | SM8450 | 5.10.218 | 5.10 कॉम्पैक्ट वेटर, वेटर शब्द=0 |
| OPPO Find X9 Pro (PLG110) | D9400 | 6.12.23 | MediaTek, android16-5 |
| Vivo X200 Ultra (V2454A) | SM8750 | 6.6.89 | C ashmem, पारंपरिक हुक |
| Vivo X Fold3 Pro (PD2337) | SM8650 | 6.1.124 | 6.1 कॉम्पैक्ट वेटर, वेटर शब्द=3 |
| Vivo T4 | SM8650 | 6.1.145 | 6.1 कॉम्पैक्ट वेटर, वेटर शब्द=3 |
pselect स्टैक ओवरले के लिए आवश्यक है कि मुक्त rt_mutex_waiter उपयोगकर्ता-नियंत्रणीय stack_fds क्षेत्र (शब्द 0–14) के भीतर आए। यह कहाँ आता है यह कंपाइलर PGO/LTO प्रोफ़ाइल द्वारा निर्धारित होता है, कर्नेल संस्करण द्वारा नहीं। देखें स्टैक लेआउट।
| उपकरण | SoC | कर्नेल | मूल कारण |
|---|---|---|---|
| OPPO Find X9 Ultra | SM8750 | 6.12.58 | PGO do_futex को हटाता है → वेटर शब्द=14 |
| OnePlus 15 (PLK110) | SM8850 | 6.12.69 | PGO do_futex को इनलाइन करता है → वेटर शब्द=20 |
| OnePlus 12 | SM8650 | 6.1.141 | PGO do_futex को इनलाइन करता है → वेटर शब्द=13/19 |
| OnePlus 13R / Ace 5 | SM8650 | 6.1.x | OPLUS 6.1: वेटर शब्द=13 |
| realme RMX5070 | SM6650 | 6.1.141 | OPLUS 6.1: वेटर शब्द=13 |
| OPPO Pad 5 (OPD2502) | MT6878 | 6.1.134 | OPLUS 6.1: वेटर शब्द=13 |
| Motorola Edge 60 Fusion | MT6878 | 6.1.145 | गैर-OPLUS 6.1: समान परिणाम |
| iQOO Neo 10 CN | SM8650 | 6.1.84 | do_futex फ़्रेम 0xD0 → वेटर शब्द=-11 |
| OPPO PKW110 | — | 5.15.180 | do_futex फ़्रेम 0x140 → वेटर शब्द=-29 |
| iQOO Z9 5G | — | 5.15.178 | do_futex फ़्रेम बहुत बड़ा |
| CPH2763 (OPPO) | — | 6.1.115 | OPLUS 6.1: PGO इनलाइन्ड, वेटर शब्द=24 |
| iQOO 12 | SM8650 | 6.1.145 | 6.1: वेटर शब्द=9, task/lock शून्य क्षेत्र में |
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 write (mode=4) → redirect miscdevice fops to fake fops
→ configfs r/w → pipe physrw (1-byte precise kernel r/w)
→ SELinux enforcing = 0 (single byte, no policycap corruption)
→ UMH: inject work_struct into system_unbound_wq
→ root script → ksud late-load → KSU installed
उपलब्ध: OnePlus 13, OPPO Pad 4 Pro, 5.10/6.1 C ashmem डिवाइस पर। Rust ashmem (6.12 GKI) पर उपलब्ध नहीं — heap-allocated miscdevice।
Write 1 (mode=1) → SELinux enforcing = 0 (8-byte write, corrupts adjacent bytes)
Write 2 (mode=2) → task->cred = init_cred (uid=0, all capabilities)
Root shell → ksud late-load → KSU → SELinux policy fix
W1+W2 के बाद, exploit SELinux policy बाइनरी के config फ़ील्ड को पैच करता है (|= 0xC0000000 for ANDROID_NETLINK_ROUTE + GETNEIGH) और नेटवर्क कनेक्टिविटी बहाल करने के लिए /sys/fs/selinux/load के माध्यम से पुनः लोड करता है।
App (seccomp) → Write 1 → mini-adb TCP → adb shell: full exploit → root
बूट-टाइम लॉन्चर अलग 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 ──►
The exploit fd_set इनपुट बिटमैप में नकली waiter फ़ील्ड (task, lock) रखता है। 6.12 nested waiter (14 words) के लिए: अधिकतम संभव waiter word = 3। 5.10/6.1 compact waiter (10 words) के लिए: अधिकतम संभव waiter word = 7।
waiter की स्थिति कॉल चेन की गहराई पर निर्भर करती है:
| Pattern | Call Chain | Feasible |
|---|---|---|
| android16-5 (6.12) | sys_futex → do_futex → fwrpi | ✅ waiter word=2 |
| android16-6 (6.12.58) | sys_futex → do_futex → fwrpi | ✅ waiter word=2 |
| android16-6 (6.12.69 OPLUS) | sys_futex → fwrpi (PGO inlined) | ❌ waiter word=20 |
| android16-6 (X9 Ultra) | sys_futex → fwrpi (PGO inlined) | ❌ waiter word=14 |
| android15-8 (6.6) | sys_futex → do_futex → fwrpi | ✅ waiter word=2 (SHIFT=-2) |
| vivo 6.1 | sys_futex → do_futex → fwrpi | ✅ waiter word=3 |
| OPLUS 6.1 | sys_futex → fwrpi (PGO inlined) | ❌ waiter word=13+ |
| 5.10 OPLUS | sys_futex → do_futex → fwrpi | ✅ waiter word=0 |
सभी kernel writes linear-map alias का उपयोग करते हैं। bootloader kernel_phys_load चुनता है, जो प्रत्येक SoC के अनुसार भिन्न होता है:
| SoC | kernel_phys_load |
|---|---|
| SM8845 (Ace 6T, 15T) | 0xa8000000 |
| SM8750 (OnePlus 13, OPPO Pad 4 Pro) | 0xa8000000 |
| SM8650 (vivo T4, X Fold3 Pro) | 0xa8000000 |
| SM8850 (OnePlus 15, Xiaomi 17) | 0xc7800000 |
गलत मान चुपचाप विफल हो जाता है। इसे rooted यूनिट पर पढ़ें:
su -c 'grep -i "Kernel code" /proc/iomem' # c7810000-... → 0xc7800000
रनटाइम पर ओवरराइड करें: KPHYS=0xc7800000 /data/local/tmp/a/e
/data/local/tmp/a/e # Default (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