
GhostLock (CVE-2026-43499) para o Galaxy S26
CVE-2026-43499 portado para a série Samsung Galaxy S26 — Android 16 / GKI 6.12. Um binário, três linhas de kernel, correspondência dinâmica de parâmetros em tempo de execução: teoricamente cobre toda a série S26 sem compilação por build.
A maioria dos esforços de portabilidade do GhostLock visa um único dispositivo ou um único firmware. Este repositório é um port novo que reescreve todos os mecanismos para o alvo S26 e espera-se que cubra toda a família
https://github.com/diabl0w/DFRoot por @diabl0w é uma solução mais simples e melhor. Recomendo usá-la.
O exploit neste repositório foi integrado em https://github.com/snothin/GhostSam. O GhostSam é mais complexo; o DFRoot é mais puro e simples.
Enquanto mantinha o snothin/CyberMeowfia, descobri que o canal physrw original do pipe era instável (cortava a rede), então abandonei essa rota e explorei alternativas. Mais tarde descobri que o monovibe tinha ido mais longe no caminho que eu estava explorando, adotei a abordagem e, após depuração repetida, este repositório tomou forma.
uid=0(root) context=u:r:kernel:s0; shell root
persistente via su_daemon em /data/local/tmp/temp_su.sock.work_struct em
system_unbound_wq cuja função é call_usermodehelper_exec_work, então o kernel
executa nosso daemon com credenciais de init. A proteção EL2 do KDP sobre páginas de credenciais nunca é
acionada.logcat) antes do exec; a regra safeplace do DEFEX vê um caminho na whitelist.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
Os parâmetros são correspondidos por linha de kernel (três linhas: cn, intl, exynos), não
por build individual. Builds OTA desconhecidos recorrem à linha conhecida mais próxima por modelo
e CSC. Modelos completamente desconhecidos são rejeitados (fail-closed). A lista de builds
incorporada é autoritativa em exploit/src/params_table.c.
Uma linha de kernel personalizada para firmware não listado pode ser fornecida em tempo de execução
(/data/local/tmp/ghostlock-lines.conf, veja Ambiente).
Veja PORTING.md para os parâmetros necessários ao portar para um novo
dispositivo ou firmware.
| Modelo | Codinome do dispositivo | Builds testados |
|---|---|---|
| SM-S942x (S26 Snapdragon) | m1q | S9420ZCS4AZG1, S942QOPU1AZDE, S942U1UES4AZG3, S942USQS4AZG3 |
| SM-S947x (S26+ Snapdragon) | m2q | S9470ZCS4AZG1, S947USQS4AZG3 |
| SM-S9480 (S26 Ultra CN) | m3q | S9480ZCS3AZF1, S9480ZCS4AZG1 (build testado) |
| SM-S948x (S26 Ultra) | m3q | S9480ZHS4AZG1, S948BXXS4AZG5/6, S948NKSS4AZG3, S948U1UES2AZE1, S948USQS4AZG3 |
| SM-S942B (S26 Exynos) | m1s | S942BXXS4AZG5 |
| SM-S947B (S26+ Exynos) | m2s | S947BXXS3AZF1, S947BXXS4AZG5 |
Requer o Android NDK (r26+). Basta executar:
cd exploit
make preload
# produces build/bin/preload.so (exploit) and build/embed/su_daemon_aarch64_pie (embedded daemon)
Envie preload.so, su_daemon_aarch64_pie e ksud para o dispositivo (execute a partir de uma sessão
de shell adb, 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"
O exploit é probabilístico (uma corrida) e geralmente precisa de tentativas repetidas. Em uma
execução bem-sucedida, o su_daemon escuta em /data/local/tmp/temp_su.sock, e qualquer
processo local pode se conectar.
A proteção de boot-claim (/data/local/tmp/ghostlock-boot.log) registra o resultado da
execução de cada boot; uma segunda execução da cadeia completa no mesmo boot é rejeitada. Limpe o
arquivo ou defina BOOT_FORCE=1 para ignorar.
Toda opção existe como variável de ambiente, chave de arquivo de configuração
(/data/local/tmp/ghostlock.conf, um key=value por linha) e flag de CLI
(--key=value); a precedência é padrões < arquivo < env < CLI. Executar com
--help imprime a tabela completa (nomes, padrões, intervalos, flags de recarga).
Os interruptores de comportamento:
| Variável de ambiente | Chave | Efeito |
|---|---|---|
BOOT_FORCE=1 | boot.force | permitir uma reexecução dentro do mesmo boot |
GHOSTLOCK_NO_KSU=1 | ksu.skip | pular o late-load do KernelSU: root temporário permissivo + socket su apenas; reiniciar restaura o dispositivo (risco Knox) |
ALLOW_SHELL=1 | root.allow_shell | adicionar o uid do shell à allowlist do KernelSU durante o late-load |
PARAMS_CUSTOM=1 | params.custom | usar apenas a linha de kernel personalizada (falha fechada se inutilizável) |
As chaves restantes ajustam a corrida (walk.*, heap.*, ...). A linha exynos
injeta KSUD_TREE=exynos para o ksud emparelhado (interface do driver 32601); outras
linhas não carregam substituição de tree. Linhas de kernel personalizadas para firmware não listado vão em
/data/local/tmp/ghostlock-lines.conf (line_id=... mais um campo por linha,
veja PORTING.md).