
GhostLock (CVE-2026-43499) app para la serie Galaxy S26
indev.ghostlock.s26)Wrapper de Android con un solo clic para 1ndevelopment/ghostlock-s26: GhostLock (CVE-2026-43499) portado a toda la serie Samsung Galaxy S26 (Android 16 / GKI 6.12). Un APK, tres líneas de kernel, coincidencia de parámetros en tiempo de ejecución - sin variantes de app por compilación.
Úsalo solo en dispositivos que poseas o para los que tengas autorización explícita de probar. El root temporal desaparece al reiniciar. Una segunda ejecución del exploit en el mismo arranque puede bloquear el dispositivo - reinicia antes de reintentar.
El exploit coincide por línea de kernel, no por compilación individual
(exploit/src/params_table.c es la fuente autoritativa; ParamsTable.kt la
refleja solo para el veredicto de la UI):
| Código de dispositivo | Nombre comercial | SoC | Línea de kernel |
|---|---|---|---|
| m1q | Galaxy S26 (SM-S942x) | Snapdragon | cn o intl (según CSC) |
| m2q | Galaxy S26+ (SM-S947x) | Snapdragon | cn o intl (según CSC) |
| m3q | Galaxy S26 Ultra (SM-S948x) | Snapdragon | cn o intl (según CSC) |
| m1s | Galaxy S26 (SM-S942B) | Exynos | exynos |
| m2s | Galaxy S26+ (SM-S947B) | Exynos | exynos |
Compilaciones probadas (17): S9420ZCS4AZG1, S9470ZCS4AZG1, S9480ZCS3AZF1, S9480ZCS4AZG1, S942BXXS4AZG5, S947BXXS3AZF1, S947BXXS4AZG5, S942QOPU1AZDE, S942U1UES4AZG3, S942USQS4AZG3, S947USQS4AZG3, S9480ZHS4AZG1, S948BXXS4AZG5/6, S948NKSS4AZG3, S948U1UES2AZE1, S948USQS4AZG3.
Las OTA desconocidas recurren exactamente igual que el params.c original:
primero la compilación exacta, luego el mismo modelo + CSC de 3 caracteres
(reutilización de OTA), luego la última entrada del mismo dispositivo
(marcada como no verificada), o bien fail-closed (la app muestra
UNSUPPORTED y la capa nativa sale con código 2). Los modelos completamente
desconocidos se rechazan - nunca se fuerzan.
Un gran botón - Root my S26 - ejecuta todo el pipeline y va narrando en la tarjeta Output:
adb shell del README). El permiso
se solicita una vez al iniciar (y de nuevo si el servidor se reinicia); el
flujo Root espera la concesión en lugar de abortar. Si el servidor está
caído, la app abre el gestor de Shizuku para que puedas iniciarlo, y luego
recurre al shell integrado. Añadir la app a la lista de permitidos de
Shizuku elimina el aviso por completo.preload.so, su_daemon, ksud a /data/local/tmp
(preload.so, cve-2026-43499-root, ksud) y les aplica chmod. Si ya
has hecho adb push de los archivos según el README original, se recogen
en su sitio.env LD_PRELOAD=/data/local/tmp/preload.so sh (el constructor del
ejecuta la cadena y hace ; stdout el log del exploit), hasta 5
intentos - la carrera es probabilística. Hay un interruptor
disponible, pero reiniciar es más seguro.Debajo de eso: una única fila de campo de comando + Run as root (comandos
de un solo uso mediante el protocolo C del daemon su; el PTY interactivo
queda fuera del alcance de la v1), y un pequeño enlace Reset que limpia
/data/local/tmp/ghostlock-boot.log para poder reintentar una ejecución sin
reiniciar (el upstream advierte que esto puede provocar un pánico - reiniciar
es la vía segura).
exploit/ upstream vendorizado (Makefile + src/, autoritativo)
ksud loader KernelSU precompilado del upstream (ARM64 PIE, también en assets)
app/src/main/assets/ksud copia preparada incluida en el APK
app/src/main/assets/ + preload.so / su_daemon tras stage-assets.sh
app/src/main/cpp/ recompilación CMake opcional de preload.so desde exploit/src
app/src/main/java/indev/ghostlock/s26/
MainActivity.kt UI (device / stage / run / shell / boot guard)
ParamsTable.kt espejo de la tabla de series (17 compilaciones, 3 líneas, 5 códigos)
DeviceCompat.kt identidad Build.* + veredicto de serie
ShellRunner.kt Shizuku (uid 2000) + fallback local, staging
SuClient.kt cliente en modo 'C' de /data/local/tmp/temp_su.sock
GhostlockManager.kt intérprete de códigos de salida (0/1/2/3/4)
PORTING.upstream.md notas de portado (nuevo firmware = nueva fila en device_map)
Requisitos: Android Studio (JBR 21) / SDK 35 / NDK r26+ / CMake 3.22.1 / JDK 17.
# 1. Build the native payloads with the NDK (upstream flow):
cd exploit && make preload
# -> build/bin/preload.so, build/embed/su_daemon_aarch64_pie
# 2. Stage them into the APK assets:
./stage-assets.sh
# 3. Build the app:
./gradlew :app:assembleDebug
# -> app/build/outputs/apk/debug/app-debug.apk
ksud ya está vendorizado (ksud + app/src/main/assets/ksud), así que los
pasos 1–2 solo producen las dos salidas del NDK. El objetivo CMake en
app/src/main/cpp/CMakeLists.txt puede además recompilar libpreload.so
desde las mismas fuentes dentro del APK como fallback.
El aapt2/NDK del SDK son x86_64 y no pueden ejecutarse en el dispositivo.
Procedimiento verificado (SDK en ~/android-sdk, Gradle 8.9 - AGP 8.5.2
rechaza el Gradle 9.x del sistema):
# Native payloads with the Termux toolchain (API 35 target, system liblog):
cd exploit
clang -O2 --target=aarch64-linux-android35 -fPIE -pie -Isrc src/su_daemon.c \
-o build/embed/su_daemon_aarch64_pie
clang -O2 --target=aarch64-linux-android35 -fPIC -Isrc \
-Wno-unused-parameter -Wno-sign-compare -Wno-unused-function -Wno-macro-redefined \
src/main.c src/util.c src/bootclaim.c src/slide.c src/fops.c src/attr.c \
src/root.c src/params.c src/params_table.c src/preload.c \
-L/system/lib64 -llog -shared -o build/bin/preload.so
cd .. && ./stage-assets.sh
# APK (CMake native step auto-skips without SDK cmake; Termux aarch64 aapt2
# is injected via -P so checked-in files stay workstation-clean):
env ANDROID_HOME=~/android-sdk ANDROID_SDK_ROOT=~/android-sdk \
JAVA_HOME=$PREFIX/lib/jvm/java-21-openjdk \
~/gradle-dists/gradle-8.9/bin/gradle :app:assembleDebug --console=plain \
-Pandroid.aapt2FromMavenOverride=$(command -v aapt2)
uid=0 …. Luego ejecuta comandos en la tarjeta
Root shell.me.weishu.kernelsu); el daemon carga ksud automáticamente en modo
tardío (ver el modo K de su_daemon.c).Shizuku es opcional pero muy recomendable: el flujo del upstream se ejecuta
desde un adb shell (uid 2000, contexto SELinux shell), y el fallback
integrado en la app (untrusted_app) tiene muchas más probabilidades de ser
bloqueado para LD_PRELOAD/exec en /data/local/tmp.
exploit/ + PORTING.upstream.md + ksud de
1ndevelopment/ghostlock-s26 (Apache-2.0; ver LICENSE.upstream,
NOTICE.upstream). La app no enlaza ningún código del exploit en su propio
proceso - prepara los archivos compilados con el NDK y lanza el shell
LD_PRELOAD documentado..so_exitBOOT_FORCE=1id reporta uid=0 a través de cualquier
canal: primero el socket del daemon temporal, luego el su estilo
KernelSU. Esto importa porque en un éxito completo su_daemon desvincula
su socket y sale por diseño (traspaso a KernelSU) - un socket temporal
muerto con su funcionando significa rooteado, no roto. Imprime la cola
del log de boot-claim y reporta el consejo de rooteado / código de salida.| Código | Significado | Qué hacer |
|---|
| 0 | éxito (socket activo, late-load de ksud OK) | Check root, usa el shell |
| 1 | carrera fallida / verificación fallida | simplemente reintenta (normal) |
| 2 | compilación no soportada (fail-closed) | detente; el firmware necesita un port |
| 3 | carrier/root falló | reinicia antes del siguiente intento |
| 4 | ya se ejecutó en este arranque | reinicia; BOOT_FORCE=1 lo anula pero puede bloquear |