
Investigación de cadena de exploits dirigida a CVE-2026-43499 en Samsung Galaxy S21
Payload de IonStack específico para el dispositivo Samsung Galaxy S21 (o1s) en
firmware G991BXXSJHZC2. Proporciona root volátil mediante exploit LD_PRELOAD +
demonio root-helper call_usermodehelper (misma forma que IonStack-S22U /
IONSTACK-S22). Estado: investigación — bloqueado, ver RESEARCH.md.
| Campo | Valor |
|---|---|
| Modelo | SM-G991B |
| Dispositivo | o1s |
| Firmware | G991BXXSJHZC2 |
| Android | 12 / API 31 (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.
Licencia Apache 2.0 upstream conservada en LICENSE (ver NOTICE).
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)
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 (root helper).
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'"
El root (si se consigue) solo persiste hasta el reinicio; no se flashea nada.
sched_setattr → rt_mutex_adjust_prio_chain → _raw_spin_trylock fallo NULL) sin llegar
nunca a colocar el stamp: el campo lock de 8 bytes se encuentra en un
hueco de copia que ninguna syscall bloqueante examinada cubre (mapa de
profundidad por syscall verificado por disasm en RESEARCH.md). La puerta
de reclamación por pipe falla sistemáticamente (0/0)./data/local/tmp se borra al reiniciar — vuelve a enviar los binarios tras
cada arranque.