
Investigación de cadena de exploits dirigida a CVE-2026-43499 en Samsung Galaxy S21
Proyecto KernelSU funcional y activo para este dispositivo: kurtulusakyuz/dfroot-s21 — empieza por ahí. Este repositorio conserva únicamente la investigación de IonStack.
Payload de IonStack específico para el dispositivo Samsung Galaxy S21 (o1s) en
firmware G991BXXSJHZC2. Estado: investigación CERRADA — DoS determinista
únicamente; la ruta de escritura en el kernel está demostrada como imposible en
esta compilación. Evidencia completa en RESEARCH.md.
| Campo | Valor |
|---|---|
| Modelo | SM-G991B |
| Dispositivo | o1s |
| Firmware | G991BXXSJHZC2 |
| Android | 15 / API 35 (AP3A.240905.015.A2, fingerprint samsung/o1sxeea/o1s) |
| Tamaño de página | 4096 |
| Kernel | 5.4.242-30958140-abG991BXXSJHZC2 |
| SoC | Exynos 2100 |
| Mitigaciones | CFI+PAC+PAN/UAO, KDP_CRED, SELinux enforcing, sin userfaultfd |
Basado en la implementación de IonStack CVE-2026-43499 publicada en
NebuSec/CyberMeowfia (upstream b850d3bddc74c3328d5fbcc0568d21962b55d949)
y BuSung-dev/CVE-2026-43499-S25U, con agradecimiento a F-19-F/IonStackQuest3.
Se conserva la licencia Apache License 2.0 original en LICENSE (ver NOTICE).
El programa de escritura GhostLock para este dispositivo está terminado y cerrado, no en pausa. Lo que se demostró, en orden:
remove_waiter() limpia
current->pi_blocked_on en lugar de waiter->task->pi_blocked_on,
por lo que un rollback de FUTEX_CMP_REQUEUE_PI deja un puntero colgante
a un rt_waiter en la pila. El fix upstream 3bfdc63 está ausente en 5.4.242.sched_setattr del consumidor reproduce un Oops idéntico al del dispositivo
(rt_mutex_adjust_prio_chain+0x108 → _raw_spin_trylock+0x1c,
fault VA 0) tanto en un guest QEMU sin KDP como en el propio teléfono
(lastkmsg 118/119). El slot colgante está completamente mapeado
(stack-top E-0x328, ciclo de vida caracterizado vía QEMU+GDB).lock
(+0x38) NUNCA está controlado por el atacante (15/15 dumps). Ports
independientes (ASUS i005, ruta sigreturn de AQUOS) chocan con el mismo
muro. Geometría, no probabilidad.Las vías relacionadas de LPE del kernel de 2026 también quedaron cerradas en
esta compilación por la configuración del firmware (USER_NS, RDS,
CRYPTO_USER_API_AEAD todos sin definir; double-free de MFC inalcanzable con
MFC_USE_DMABUF_CONTAINER=n; AF_ALG/eBPF restringidos para shell). Los
artefactos posteriores a la escritura (KernelSU .ko + ksud compilados para
este firmware exacto) están preparados por separado; los headers de
src/kernelsnitch/ en este árbol permanecen preparados pero sin compilar (no
existe consumidor sin una escritura).
Makefile build (NDK r27+, ANDROID_NDK_HOME)
src/ exploit source (o1s profile only)
src/targets/o1s-G991BXXSJHZC2/ target.h + p0_fingerprint.h
src/kernelsnitch/ mm_struct leak (futex hash collision, staged)
tools/ p0 fingerprint helper
RESEARCH.md research notes (geometry, verdicts)
export ANDROID_NDK_HOME=/path/to/android-ndk
make clean all
# SLIDE_WRITER_SEL=1|2|3 selects mcast/sigreturn(default)/xattr writers.
# Unset selects the experimental pselect writer (see RESEARCH.md).
Salidas (build/o1s-G991BXXSJHZC2/):
cve-2026-43499 (payload LD_PRELOAD), cve-2026-43499-app.so (payload de app),
cve-2026-43499-root (helper de root).
adb push build/o1s-G991BXXSJHZC2/cve-2026-43499 /data/local/tmp/cve-2026-43499
adb push build/o1s-G991BXXSJHZC2/cve-2026-43499-root /data/local/tmp/cve-2026-43499-root
adb shell chmod 755 /data/local/tmp/cve-2026-43499 /data/local/tmp/cve-2026-43499-root
adb shell "LD_PRELOAD=/data/local/tmp/cve-2026-43499 sh"
# on success:
adb shell "/data/local/tmp/cve-2026-43499-root -c 'id; getenforce'"
Gestión de expectativas: en esta compilación "éxito" significa el recorrido del trigger y su salida de oráculo — un recorrido con lock NULL reinicia el dispositivo en lugar de otorgar root (ver "Estado final" arriba). El root, si alguna vez se lograra mediante una futura primitiva de escritura, solo dura hasta el reinicio; no se flashea nada.
/data/local/tmp se borra al reiniciar — vuelve a enviar los binarios tras
cada arranque.