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
GhostLock-GOT-W29 — Recherche sur CVE-2026-43499 (GhostLock) concernant HUAWEI MatePad Pro 11 GOT-W29 | Kitploit
Outils/GitHubGitHub/zzzxxxxxxxxxx/ghostlock-got-w29
Escalade de PrivilègesAnalyse des VulnérabilitésExploitationRétro-ingénierieSécurité MobileExploitation de Binaires
GitHubzzzxxxxxxxxxx/ghostlock-got-w29

GhostLock-GOT-W29

Recherche sur CVE-2026-43499 (GhostLock) concernant HUAWEI MatePad Pro 11 GOT-W29

Voir le dépôt
1il y a 9 joursPas 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

CVE-2026-43499 (GhostLock) — Recherche sur HUAWEI MatePad Pro 11 GOT-W29

Notes de recherche sur l'élévation de privilèges de CVE-2026-43499 (UAF rtmutex/futex-PI sous Linux, « GhostLock ») sur HUAWEI MatePad Pro 11 GOT-W29 (Qualcomm kona / Snapdragon 870, HarmonyOS 4.x, kernel 4.19.157-perf+).

Appareil

ChampValeur
ModèleHUAWEI MatePad Pro 11 GOT-W29 (tablet)
SoCQualcomm kona (SM8250, Snapdragon 870)
SystèmeHarmonyOS 4.2 (104.2.0.237C00), version d'usine 4.0 (104.0.0.136)
Kernel4.19.157-perf+ (build du 2025-10-13)
VA39-bit, pages 4K, KASLR activé

Vulnérabilité

CVE-2026-43499 : remove_waiter() dans kernel/locking/rtmutex.c nettoie avec current au lieu de waiter->task dans le chemin de rollback de rt_mutex_start_proxy_lock(), ce qui conduit à un pi_blocked_on pendant (UAF de pile). Impacte 2.6.39 ~ 7.1 (ce noyau se trouve dans la plage concernée). Correctif en amont : commit 3bfdc63936dd.

Confirmé sur cet appareil : code source rtmutex.c:1110-1112, décompilation boot.elf, déclenchement sur appareil réel — tout vérifié.

Résultats vérifiés (tests sur appareil réel)

1. Fuite KASLR — via perf_event_open ✅

Sous shell (uid 2000) avec perf_event_paranoid=-1, perf_event_open(PERF_SAMPLE_IP, exclude_user=1) échantillonne des clusters d'adresses du texte noyau ; l'alignement sur les décalages de symboles connus donne le slide.

root@kitploit:~
samples=27651 kernel_ips=1685 lo=0xffffff948728176c hi=0xffffff9488ebfc7c
KASLR slide=0x147f200000    (40/40 IP 映射进内核文本区验证)
runtime _stext=0xffffff9487280800

Outil : tools/perf_kaslr.c. Prérequis d'exécution : shell (Shizuku rish), sans interception seccomp.

2. Déclencheur EDEADLK ✅

Créer un cycle PI pour que FUTEX_CMP_REQUEUE_PI renvoie -EDEADLK ; le rollback déclenche le bug remove_waiter.

Disposition clé : le futex cible du requeue est détenu par le waiter en cours de requeue (futex2 = waiter_tid) → owner == task dans task_blocks_on_rt_mutex → -EDEADLK.

root@kitploit:~
[M] CMP_REQUEUE_PI ret=-1 errno=35 (EDEADLK!)
[W] WAIT_REQUEUE_PI ret=-1 errno=110 (ETIMEDOUT)  ← waiter 返回
[M] waiter_returned=1                              ← 留下悬空 pi_blocked_on

Outil : tools/edeadlk_probe.c (variante 8+2+1 = 11, ou 27).

3. Mécanisme de primitive d'écriture (compris)

rt_mutex_adjust_prio_chain step[7] effectue un rb_erase sur le fake waiter (chemin à enfant gauche unique) : *(tree_left) = tree_pc (value→target) + écriture incrémentale __rb_change_child. Tous les décalages dans target.h proviennent de mesures par désassemblage de boot.elf.

4. Décalages complets (target/)

Voir target/got_w29_target.h. Points clés :

  • task_struct: cred=0x988, prio=0x184, pi_blocked_on=0xa90, usage=0x68, mm=0x728
  • rt_mutex_waiter (HW_FUTEX_PI): tree@0x0, pi_tree@0x18, task@0x30, lock@0x38, major@0x40, prio@0x48, deadline@0x50
  • PAGE_OFFSET=0xffffffc000000000, PHYS_OFFSET=0x80000000 (kona), KIMAGE_TEXT_BASE=0xffffff8008080000

Blocages et correctifs (mise à jour du 2026-08-10)

Véritable cause racine : le déclenchement EDEADLK emprunte le mauvais sous-chemin (avant l'overlay)

Le désassemblage boot.elf de task_blocks_on_rt_mutex le confirme : le noyau de cet appareil contient une vérification anticipée owner==task à 0x3808-0x3868 (cmp owner,task; b.eq -> -EDEADLK), qui retourne avant l'écriture de task->pi_blocked_on (0x38d4 str x21,[x20,#0xa90]). L'ancien déclenchement GOT-W29 faisait que le waiter se possédait lui-même futex2=waiter_tid (self-own) → il atteignait exactement cette vérification anticipée → pi_blocked_on jamais défini → aucun pointeur pendant. Les observations sur l'appareil (pas de crash + boot_id inchangé) correspondent parfaitement à « aucun pointeur pendant » — le placement de l'overlay était un mauvais diagnostic.

Déclenchement correct (référence smt878u, déjà implémenté) : cycle PI — l'owner détient la cible du requeue via FUTEX_LOCK_PI(target) ; le waiter détient le futex chain ; l'owner se bloque ensuite sur chain (cycle : waiter→target→owner→chain→waiter). Lors du requeue, la remontée de chaîne détecte rt_mutex_owner(chain)==top_task (rtmutex step[6]) → -EDEADLK → le rollback de remove_waiter utilise le current du requeuer et nettoie la mauvaise cible → le pi_blocked_on du waiter reste pendant. L'owner doit réduire sa priorité (nice=10) pour que la prio après boost diffère de owner_waiter->prio, sinon rt_mutex_waiter_equal sort prématurément.

Correctif overlay (implémenté)

Avec shift=12, les mots 6-7 (task/lock) du fake waiter tombent dans res_in[3..4] (zone mise à zéro par le noyau). En exploitant la sémantique de do_select : res_in[i] = in[i] & POLLIN-ready. Écrire SLIDE_INIT_TASK / fake_lock dans in[3]/in[4], puis dup2 tous les fd correspondants vers des « extrémités de lecture de pipe contenant des données » (toujours EPOLLIN-ready) → res_in[3]=init_task, res_in[4]=fake_lock encodés précisément. Les mots 3-5 (pi_tree) et 8-10 peuvent être nuls (le chemin ownerless-lock n'utilise pas pi_tree ; prio/deadline sont écrasés par le noyau à l'étape step[7]). pselect retourne immédiatement grâce aux fd prêts → le waiter fait une attente active en espace utilisateur (signaux bloqués, zéro syscall, pour empêcher la réutilisation de la pile noyau d'effacer le fake waiter) jusqu'à ce que le consumer ait terminé le déclenchement. La table HW_FUTEX_PI à 11 mots, les deux classes de fd et le délai d'attente du processus parent sont tous implémentés (git diff).

Problèmes secondaires restants (notés par l'agent de conception, ne bloquent pas l'overlay)

  • La valeur de fuite de boot_id est un alias constant de direct-map (*(boot_id)=DM(loggers[0][1])) ; stext=leaked-p0_alias_image_offset(NFULNL_LOGGER) présente un off-by par rapport à DM(_stext) ; si la phase root passe entièrement par physmap (espace DM), c'est cohérent, sinon il faut utiliser à la place le slide d'exécution de perf_event_open (disponible sous rish).
  • Forme d'écriture : smt878u passe par pi_tree (dequeue_pi), le chemin ownerless de GOT-W29 n'utilise que tree (rt_mutex_dequeue) — ce correctif utilise la forme tree (tree_pc=LOGGERS, tree_left=BOOT_ID).

Vérification sur appareil réel (nécessite rish)

  1. tools/cycle_probe (déjà compilé) : vérification peu coûteuse du déclenchement du cycle EDEADLK ; si, après EDEADLK, un sched_setattr sur le waiter déclenche un oops du consumer = pointeur pendant présent + overlay en place.
  2. Exploit complet : déployer via build_tools/deploy_test.sh, observer slide-kaslr-ok ou un oops du consumer.
  3. Blocage secondaire : calibrer l'arithmétique de fuite avec le slide perf.

Répertoires

root@kitploit:~
tools/      验证工具(perf KASLR, EDEADLK 探针, overlay 测试, kaslr.json)
target/     全部实测偏移
exploit/    移植的 slide.c(含 EDEADLK 触发改动)

Remerciements

  • PoC en amont : x-spy/CVE-2026-43499-popsicle, soralis0912/CVE-2026-43499-aristotle, JoinChang/ghostlock-oneplus, Wtrwx/smt878u-ionstack-poc (GPL-3.0)
  • CVE : NVD, Red Hat RHSB-2026-010
Télécharger l’outil