
(CVE-2026-43499) Exploit del kernel para dispositivos OnePlus con bootloader bloqueado.
Exploit de kernel dirigido a dispositivos OnePlus con bootloader bloqueado. Utiliza CVE-2026-43499 para obtener acceso root sin desbloquear el bootloader ni modificar boot.img.
Solo para investigación de seguridad autorizada y fines educativos.
| Elemento | Detalle |
|---|---|
| CVE | CVE-2026-43499 |
| Tipo | Use-After-Free de Futex PI (herencia de prioridad) |
| Alcance | Kernel de Linux 2.6.39 ~ 7.1 |
| Corregido en | Mainline 7.1 (commit 3bfdc63936dd) |
| Estado en Android | GKI 6.12.x sigue siendo vulnerable |
La llamada al sistema pselect6 copia fd_set a la pila del kernel. Cuando se combina con el mecanismo de waiter de futex PI, un marco de pila liberado puede reasignarse como una estructura rt_mutex_waiter. Durante el recorrido de la cadena PI, el reequilibrado del árbol rb escribe datos controlados en direcciones arbitrarias del kernel.
futex PI UAF (CVE-2026-43499)
├─ Forge rt_mutex_waiter object
├─ Control kernel stack via pselect/select fd_set layout
├─ Trigger rt_mutex PI operation for arbitrary write
├─ Write 1: selinux_state.enforcing = 0
└─ Write 2: cred → init_cred (uid=0, full capabilities)
| Dispositivo | Codename | SoC | Kernel | Firmware | Estado |
|---|---|---|---|---|---|
| OnePlus Ace 6T | PLR110 | SM8845 (Snapdragon 8s Elite) | 6.12.38-android16-5-...-ab14275539-4k | ColorOS 16.0.2.403 | ✅ Verificado |
| OnePlus Ace 6T | PLR110 | SM8845 (Snapdragon 8s Elite) | 6.12.38-android16-5-...-ab14552068-4k | ColorOS 16.0.8.301 | ✅ Verificado |
| OnePlus 15 | PLK110 | SM8845 (Snapdragon 8s Elite) | 6.12.23-android16-5-...-ab14541642-4k | — | ✅ Verificado |
Otros dispositivos OnePlus de la misma familia de SoC, Android 16 o kernel 6.12.x pueden adaptarse mediante la extracción de offsets del boot.img.
GhostLock gestiona la escalada de privilegios. La instalación de KernelSU requiere ksud (incluido con kernelsu.ko específico de KMI):
| Fuente | Notas |
|---|---|
| ReSukiSU APK (recomendado) | Instala ReSukiSU; el APK incluye libksud.so |
| CI Release | Descárgalo desde ReSukiSU CI (ksud-aarch64-linux-android.zip) |
Sin ksud, el exploit sigue obteniendo un shell root con uid=0, pero KernelSU no se instalará y
suno persistirá.
ANDROID_NDK_HOME o ANDROID_NDK_ROOT# Default (API 35)
make
# Specify API level
make API=34
# Specify NDK path
NDK=/path/to/android-ndk make
ghostlock — ejecutable ELF ARM64 enlazado estáticamente.
# 1. Enable ADB TCP mode
adb tcpip 5555
# 2. Push ADB key (required for bootstrap mode)
adb push ~/.android/adbkey /data/local/tmp/a/adbkey
# 3. Push the exploit
adb push ghostlock /data/local/tmp/a/e
adb shell chmod 755 /data/local/tmp/a/e
Tras el primer éxito,
resetpropestablece automáticamentepersist.adb.tcp.port=5555, lo que permite ejecuciones totalmente automáticas en reinicios posteriores.
/data/local/tmp/a/e
/data/local/tmp/a/e --bootstrap
setprop127.0.0.1:5555/data/local/tmp/a/e --write1
Los offsets se guardan en la tabla de búsqueda src/devices/offsets.h, indexada por uname -r. El programa realiza la coincidencia automáticamente al inicio; los kernels desconocidos se rechazan.
static const struct kernel_offsets known_offsets[] = {
OFFSETS_ENTRY("6.12.38-android16-5-...-ab14275539-4k", ...),
OFFSETS_ENTRY("6.12.38-android16-5-...-ab14552068-4k", ...),
OFFSETS_ENTRY("6.12.23-android16-5-...-ab14541642-4k", ...),
{ .uname_r = NULL } /* sentinel */
};
| Tipo | Cantidad | Extracción |
|---|---|---|
| Símbolos globales de kallsyms | 28 | tools/extract_target.py |
| Campos de estructura BTF | 57 | tools/extract_btf.py |
| Valores derivados | 9 | Calculados automáticamente |
| Constantes fijas | 12 | Hardcodeadas |
| Struct | Campos | Propósito |
|---|---|---|
task_struct | 17 | Descriptor de proceso, cred, seccomp |
rt_mutex_waiter | 6 | Objetivo de falsificación del UAF |
cred | 4 | Credenciales, capacidades |
seccomp | 3 | Estado del filtro seccomp |
pipe_inode_info | 11 | Operaciones de pipe buffer |
file_operations | 13 | Tabla fops falsa |
mm_struct | 1 | Propietario del descriptor de memoria |
Cuando los punteros del kernel están restringidos (kptr_restrict), se filtra la dirección base mediante boot_id sobrescrito con una dirección del kernel:
Read /proc/sys/kernel/random/boot_id
└─ UUID contains nfulnl_logger address
└─ KASLR slide = leaked_addr - image_offset
└─ kaslr_base
Cuando el dispositivo ashmem es accesible, se usan las primitivas de lectura/escritura de configfs para leer los punteros de función de la tabla fops de ashmem y calcular el offset de KASLR.
Falsifica objetos del kernel en páginas de orden 3 (32KB):
file_operations falsos — secuestrar el puntero fops del miscdevice de ashmemrt_mutex_waiter falso — simular el nodo waiter de la cadena PItask_struct falso — referencia de tarea durante el recorrido de PIrt_mutex falso (bloqueo) — información correcta de waiter/ownerImplementado mediante SKB (socket buffer) + KernelSnitch:
mm_structsendmsg para llenar el heap del kernelDespués de obtener la base de KASLR, usa pipe buffers para el acceso a memoria a nivel físico:
1. Locate pipe buffer in physmap
2. Forge pipe_buffer ops table pointing to known pipe_buf_ops
3. Hijack pipe_buffer.page to target physical address
4. Arbitrary physical read/write via normal pipe operations
Compatibles: pipe_read64, pipe_write64, pipe_phys_read_data, pipe_phys_write_data