
Exploit d'élévation de privilèges du noyau Linux ARM32 pour CVE-2026-43499 (GhostLock futex UAF) ciblant Huawei Watch 4 Pro avec plusieurs variantes d'exploitation et une analyse détaillée des contournements.
Tentative d'exploitation de la vulnérabilité d'élévation de privilèges du noyau Linux basée sur CVE-2026-43499 (GhostLock) — Huawei Watch 4 Pro (MDS-AL00, armv7l)
Ce projet est une tentative d'exploitation de la vulnérabilité GhostLock du noyau sur le device Huawei Watch 4 Pro (MDS-AL00, Snapdragon SW5100, HarmonyOS 4.3.0 AOSP 12), adaptée à l'architecture ARM 32-bit (armv7l).
GhostLock (CVE-2026-43499) est une vulnérabilité UAF futex PI du noyau Linux affectant les versions 2.6.39 à 7.x. L'objectif de ce projet est de réaliser une chaîne complète d'élévation de privilèges sur la montre Huawei.
Dépôt d'origine : MobiusM/CVE-2026-43499 (PoC pour arm64)
Sur le noyau 5.4.161 ARM32, après le déclenchement de EDEADLK par FUTEX_CMP_REQUEUE_PI, la traversée de la chaîne PI n'exécute pas le deuxième rb_erase. L'exploitation en chaîne de GhostLock 64, qui repose sur UAF → écriture du deuxième rb_erase dans la page UAF, est totalement inefficace sur ce noyau.
Toutes les variantes de spray writev 8-iov échouent : sc[0] after = e3a0002a (la page de shellcode n'est pas écrite).
Le spray writev 8-iov de ghostlock64 dépend du chevauchement du tableau iovstack[8] sur la pile du noyau avec la structure rt_mutex_waiter. Sur ce noyau :
clear_refs_operations.writesched_setattr déclenche avec succès la traversée de la chaîne PI (vérifié success=1600+), mais rb_erase opère sur pi_tree_entry du thread OWNER (situé dans task_struct sur le tas kmalloc), et non sur les données de pile du thread waiter (données fd_set writev).
Par conséquent, la voie pselect + sched_setattr ne peut pas non plus être utilisée pour contrôler la valeur écrite.
mmap(0, ..., MAP_FIXED, ...) retourne -EINVAL, pas le -EACCES standard de LinuxCONFIG_SECURITY_SELINUX_DEVELOP=n → le champ selinux_state.enforcing n'existe pasmremap → ENOSYScommit_creds: 0xC0140390
prepare_kernel_cred: 0xC014059C
proc_clear_refs_ops: 0xC0CAF280 (.write @ +12 = 0xC0CAF28C)
mmap_min_addr: 0xC12E8568
dac_mmap_min_addr: 0xC123C734
selinux_hooks[mmap]: 0xC0F64E1C
| Dépôt | Périphérique | Noyau | Architecture |
|---|---|---|---|
| x-spy/CVE-2026-43499-popsicle |
Les deux dépôts utilisent pselect() + sched_setattr pour déclencher la chaîne PI + écriture directe physmap, en s'appuyant sur le mécanisme de mappage direct de l'ARM64. L'ARM32 n'a pas de mappage direct, et le comportement de la chaîne PI de ce noyau est différent.
CVE-2026-43499-armv7/
├── config/
│ └── kernel.config # Configuration .config du noyau du périphérique (5.4.161-perf)
├── scripts/
│ ├── ghostlock_all.sh # Script de test en masse
│ └── ghostlock_check.sh # Script de détection
├── src/
│ ├── ghostlock64.c # PoC original à double erase 8-iov (structure de base)
│ ├── ghostlock5-33.c # Versions d'itération précoce (ghostlock5 ~ ghostlock33)
│ ├── ghostlock63.c # Variante 3-iov ghostlock 6.x
│ ├── g62_*.c # Variantes 3-iov (différentes adresses cibles)
│ ├── g62_8e.c # Spray 8-iov précis (version finale)
│ ├── g62_scan.c # Scan de décalage iov multiple
│ ├── g62_self.c # Test de déclenchement EDEADLK auto du waiter
│ ├── g62_pispray.c # Test EDEADLK + slab spray + sched_setattr
│ ├── g62_rand.c # Test d'écriture de randomize_va_space
│ ├── gsu_v19.c # Déclenchement 8-iov + sched_setattr
│ ├── gl_pselect*.c # Test pselect + sched_setattr
│ ├── gl_scan.c # Scan de décalage fd_set
│ ├── sc64.c # Payload shellcode
│ ├── trigger*.c # PoC de déclenchement original (vérification de la vulnérabilité)
│ ├── ghostlock_root.c # Tentative de root précoce
│ └── test_*.c # Tests de compilation/exécution
├── README.md
├── ghostlock64 # Binaire du PoC double erase 8-iov
├── ghostlock63 # Binaire ghostlock 6.x 3-iov
├── g62_* # Binaires des variantes 3-iov
├── gl_* # Binaires des tests pselect
├── gsu # Variante de détournement sc-page
├── sc64 # Shellcode
├── trigger* # Binaires des PoC de déclenchement originaux
└── test_* # Binaires de test
L'implémentation de la chaîne PI de cette version du noyau (5.4.161 ARM32) ne supporte pas la technique d'écriture arbitraire double rb_erase de GhostLock. Toutes les routes d'exploitation connues de CVE-2026-43499 sont bloquées sur ce périphérique. Il est nécessaire de découvrir une nouvelle primitive d'écriture de zéro ou une autre vulnérabilité pour continuer.
Huawei, tu m'as tué, tu m'as coûté 30 RMB de tokens DeepSeek V4 Pro.
| Paramètre | Valeur |
|---|
| Périphérique | Huawei Watch 4 Pro (MDS-AL00) |
| Noyau | 5.4.161-perf (ARM32 armv7l) |
| Système | HarmonyOS 4.3.0 (AOSP 12) |
| CPU | Snapdragon SW5100 |
| SELinux | Enforcing (CONFIG_SECURITY_SELINUX_DEVELOP=n) |
| KASLR | Désactivé |
| MMU | CONFIG_STRICT_KERNEL_RWX=y |
| Pile | NX (pile du noyau non exécutable) |
| mmap(0) | Interception supplémentaire Huawei (-EINVAL, non standard -EACCES) |
| Étape | Statut | Description |
|---|
| Déclenchement FUTEX PI GhostLock | ✅ Vérifié avec succès | FUTEX_CMP_REQUEUE_PI retourne EDEADLK (-35) |
| Déclenchement de la traversée de chaîne PI | ✅ Vérifié avec succès | sched_setattr déclenche la marche de la chaîne PI |
| Deuxième rb_erase | ❌ Blocage central | L'implémentation de la chaîne PI de ce noyau n'effectue pas de deuxième rb_erase |
| Alignement iovstack | ❌ Bloqué | Le spray writev 8-iov ne chevauche pas rt_mutex_waiter |
| Contournement mmap(0) | ❌ Bloqué | Vérification supplémentaire du noyau Huawei (-EINVAL) |
| Détournement fops | ❌ Bloqué | Aucune primitive d'écriture arbitraire contrôlée |
| Écriture de cred | ❌ Bloqué | Limitée par les blocages ci-dessus |
| Élévation de privilèges terminée | ❌ | Non réalisée |
| Voie | Résultat | Raison |
|---|
| ghostlock64 8-iov writev → FLPI | ❌ | Le deuxième rb_erase ne se déclenche pas |
| ghostlock64 + sched_setattr | ❌ | Idem, la chaîne PI n'atteint pas la page UAF |
| g62 3-iov | ❌ | Peut écrire mais la valeur est une adresse de pile, pile NX non exécutable |
| pselect + sched_setattr | ❌ | rb_erase opère sur les données de tas du propriétaire |
| Deuxième FLPI du waiter | ❌ | Chemin rapide EDEADLK, ne lit pas la pile |
| Scan de décalage iov (22 configurations) | ❌ | Aucun chevauchement |
| mm(0) / mremap contournement | ❌ | -EINVAL / ENOSYS |
| Mise à zéro du hook selinux | ❌ | Le champ enforcing n'existe pas |
| Xiaomi 17 Pro Max |
| 6.12.23 |
| ARM64 |
| pubglite55/oppo-ghostlock | OPPO Find N2 | 5.10.236 | ARM64 |