
CVE-2026-43499 exploit de root por arranque — lógica central (arm64 Android GKI 6.6)
CVE-2026-43499 (Futex PI UAF) Código lógico central del exploit de escritura arbitraria en el kernel, utilizado para eludir SELinux y obtener root.
Este repositorio solo contiene el código fuente de la lógica central del exploit (
src/) y el empaquetador binario único (wrapper/).src/target.hes una plantilla que debes completar con los parámetros de tu propio dispositivo para ejecutarlo (ver "Adaptación del dispositivo" más abajo).
# Entorno requerido: Android NDK r29+ (API 35, aarch64)
export ANDROID_NDK_ROOT=/path/to/android-ndk
# Compilar producto de lógica pura
make
# → build/unplus (binario del exploit)
# → build/unplus_preload.so (biblioteca preload)
Los productos son dos ELF, no incrustan ningún binario externo.
Para empaquetar el exploit y las cargas externas (magiskpolicy / ksud / kernelsu.ko) en un solo binario que se ejecute con un clic, debes proporcionar estas cargas externas y luego empaquetarlas con wrapper/:
# 1. Primero compilar los productos de src/ (ver arriba)
# 2. Generar datos de carga (payload_data.h no está en el repositorio, lo genera el usuario, contiene los bytes de los binarios externos)
cd wrapper
python3 embed_payloads.py \
--unplus ../build/unplus \
--preload ../build/unplus_preload.so \
--magiskpolicy <ruta> \
--ksud <ruta> \
--kernelsu <ruta> \
--out payload/
# 3. Compilar el binario único
make # → wrapper/build/unplus
src/
├── target.h Plantilla de parámetros del dispositivo (los marcados con ◆ FILL IN deben completarse con los valores de tu dispositivo)
├── offset.h Pegamento de enrutamiento para target.h (inyectado mediante -DTARGET_CONFIG_H)
├── unplus.h Cabecera de orquestación + declaraciones compartidas (incluye macros derivadas como P0 alias / data_addr)
├── main.c Orquestación de entrada
├── stage1.c Write 1/2: Desactivación de SELinux + sobrescritura de cred
├── root.c Persistencia de root en Android (reparación de SELinux golden + sepolicy + lista blanca de KSU)
├── slide.c Fuga de KASLR
├── fops.c Enrutamiento configfs/fops + derivación de la dirección base del kernel
├── route.c Hilo de enrutamiento de PI futex
├── direct_write.c Primitiva de lectura directa
├── pipe_direct.c Escritura directa con pselect
├── pipe_physrw.c Primitiva physrw por pipe
├── util.c Funciones de utilidad
├── utils.h Utilidades generales (log, rutas de procfs)
├── kernelsnitch.h Capa de arquitectura (mapa de identidad ARM64/x86)
├── futex_hash.h Portabilidad de jhash del kernel (genérico)
└── timeutils.h Temporización de capa de arquitectura (ARM/x86/AMD)
src/target.h tiene dos tipos de constantes:
◆ FILL IN : Relacionados con el dispositivo/núcleo, debes completar con tus propios valores. La plantilla usa 0xDEADBEEF... como marcador de posición, se compila pero falla al ejecutarse.Cambiar de dispositivo = completar la parte ◆ FILL IN. Para saber qué es cada campo y cómo obtenerlo, consulta el Apéndice: Descripción de campos.
Los campos marcados con ◆ FILL IN en target.h se agrupan por propósito:
| Grupo | Campo (ejemplo) | Significado / Método de obtención |
|---|---|---|
| Identidad de compilación | BUILD_VARIANT_LABEL, BUILD_FINGERPRINT | Cadenas de identificación arbitrarias, para logs. Completa con el build fingerprint de tu dispositivo |
| Diseño de memoria | KIMAGE_TEXT_BASE, P0_PHYS_OFFSET, VMEMMAP_START, etc. | Diseño de direcciones virtuales/físicas del kernel. Para arm64 VA39 suele haber valores predeterminados; confírmalo desde IKCONFIG / kallsyms / /proc/iomem |
| ASHMEM | ASHMEM_IOCTL_OFF ... ASHMEM_MISC_FOPS_OFF | Desplazamientos de símbolos de los miembros de fops del controlador ashmem + misc. kallsyms_lookup_name("ashmem_fops"), etc. |
| CONFIGFS / PIPE / VFS | CONFIGFS_READ_ITER_OFF, ANON_PIPE_BUF_OPS_OFF, KMALLOC_CACHES_OFF, etc. | Desplazamientos de configfs (lectura/escritura), splice, pipe_buf_ops, kmalloc_caches. Consultar con kallsyms |
| SELinux | SELINUX_ENFORCING_OFF, SELINUX_BLOB_SIZES_OFF, SECURITY_HOOK_HEADS_OFF | Desplazamientos de selinux_state / selinux_blob_sizes / security_hook_heads. SELINUX_ENFORCING_OFF es el punto de anclaje de coincidencia de la compilación del kernel, debe ser exacto |
| Símbolos centrales del kernel | INIT_TASK_OFF, INIT_CRED_OFF, ENTRY_TASK_PERCPU_OFF, etc. | Desplazamientos de init_task / init_cred / entry_task / __per_cpu_offset / root_task_group. Consultar con kallsyms; ENTRY_TASK_PERCPU_OFF es el desplazamiento de __entry_task dentro de la sección percpu |
| Per-CPU runtime | TARGET_PCPU_BASE_ADDR, TARGET_PCPU_UNIT_SIZE | Dirección en tiempo de ejecución del chunk per-CPU (después de KASLR), cambia cada reinicio. Se debe volcar en tiempo de ejecución; UNIT_SIZE depende del número de CPUs |
| SLIDE (fuga de KASLR) | SLIDE_NFULNL_LOGGER_OFF, SLIDE_RANDOM_BOOT_ID_DATA_OFF, etc. | Desplazamientos de símbolos de datos del kernel utilizados para la fuga de KASLR (nfulnl_logger / boot_id data, etc.). Consultar con kallsyms |
| SELinux golden | TARGET_SELINUX_GOLDEN | Plantilla booleana de los primeros 16 bytes de selinux_state, estable entre reinicios pero diferente por dispositivo. Se debe obtener del volcado de selinux_state de tu dispositivo. byte0 es el bit enforcing, el llamante escribe 0x00 para indicar permissive |
| Información de inodo de pipe | PIPE_INODE_INFO_*, PIPE_HEAD_OFF, etc. | Diseño de la estructura pipe_inode_info, normalmente estable dentro de la misma familia GKI, pero se debe verificar al cambiar de compilación del kernel |
Experiencia general: Todos los desplazamientos del tipo *_OFF se pueden obtener tomando la dirección del símbolo con kallsyms_lookup_name en un dispositivo root y restando KIMAGE_TEXT_BASE. TARGET_PCPU_* y TARGET_SELINUX_GOLDEN son valores de tiempo de ejecución/volcado, no se pueden obtener de una imagen estática.
WTFPL — Do What The Fuck You Want To Public License.