
4.19.152-perf+ Android कर्नेल के लिए GhostLock (CVE-2026-43499) अडैप्टर
लॉक्ड बूटलोडर वाले OnePlus/OPPO/realme डिवाइसों के लिए कर्नेल एक्सप्लॉइट। बूटलोडर अनलॉक किए बिना या बूट इमेज को संशोधित किए बिना रूट + KernelSU इंस्टॉलेशन प्राप्त करता है। मल्टी-डिवाइस ऑफसेट टेबल के साथ कर्नेल संस्करण का रनटाइम पर स्वतः पता लगाना।
CVE-2026-43499 — Futex PI (प्रायोरिटी इनहेरिटेंस) यूज़-आफ्टर-फ्री
Linux कर्नेल 2.6.39 ~ 7.1 को प्रभावित करता है। मेनलाइन 7.1 में ठीक किया गया (कमिट 3bfdc63936dd)। Android GKI 6.12.x असुरक्षित बना हुआ है।
pselect6 सिस्कॉल fd_set डेटा को कर्नेल स्टैक पर कॉपी करता है। जब इसे futex PI वेटर तंत्र के साथ जोड़ा जाता है, तो एक मुक्त स्टैक फ्रेम को rt_mutex_waiter संरचना के रूप में पुनः प्राप्त किया जा सकता है। PI चेन वॉक के दौरान rb-tree रीबैलेंस फिर नियंत्रित मानों को मनमाने कर्नेल पतों पर लिखता है।
| डिवाइस | SoC | कर्नेल | स्थिति |
|---|---|---|---|
| OnePlus Ace 6T (PLR110) | SM8845 | 6.12.38-...-ab14275539 | काम कर रहा है |
| OnePlus Ace 6T (PLR110) | SM8845 | 6.12.38-...-ab14552068 | काम कर रहा है |
| OnePlus 15 (CPH2749) | SM8850 | 6.12.23-...-ab14541642 | काम कर रहा है |
| Xiaomi 17 (pudding) | SM8850 | 6.12.23-...-abogki463945075 | काम कर रहा है |
| Xiaomi 17 (pudding) | SM8850 | 6.12.69-...-abogki514973465 | काम कर रहा है (अगस्त 2026 अपडेट) |
| OnePlus 13 (IN2060) | SM8750 | 6.6.89-...-abogki446052083 | काम कर रहा है (PSELECT_SHIFT=-2) |
| OPPO Pad 4 Pro | SM8750 | 6.6.89-...-ab14358676 | काम कर रहा है (PSELECT_SHIFT=-2) |
| डिवाइस | SoC | कर्नेल | नोट्स |
|---|---|---|---|
| OnePlus 15T (PLZ110) | SM8845 | 6.12.38-...-ab14552068 | Ace 6T के समान कर्नेल। QEMU सत्यापित SP diff=-64। |
pselect स्टैक ओवरले तभी काम करता है जब मुक्त rt_mutex_waiter stack_fds बफर के उपयोगकर्ता-नियंत्रित क्षेत्र के भीतर आता है। वेटर कहाँ आता है यह कंपाइलर आउटपुट (PGO + LTO) द्वारा निर्धारित होता है, कर्नेल संस्करण द्वारा नहीं। विवरण के लिए स्टैक लेआउट देखें।
| डिवाइस | SoC | कर्नेल | कारण |
|---|---|---|---|
| OPPO Find X9 Ultra | SM8750 | 6.12.58-android16-6 | PGO do_futex फ्रेम को हटा देता है → SP diff=+32, वेटर वर्ड=14। कोई सुरक्षित शिफ्ट मौजूद नहीं है। |
| OPPO Find X7 | — | 6.1.157 | 6.1 GKI: वेटर वर्ड 13 पर (सभी 6.1 OPLUS/GKI डिवाइस) |
| realme RMX5070 | SM6650 | 6.1.141 | 6.1 GKI: वेटर वर्ड 13 पर |
| realme RMX3852 | SM8635 | 6.1.141 | RMX5070 के समान 6.1 ब्रांच |
| OnePlus 13R / Ace 5 | SM8650 | 6.1.x | समान 6.1 ब्रांच |
| OnePlus 12 | SM8650 | 6.1.141 | 6.1 GKI: do_futex PGO इनलाइन, वेटर वर्ड=13/19 |
| OPPO Pad 5 (OPD2502) | MT6878 | 6.1.134 | समान 6.1 ब्रांच |
| OPPO PKW110 | — | 5.15.180 | do_futex फ्रेम 0x140 (सामान्य से 4.5x) → वेटर वर्ड=-29, पहुंच योग्य नहीं |
| Motorola Edge 60 Fusion | MT6878 | 6.1.145 | 6.1 GKI: वेटर वर्ड 13 पर (गैर-OPLUS, समान परिणाम) |
| iQOO Z9 5G | — | 5.15.178 | do_futex फ्रेम बहुत बड़ा, वेटर पहुंच योग्य नहीं। OPLUS डिवाइस नहीं है (vivo)। |
डिवाइस क्षमताओं के आधार पर स्वचालित रूप से चुने गए दो रूट पथ:
off_ashmem_misc_fops != 0 की आवश्यकता है (BSS में स्टैटिक miscdevice के साथ C ashmem)।
PI write (mode=4) → redirect miscdevice fops to fake fops (via W0 pi_tree)
configfs r/w established
→ pipe physrw (1-byte precise kernel r/w)
→ SELinux enforcing = 0 (single byte, no policycap corruption)
→ UMH: inject work_struct into system_unbound_wq
kernel executes /data/local/tmp/a/e --umh as UID 0
→ root script → ksud late-load → KSU installed
पथ B से लाभ:
selinux_state.policycap को दूषित नहीं करता (OnePlus 13 पर नेटवर्क समस्याएँ ठीक करता है)वर्तमान में उपलब्ध: OnePlus 13 (कर्नेल 6.6, C ashmem)। Rust ashmem डिवाइसों (6.12 GKI) पर उपलब्ध नहीं — miscdevice हीप-आवंटित है, पता कंपाइल समय पर अनुमानित नहीं किया जा सकता।
जब UMH ऑफसेट या C ashmem misc_fops उपलब्ध नहीं होते तब उपयोग किया जाता है।
Write 1 (mode=1) → SELinux enforcing = 0
(low byte of kernel ptr = 0x00, 8-byte write)
Write 2 (mode=2) → task->cred = init_cred
(uid=0, all capabilities)
Root shell → ksud late-load (KernelSU LKM)
→ su -c load_policy (fix SELinux policycap)
→ dynamic manager registration
App (seccomp) → Write 1 (no perf needed)
→ mini-adb connect TCP (port from /data/local/tmp/a/adb_port, default 5555)
→ adb shell: full exploit (perf works, no seccomp)
→ root → KSU → network fix
BOOT_COMPLETED → BootCompletedReceiver
├─ su available → skip (soft reboot / already rooted)
└─ no root → GhostlockService → setsid exploit --bootstrap
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 ──►
एक्सप्लॉइट नकली वेटर फ़ील्ड (task, lock) को fd_set इनपुट बिटमैप्स में लिखता है। इसके काम करने के लिए, वेटर के task और lock फ़ील्ड नियंत्रणीय क्षेत्र (वर्ड 0-14) में आने चाहिए।
Ace 6T ✅ (waiter at word 2):
░░████████████████░░│░░░░░░░░░░░░░░░░░░
▲waiter t l │
task/lock controllable
RMX5070 ❌ (waiter at word 13):
░░░░░░░░░░░░░████│██████████████░░░░░░
▲ │ t l
waiter task/lock ZEROED
व्यवहार्यता नियम: वेटर वर्ड + 11 (rt_waiter_node में लॉक ऑफसेट) ≤ 14 होना चाहिए। अधिकतम व्यवहार्य वेटर वर्ड 3 है।
वेटर की स्थिति कंपाइलर के स्टैक फ्रेम लेआउट (PGO + LTO + BOLT ऑप्टिमाइज़ेशन प्रोफाइल) द्वारा निर्धारित होती है, जो प्रति SoC ब्रांच अलग-अलग होती है। समान कर्नेल संस्करण के अलग-अलग SoC पर अलग-अलग लेआउट हो सकते हैं।
सभी कर्नेल राइट इमेज के लीनियर-मैप एलियास से होकर जाते हैं:
data_addr(x) = PAGE_OFFSET + (kernel_phys_load - PHYS_OFFSET) + (x - KIMAGE_TEXT_BASE)
बूटलोडर kernel_phys_load चुनता है, इसलिए यह प्रति SoC अलग-अलग होता है और boot.img या DT में नहीं होता। struct kernel_offsets में प्रति-डिवाइस फ़ील्ड; 0 = target.h डिफ़ॉल्ट का उपयोग करें।
| SoC | kernel_phys_load |
|---|---|
| SM8845 (Ace 6T, 15T) | 0xa8000000 |
| SM8750 (OnePlus 13, OPPO Pad 4 Pro) | 0xa8000000 |
| SM8850 (OnePlus 15, Xiaomi 17) | 0xc7800000 |
गलत मान चुपचाप विफल हो जाता है — राइट फिर भी मैप की गई RAM में पहुंचता है, इसलिए कोई क्रैश नहीं होता और कोई प्रभाव नहीं पड़ता। इसे PSELECT_SHIFT समस्या मत समझिए। इसे उसी मॉडल के रूटेड यूनिट पर पढ़ें (Kernel code _stext पर शुरू होता है; _text 0x10000 नीचे है):
su -c 'grep -i "Kernel code" /proc/iomem' # c7810000-... -> 0xc7800000
अलग-अलग कर्नेल वेटर को नियंत्रणीय क्षेत्र के भीतर अलग-अलग स्थितियों पर रखते हैं। समायोजन के लिए PSELECT_SHIFT का उपयोग करें:
# Default (Ace 6T + OnePlus 15, 6.12): shift=0
/data/local/tmp/a/e
# OnePlus 13 (6.6): shift=-2
PSELECT_SHIFT=-2 /data/local/tmp/a/e