
UpdatedAug 8, 2026
cve-2026-43499 — Updated!
PD2229B的43499(ghostlock)可行性研究
Zusammenfassung des Exploit-Fehlschlags von GhostLock auf PD2229 (SM8475, 5.10.233 GKI)
1. Schwachstellen- und Gerätefakten
1.1 Grundlegende Informationen zu CVE-2026-43499 (GhostLock)
| Element | Wert |
|---|---|
| Schwachstellentyp | Use-After-Free auf dem Stack im rt_mutex / futex-PI-Pfad |
| Eingeführt in Version | Linux 2.6.39-rc1 (Mai 2011, Commit 8161239a8bcc) |
| Behoben in Version | Hauptlinie 7.1 (Commit 3bfdc63936dd), stabile Zweige: 6.1.175 / 6.6.140 / 6.12.86 / 6.18.27 / 7.0.4 |
| Voraussetzungen | CONFIG_FUTEX_PI=y (standardmäßig in Mainstream-Kerneln aktiviert) |
| CVSS | 7.8 Hoch |
| Exploit-Stabilität | 97 % in der ursprünglichen NebuSec-Kette, Root in ca. 5 Sekunden |
| kernelCTF-Belohnung | 92.337 USD |
Betroffener Kernel-Bereich:
- 2.6.39 ≤ Linux < 6.1.175 ✅ Betroffen
- 6.2 ≤ Linux < 6.6.140 ✅ Betroffen
- 6.7 ≤ Linux < 6.12.86 ✅ Betroffen
- 6.13 ≤ Linux < 6.18.27 ✅ Betroffen
- 6.19 ≤ Linux < 7.0.4 ✅ Betroffen
- Android GKI 5.10 ist in keinem der Fix-Zweige enthalten → 5.10.233 auf PD2229 theoretisch betroffen
1.2 PD2229-Gerätetests
| Element | Wert |
|---|---|
| SoC | Qualcomm SM8475 (Snapdragon 8 Gen 1 Plus) |
| Kernel-Version | 5.10.233-gki-g6e61de9f5b58 #1 SMP PREEMPT (24. Nov. 2025) |
| Android-Version | 15 (OriginOS 5) |
| Build-Zeitpunkt | 25.11.2025 |
| Android-Patchlevel | 01.11.2025 |
CONFIG_FUTEX_PI | y ✅ |
CONFIG_UNMAP_KERNEL_AT_EL0 | y (KPTI aktiviert) |
kptr_restrict | erzwungen |
CONFIG_IO_URING | y ✅ (durch vmlinux-Symbole bestätigt, seccomp blockiert io_uring_setup nicht) |
2. Ideale Exploit-Kette vs. tatsächlicher Fortschritt auf PD2229
2.1 Ursprüngliche NebuSec-Kette (erfolgreich auf x86_64 / Pixel 10)
1. KASLR-Umgehung → prefetch timing / PR_SET_MM_MAP auxv
2. UAF-Auslösung → Drei-Thread-PI-Abhängigkeits-Deadlock → FUTEX_CMP_REQUEUE_PI gibt -EDEADLK zurück
3. Stack-Recycling → PR_SET_MM_MAP kopiert auxv in den Waiter-Stackframe
4. rb_erase begrenztes Schreiben → Überschreiben von inet6_protos[IPPROTO_UDP]
5. CEA + ROP → Kontrollfluss-Übernahme
6. core_pattern-Flip → Root-Shell (97 % Erfolgsrate)
2.2 Tatsächlicher Fortschritt der einzelnen Phasen auf PD2229
| Phase | Status | Beschreibung |
|---|---|---|
| 1. KASLR-Umgehung | ✅ Implementiert | perf_event_open + Callchain-Sampling-Seitenkanal (gleiche Methode wie bei der OPPO Find X6 Pro 5.15.149-Anpassung) |
| 2. UAF-Auslösung | ✅ Implementiert | Drei-Thread-PI-Deadlock erfolgreich, FUTEX_CMP_REQUEUE_PI gibt -EDEADLK zurück |
| 3. Stack-Recycling-Primitive | ❌ Architektonischer Fehlschlag | Stackframes aller bekannten Syscalls überlappen nicht mit dem Waiter (Details in Abschnitt 3) |
| 4. rb_erase begrenztes Schreiben | ❌ Blockiert | Voraussetzungen nicht erfüllt |
| 5. inet6_protos-Überschreiben | ❌ Nicht begonnen | Hängt von Phase 4 ab |
| 6. ROP / Kontrollfluss-Übernahme | ❌ Nicht begonnen | Hängt von Phase 5 ab |
| 7. Root-Shell | ❌ Nicht begonnen | Hängt von Phase 6 ab |
3. Ergebnisse der erschöpfenden Suche nach Stack-Recycling-Primitiven (PD2229-Tests)
3.1 Wichtige Berechnungen zum Stackframe-Layout
Gesamttiefe des futex-Pfads:
__arm64_sys_futex 0x90
+ do_futex 0xc0
+ futex_wait_requeue_pi 0x1b0
= 0x300
Waiter-Position = SYS_SP - 0x300 + 0x20 = SYS_SP - 0x2e0
pselect-Pfad:
core_sys_select Stackframe 0x1c0, stack_fds bei sp+0x50
Überdeckungsbereich: ab SYS_SP - 0x1c0 + 0x50 = SYS_SP - 0x170
Abstand zum Waiter (SYS_SP - 0x2e0) beträgt 0x170 (368 Bytes) → keine Überlappung
3.2 17 getestete Stack-Schreibmethoden
| # | Methode | Syscall | PD2229-Ergebnis | Hauptfehlergrund |
|---|---|---|---|---|
| 1 | stamp_prctl | PR_SET_MM_MAP | ❌ EPERM | Von Android hart blockiert |
| 2 | stamp_pselect | pselect6 (NFDS=320) | ❌ Keine Überlappung | Waiter liegt 120B unterhalb von fd_set |
| 3 | stamp_pselect | pselect6 (NFDS>336) | ❌ Heap-Allokation | kvmalloc-Pfad |
| 4 | stamp_socket | MCAST_JOIN_SOURCE_GROUP | ❌ Unzureichende Überdeckung | Schreibt nur lock-Feld |
| 5 | stamp_sendmsg | sendmsg | ❌ 80B vom Waiter entfernt | Stackframe 0x90 nicht tief genug |
| 6 | stamp_sendmmsg | sendmmsg | ❌ 112B vom Waiter entfernt | Stackframe unzureichend |
| 7 | stamp_recvmmsg | recvmmsg | ❌ Löscht task/lock | 0x1d0-Stackframe zerstört kritische Zeiger |
| 8 | stamp_process_vm | process_vm_writev | ❌ Keine Überlappung | Sub-Thread-Stack separat zugewiesen |
| 9 | stamp_keyctl | KEYCTL_INSTANTIATE_IOV | ❌ EOPNOTSUPP | Syscall nicht unterstützt + Stackframe 0x40 |
| 10 | stamp_tcp | TCP_ZEROCOPY_RECEIVE | ❌ Stackframe unzureichend | Geschätzte Tiefe nicht ausreichend |
| 11 | stamp_futex | FUTEX_CMP_REQUEUE_PI rekursiv | ❌ Logisch nicht machbar | Zerstört UAF-Fenster |
| 12 | binder ioctl | BINDER_WRITE_READ | ❌ EACCES | Shell hat keine /dev/binder-Berechtigung |
| 13 | poll | poll | ❌ Heap-Allokation | pollfd liegt auf dem Heap |
| 14 | epoll_wait | epoll_wait | ❌ Frame zu flach | Stackframe 0xE0 |
| 15 | sched_setattr | sched_setattr | ❌ Tiefe unzureichend | Stackframe 0xb0 |
| 16 | timerfd_settime | timerfd_settime | ❌ Kein Stack-Kopieren | Kein großer Stack-Puffer |
| 17 | io_uring_register | IORING_REGISTER_* | ❌ Doppelter Fehlschlag | ①Stackframe nur 0xF0, copy_from_user-Ziel fest bei sp+0x8 (424 Bytes Differenz zum Waiter bei sp+0x1D0); ②Obwohl io_uring_setup nicht von seccomp blockiert wird (gibt EFAULT statt ENOSYS zurück), passt das Stack-Layout nicht |
17/17 alle fehlgeschlagen.
3.3 Grundursache des Fehlschlags
Das vom SM8475-5.10-GKI-Compiler (PGO + LTO + BOLT) auf PD2229 erzeugte Stack-Layout führt dazu, dass stack_fds von core_sys_select und rt_mutex_waiter von futex_wait_requeue_pi architektonisch nicht überlappen. Dies ist eine objektive, vom Compiler bestimmte Tatsache und kein Problem der Exploit-Technik.
Das JoinChang-Repository stellt klar: "The pselect stack overlay only works when the freed rt_mutex_waiter lands within the user-controllable region of the stack_fds buffer" — PD2229 erfüllt diese Bedingung nicht.
4. Vergleichende Analyse öffentlicher Referenz-Repositories
NebuSec/CyberMeowfia — Ursprüngliches Exploit-Framework
- Repository: https://github.com/NebuSec/CyberMeowfia
- Ziel: x86_64 Linux / Pixel 10 (6.x GKI)
- Stack-Recycling:
PR_SET_MM_MAPkopiert auxv auf den Kernel-Stack - Erfolgsrate: 97 %, ca. 5 Sekunden bis zur [Root-Shell]
- PD2229-Anwendbarkeit: ❌
PR_SET_MM_MAPwird auf Android mit EPERM blockiert
JoinChang/ghostlock-oneplus — OnePlus-Bootloader-Entsperrung (Jailbreak)
- Repository: https://github.com/JoinChang/ghostlock-oneplus
- Verifizierte Geräte:
- OnePlus Ace 6T (PLR110, SM8845) — 6.12.38 GKI ✅
- OnePlus 15 (PLK110, SM8845) — 6.12.23 GKI ✅
- Technische Kernpunkte:
- Automatische Offset-Extraktion: kallsyms (28) + BTF (57) + abgeleitet (9) + Konstanten (12) = 103/103
- pselect-Stack-Overlay, SP-Differenz = -64
PSELECT_SHIFT = -2- Exploit-Kette: futex-UAF → gefälschter Waiter → pselect kontrolliert Stack → rb_erase begrenztes Schreiben → selinux_state.enforcing=0 → cred mit init_cred überschrieben
- Ausdrücklich als nicht machbar erklärt: "Not Feasible (stack layout incompatible)" — gilt nur für Kernel, bei denen pselect stack_fds und Waiter überlappen
- PD2229-Anwendbarkeit: ❌ Kernel-Generation passt nicht (6.12 vs. 5.10), und Stack-Layout überlappt nicht
p2p3p/GhostLock-for-OnePlus — Vollständiger OnePlus-6.12-Exploit
- Repository: https://github.com/p2p3p/GhostLock-for-OnePlus
- Verifiziert: OnePlus Ace 6T (SM8845, 6.12.38) ✅
- PD2229-Anwendbarkeit: ❌ Wie JoinChang, Kernel-Generation passt nicht