
Exploit de kernel para CVE-2026-43499 en Samsung Galaxy A17 que logra root mediante bypass de KDP, recuperación de KASLR y ejecución de workqueue forjada con shell persistente.
Cadena de explotación completa de usuario a root para CVE-2026-43499 ("GhostLock") en el Samsung Galaxy A17 SM-A175F, ejecutando Android 16 / GKI 6.12.
La cadena comienza desde las primitivas públicas de GhostLock y termina con un helper en modo usuario ejecutándose como:
uid=0(root) gid=0(root) groups=0(root)
context=u:r:kernel:s0
También inicia un shell root persistente por arranque a través de g4d / g4sh y sale sin un kernel panic.
📖 Análisis técnico completo:
https://www.mobilehackinglab.com/blog/cve-2026-43499-ghostlock-a17-root-shell
Nota de investigación
No descubrimos CVE-2026-43499. El crédito por la vulnerabilidad original y la investigación de IonStack corresponde a Nebula Security.
Este repositorio documenta nuestro port independiente al Samsung Galaxy A17, los cambios necesarios para las protecciones del kernel de Samsung y una nueva etapa final de explotación.
Solo para fines de investigación de seguridad autorizada y educativos.
| CVE | CVE-2026-43499 — "ghostlock" |
| Dispositivo | Samsung Galaxy A17 (SM-A175F, mt6789) |
| GPU | Mali-G57 |
| Kernel | 6.12.23-android16-5-abA175FXXS3BZA5-4k |
| Resultado | uid=0(root) / u:r:kernel:s0 |
| Shell root | demonio g4d + cliente g4sh |
| Persistencia | Por arranque |
| Salida del exploit | Limpia, sin kernel panic |
| Mitigaciones encontradas | Samsung KDP, DEFEX, SELinux, PANIC_ON_OOPS, arm64 KASLR |
| Firmware compatible | A175FXXS3BZA5 (kernel 6.12.23) y A175FXXS6CZG1 (kernel 6.12.38, SPL 2026-07-05) — ambos verificados en dispositivo, misma cadena |
La investigación original de ghostlock proporciona las primitivas de entrada:
pselect reclaim
↓
fake rt_mutex_waiter
↓
constrained rb-tree pointer write
En el Galaxy A17, sin embargo, el desenlace habitual de parcheo de credenciales no funciona.
KDP protege los datos del kernel relacionados con credenciales en EL2.
En esta compilación, los intentos de modificar las credenciales de las tareas se descartaban silenciosamente incluso cuando las direcciones objetivo eran correctas.
Por lo tanto, en lugar de escribir credenciales de root, este port hace que el kernel se ejecute con las credenciales privilegiadas existentes.
La etapa final:
constrained kernel write
↓
physical read/write channel
↓
KASLR slide recovery
↓
discover system_wq / cpu_pwq
↓
forge work_struct
↓
call_usermodehelper_exec_work
↓
/system/bin/sh
↓
uid=0(root), u:r:kernel:s0
Se coloca un elemento de trabajo falsificado en un pool system_wq vinculado y se activa con una tormenta de asignación/liberación de ptmx.
El helper resultante en modo usuario se ejecuta con credenciales de init.
No se requiere sobrescribir las credenciales de la tarea.
userspace shell (uid 2000)
│
▼
pselect / PI-futex primitive
│
▼
constrained aligned kernel pointer write
│
▼
forged pipe_buffer channel
│
▼
arbitrary physical read/write
│
├── recover KASLR slide
│
├── locate system_wq / cpu_pwq
│
└── prepare forged work_struct
│
▼
queue usermode-helper work
│
▼
ptmx storm wakes worker
│
▼
/system/bin/sh runs with init creds
│
▼
uid=0(root)
│
▼
g4d → @ghostlockd → g4sh
En comparación con el port público de OnePlus, la mayoría de las etapas posteriores a la primitiva de escritura inicial fueron reelaboradas.
La fase final de parcheo de credenciales fue reemplazada por un elemento de workqueue falsificado dirigido a la ruta de ejecución del usermode-helper.
Esto evita por completo la escritura de estructuras cred protegidas.
El enfoque anterior de anclaje mediante perf-event no era fiable en este dispositivo.
En su lugar, el exploit utiliza tres punteros desplazados de la entrada ctl_table de boot_id:
procname
data
proc_handler
Los tres se validan de forma cruzada antes de aceptar la diapositiva.
cpu_pwq se descubre recorriendo:
system_wq → pwqs
en lugar de depender de un desplazamiento fijo específico del dispositivo.
El canal original deja cambios colaterales en el estado de struct page que pueden desencadenar PANIC_ON_OOPS durante el desmontaje.
La cadena actual evita el fallo de desmontaje y se ha demostrado que sale limpiamente después de obtener root.
El helper de modo usuario inicia:
g4d
que escucha en el socket Unix abstracto:
@ghostlockd
g4sh se conecta a él y proporciona ya sea un shell root interactivo o la ejecución de un comando puntual.
/data/local/tmp/a/g4sh
/data/local/tmp/a/g4sh -c "id"
Este objetivo combina varias protecciones que rompen las técnicas comunes de explotación del kernel de Android:
Esto forzó una estrategia de explotación diferente a la habitual:
arbitrary RW → patch cred → disable SELinux
En su lugar:
arbitrary RW → recover runtime state → forge kernel work → execute usermode helper
Requiere un Android NDK reciente.
make # BZA5 firmware (kernel 6.12.23)
make czg1 # CZG1 firmware (kernel 6.12.38): per-target slide anchors,
# offsets are uname-keyed at runtime
Produce:
ghostlock # exploit (ghostlock-czg1 for the CZG1 build)
g4d # static root-shell daemon
g4sh # root-shell client
Sube los binarios:
adb push ghostlock /data/local/tmp/a/g4
adb push g4d /data/local/tmp/a/g4d
adb push g4sh /data/local/tmp/a/g4sh
adb shell 'chmod 755 /data/local/tmp/a/g4 /data/local/tmp/a/g4d /data/local/tmp/a/g4sh'
Ejecute el bucle de explotación con reconocimiento de reinicio:
./scripts/rr_loop4.sh
Después de ROOTED:
adb shell /data/local/tmp/a/g4sh
O ejecute un único comando:
adb shell '/data/local/tmp/a/g4sh -c "id"'
Resultado esperado:
uid=0(root) gid=0(root) groups=0(root) context=u:r:kernel:s0
El primitivo es probabilístico y depende en gran medida de las condiciones de arranque.
La explotación exitosa puede requerir intentos repetidos. El script incluido rr_loop4.sh gestiona los reintentos y los ciclos de reinicio automáticamente.
Este es un exploit de investigación, no una herramienta de rooteo instantánea de un solo intento.
qemu-e2e/ contiene un arnés de validación de extremo a extremo que utiliza el kernel de Samsung extraído.
El arnés se utilizó para probar:
g4d / g4shLa imagen del kernel de Samsung en sí no está incluida.
Véase:
qemu-e2e/
para obtener instrucciones de configuración.