
GhostLock (CVE-2026-43499) für das Galaxy S26
CVE-2026-43499 auf die Samsung Galaxy S26-Serie portiert — Android 16 / GKI 6.12. Eine Binärdatei, drei Kernel-Zeilen, dynamisches Parameter- Matching zur Laufzeit: deckt theoretisch die gesamte S26-Serie ohne Kompilierung pro Build ab.
Die meisten GhostLock-Portierungsbemühungen zielen auf ein einzelnes Gerät oder eine einzelne Firmware ab. Dieses Repository ist ein frischer Port, der jeden Mechanismus für das S26- Ziel neu schreibt und voraussichtlich die gesamte Familie abdecken wird
https://github.com/diabl0w/DFRoot von @diabl0w ist eine einfachere und bessere Lösung. Ich empfehle, sie zu verwenden.
Der Exploit in diesem Repository wurde in https://github.com/snothin/GhostSam integriert. GhostSam ist komplexer; DFRoot ist reiner und einfacher.
Während ich snothin/CyberMeowfia wartete, stellte ich fest, dass der ursprüngliche Pipe-Physrw-Kanal instabil war (er trennte das Netzwerk), also verwarf ich diesen Weg und erkundete Alternativen. Später stellte ich fest, dass monovibe auf dem von mir erkundeten Pfad weiter fortgeschritten war, übernahm den Ansatz und nach wiederholtem Debugging nahm dieses Repository Gestalt an.
uid=0(root) context=u:r:kernel:s0; persistente
Root-Shell über su_daemon auf /data/local/tmp/temp_su.sock.work_struct auf
system_unbound_wq, deren Funktion call_usermodehelper_exec_work ist, sodass der Kernel
unseren Daemon mit Init-Credentials ausführt. KDPs EL2-Guard auf Credential-Seiten wird nie
ausgelöst.logcat) vor dem Exec bind-gemountet; DEFEXs Safeplace-Regel sieht einen Whitelist-Pfad.tracefs slide oracle → KASLR base
pselect + futex PI race
→ one aligned qword kernel write
→ attr carrier (controller + data misc nodes)
the write links both nodes
clearing controller.minor makes the next open land on data
data fd reads/writes any kernel address
→ UMH root (workqueue injection)
forged work_struct on system_unbound_wq
ptmx open/close storm wakes a worker
kernel execs daemon with init creds
→ KernelSU late-load: ksud bind-mounted over logcat in a private
mount namespace (DEFEX safeplace sees a whitelisted path)
→ su_daemon keeps serving /data/local/tmp/temp_su.sock
Parameter werden anhand der Kernel-Zeile abgeglichen (drei Zeilen: cn, intl, exynos), nicht
anhand des individuellen Builds. Unbekannte OTA-Builds fallen auf die nächstgelegene bekannte Zeile nach Modell
und CSC zurück. Vollständig unbekannte Modelle werden abgelehnt (Fail-Closed). Die eingebettete Build-
Liste ist maßgeblich in exploit/src/params_table.c.
Eine benutzerdefinierte Kernel-Zeile für nicht aufgeführte Firmware kann zur Laufzeit bereitgestellt werden
(/data/local/tmp/ghostlock-lines.conf, siehe Umgebung).
Siehe PORTING.md für die Parameter, die beim Portieren auf ein neues
Gerät oder eine neue Firmware benötigt werden.
| Modell | Geräte-Codename | Getestete Builds |
|---|---|---|
| SM-S942x (S26 Snapdragon) | m1q | S9420ZCS4AZG1, S942QOPU1AZDE, S942U1UES4AZG3, S942USQS4AZG3 |
| SM-S947x (S26+ Snapdragon) | m2q | S9470ZCS4AZG1, S947USQS4AZG3 |
| SM-S9480 (S26 Ultra CN) | m3q | S9480ZCS3AZF1, S9480ZCS4AZG1 (getesteter Build) |
| SM-S948x (S26 Ultra) | m3q | S9480ZHS4AZG1, S948BXXS4AZG5/6, S948NKSS4AZG3, S948U1UES2AZE1, S948USQS4AZG3 |
| SM-S942B (S26 Exynos) | m1s | S942BXXS4AZG5 |
| SM-S947B (S26+ Exynos) | m2s | S947BXXS3AZF1, S947BXXS4AZG5 |
Erfordert Android NDK (r26+). Einfach ausführen:
cd exploit
make preload
# produces build/bin/preload.so (exploit) and build/embed/su_daemon_aarch64_pie (embedded daemon)
Schiebe preload.so, su_daemon_aarch64_pie und ksud auf das Gerät (Ausführung aus einer adb-
Shell-Sitzung, uid 2000):
adb push exploit/build/bin/preload.so /data/local/tmp/
adb push exploit/build/embed/su_daemon_aarch64_pie /data/local/tmp/cve-2026-43499-root
adb push <ksud> /data/local/tmp/ksud
adb shell chmod 755 /data/local/tmp/cve-2026-43499-root /data/local/tmp/ksud
# Single attempt:
adb shell "env LD_PRELOAD=/data/local/tmp/preload.so sh"
Der Exploit ist probabilistisch (ein Race) und benötigt normalerweise wiederholte Versuche. Bei einem
erfolgreichen Durchlauf lauscht su_daemon auf /data/local/tmp/temp_su.sock, und jeder
lokale Prozess kann sich verbinden.
Der Boot-Claim-Guard (/data/local/tmp/ghostlock-boot.log) zeichnet das Ergebnis des
Laufs jedes Boots auf; ein zweiter Full-Chain-Lauf im selben Boot wird abgelehnt. Lösche die
Datei oder setze BOOT_FORCE=1, um dies zu überschreiben.
Jede Option existiert als Env-Variable, als Konfigurationsdatei-Schlüssel
(/data/local/tmp/ghostlock.conf, ein key=value pro Zeile) und als CLI-Flag
(--key=value); die Priorität ist defaults < file < env < CLI. Ausführung mit
--help gibt die vollständige Tabelle aus (Namen, Standardwerte, Bereiche, Reload-Flags).
Die Verhaltensschalter:
| Env-Variable | Schlüssel | Wirkung |
|---|---|---|
BOOT_FORCE=1 | boot.force | erlaubt einen erneuten Lauf innerhalb desselben Boots |
GHOSTLOCK_NO_KSU=1 | ksu.skip | überspringt den KernelSU Late-Load: nur permissiver temporärer Root + su-Socket; Neustart stellt das Gerät wieder her (Knox-Risiko) |
ALLOW_SHELL=1 | root.allow_shell | fügt die Shell-uid während des Late-Loads zur KernelSU-Allowlist hinzu |
PARAMS_CUSTOM=1 | params.custom | verwendet nur die benutzerdefinierte Kernel-Zeile (Fail-Closed, falls unbrauchbar) |
Die übrigen Schlüssel stimmen das Race ab (walk.*, heap.*, ...). Die Exynos-Zeile
injiziert KSUD_TREE=exynos für das zugehörige ksud (Treiber-Schnittstelle 32601); andere
Zeilen tragen keine Tree-Überschreibung. Benutzerdefinierte Kernel-Zeilen für nicht aufgeführte Firmware gehören in
/data/local/tmp/ghostlock-lines.conf (line_id=... plus ein Feld pro Zeile,
siehe PORTING.md).