
CVE-2026-43499 GhostLock futex UAF LPE PoC para OPPO PCKM00 (SM6150) / Linux 4.14.180
CVE-2026-43499 (GhostLock) — PoC de escalada de privilegios local por
use-after-free en la herencia de prioridades de futex del kernel de Linux,
portado al OPPO PCKM00 (OP4A57, SM6150, Android 11, kernel
4.14.180-perf+).
AVISO LEGAL / 免责声明 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 bloqueo del kernel. El autor no asume ninguna responsabilidad por el mal uso o los daños.
本项目仅用于授权的安全研究与教育目的。请勿在非本人所有或未获明确授权的设备上使用。运行利用可能导致内核崩溃,作者不承担任何滥用或损失的责任。
CVE-2026-43499 (GhostLock) es un use-after-free en el código de herencia de
prioridades de 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 mediante pselect(), lo que proporciona una primitiva de escritura
arbitraria.
Rango afectado: Linux 4.x–6.x (introducido en 2011). La serie 4.14 se ve
totalmente afectada. Consulte report.md para ver el análisis completo y los
offsets de símbolos verificados.
futex requeue-pi UAF
└─> pselect fd_set stack copy (fake rt_mutex_waiter / fake task)
└─> arbitrary write (rt_mutex tree ops / sched_setattr)
└─> overwrite ashmem_fops -> configfs bin read/write
└─> pipe_buffer page rewrite (physical RW primitive)
└─> patch current task cred -> root
El PoC se ejecuta íntegramente en espacio de usuario mediante LD_PRELOAD —
no se requiere reiniciar el dispositivo (salvo que el kernel entre en pánico).
Para portar a otros dispositivos 4.14: copie
exploit/targets/oppo-pckm00/target.hy regenere los offsets de símbolos a partir de su imagen del kernel (consulteanalysis/).
.
├── report.md # Full vulnerability analysis & verified offsets
├── exploit/
│ ├── Makefile # Build preload.so (Windows NDK / WSL)
│ ├── src/
│ │ ├── preload.c # LD_PRELOAD entry + forced disk logging + su
│ │ ├── main.c # Orchestration (waiter/owner/consumer threads)
│ │ ├── slide.c # KASLR leak (boot_id / nfulnl loggers)
│ │ ├── fops.c # ashmem_fops overwrite + configfs primitive
│ │ ├── pipe.c # pipe_buffer physrw primitive
│ │ ├── root.c # task walk + cred patch + seccomp/selinux
│ │ ├── util.c # kernelsnitch, skb page prep, kernel RW
│ │ ├── su_daemon.c # embedded su server (drop-in)
│ │ ├── su_blob.S # .incbin of su_daemon
│ │ └── wallpaper_blob.S # .incbin of wallpaper payload
│ ├── targets/oppo-pckm00/target.h # 4.14.180 symbol/struct offsets
│ └── assets/wallpaper.webp # embedded wallpaper payload
├── analysis/ # kernel image / kallsyms extraction scripts
└── LICENSE # Apache-2.0 (same as upstream GhostLock)
Requiere Android NDK r29 (aarch64-linux-android30-clang).
set NDK=C:\path\to\android-ndk-r29
make NDK=%NDK%
# put NDK at /opt/ndk/android-ndk-r29 (linux-x86_64 toolchain)
cd exploit
make wsl
# or directly:
bash ../analysis/build_preload.sh
Salida: exploit/preload.so (objeto compartido ELF aarch64 de 64 bits).
La compilación también genera un binario PIE a partir de su_daemon.c y lo
incrusta (junto con el fondo de pantalla) en el .so mediante los blobs .S.
adb push exploit/preload.so /data/local/tmp/preload.so
adb shell LD_PRELOAD=/data/local/tmp/preload.so id
Si tiene éxito, el shell muestra uid=0(root). Se instala un daemon su en
/apex/com.android.virt/bin/su (con respaldo en /data/local/tmp/su) y se
aplica un fondo de pantalla incrustado como artefacto de
persistencia/verificación.
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 —
descárguelos con:
adb pull /sdcard/Download/log_*.txt
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 se encuentra 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_waiterpipe_inode_infocredtask_struct.seccomp) son de mejor
esfuerzo; el fallo al parchear seccomp no bloquea el root por
sobrescritura de cred.