Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
GhostLock-GOT-W29 — Ricerca su CVE-2026-43499 (GhostLock) per HUAWEI MatePad Pro 11 GOT-W29 | Kitploit
Strumenti/GitHubGitHub/zzzxxxxxxxxxx/ghostlock-got-w29
Escalation di PrivilegiAnalisi delle VulnerabilitàExploitReverse EngineeringSicurezza MobileBinary Exploitation
GitHubzzzxxxxxxxxxx/ghostlock-got-w29

GhostLock-GOT-W29

Ricerca su CVE-2026-43499 (GhostLock) per HUAWEI MatePad Pro 11 GOT-W29

Vedi Repository
18 giorni faNon ancora revisionato

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

CVE-2026-43499 (GhostLock) — Ricerca su HUAWEI MatePad Pro 11 GOT-W29

Note di ricerca sull'elevazione dei privilegi per CVE-2026-43499 (Linux rtmutex/futex-PI UAF, "GhostLock") su HUAWEI MatePad Pro 11 GOT-W29 (Qualcomm kona / Snapdragon 870, HarmonyOS 4.x, kernel 4.19.157-perf+).

Dispositivo

CampoValore
ModelloHUAWEI MatePad Pro 11 GOT-W29 (tablet)
SoCQualcomm kona (SM8250, Snapdragon 870)
SistemaHarmonyOS 4.2 (104.2.0.237C00), versione di fabbrica 4.0 (104.0.0.136)
Kernel4.19.157-perf+ (build del 2025-10-13)
VA39-bit, pagine 4K, KASLR attivo

Vulnerabilità

CVE-2026-43499: remove_waiter() in kernel/locking/rtmutex.c, nel percorso di rollback di rt_mutex_start_proxy_lock(), esegue la pulizia con current invece di waiter->task, lasciando un pi_blocked_on pendente (UAF dello stack). Interessa 2.6.39 ~ 7.1 (questo kernel è nel range). Fix upstream: commit 3bfdc63936dd.

Confermato su questo dispositivo: sorgente rtmutex.c:1110-1112, decompilazione di boot.elf e trigger su dispositivo reale, tutto verificato.

Risultati verificati (testati su dispositivo reale)

1. Leak di KASLR — tramite perf_event_open ✅

Con la shell (uid 2000), perf_event_paranoid=-1, perf_event_open(PERF_SAMPLE_IP, exclude_user=1) campiona i cluster di indirizzi del testo del kernel; allineandoli agli offset noti dei simboli si ottiene lo slide.

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

Strumento: tools/perf_kaslr.c. Prerequisito di esecuzione: shell (Shizuku rish), nessuna intercettazione seccomp.

2. Trigger EDEADLK ✅

Si crea un ciclo PI per far sì che FUTEX_CMP_REQUEUE_PI restituisca -EDEADLK; il rollback innesca il bug di remove_waiter.

Disposizione chiave: il futex target del requeue è detenuto dal waiter in fase di requeue (futex2 = waiter_tid) → in task_blocks_on_rt_mutex si ha owner == task → -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

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

3. Meccanismo della primitiva di scrittura (compreso)

Lo step[7] di rt_mutex_adjust_prio_chain esegue rb_erase (percorso con unico figlio sinistro) sul fake waiter: *(tree_left) = tree_pc (value→target) + scrittura incrementale __rb_change_child. Tutti gli offset in target.h sono misurati tramite disassemblaggio di boot.elf.

4. Offset completi (target/)

Vedi target/got_w29_target.h. Punti chiave:

  • 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

Bloccanti e correzioni (aggiornamento 2026-08-10)

Causa principale reale: il trigger EDEADLK percorreva il sotto-percorso sbagliato (prima dell'overlay)

Il disassemblaggio di task_blocks_on_rt_mutex da boot.elf è la prova definitiva: il kernel di questo dispositivo ha un controllo anticipato owner==task a 0x3808-0x3868 (cmp owner,task; b.eq -> -EDEADLK), che ritorna prima della scrittura di task->pi_blocked_on (0x38d4 str x21,[x20,#0xa90]). Il vecchio trigger GOT-W29 faceva detenere al waiter futex2=waiter_tid (self-own) → colpisce esattamente quel controllo anticipato → pi_blocked_on non viene mai impostato → nessun puntatore pendente. Le osservazioni sul dispositivo (nessun crash + boot_id invariato) corrispondono pienamente a "nessun puntatore pendente" — il posizionamento dell'overlay era una diagnosi errata.

Trigger corretto (riferimento smt878u, implementato): ciclo PI — l'owner FUTEX_LOCK_PI(target) detiene il target del requeue; il waiter detiene il chain futex; l'owner si blocca poi sulla chain (ciclo: waiter→target→owner→chain→waiter). Al requeue, la catena rileva rt_mutex_owner(chain)==top_task (rtmutex step[6]) → -EDEADLK → il rollback di remove_waiter usa il current del requeuer e ripulisce la persona sbagliata → il pi_blocked_on del waiter resta pendente. L'owner deve abbassare la priorità (nice=10) in modo che, dopo il boost, la prio sia diversa da owner_waiter->prio; altrimenti rt_mutex_waiter_equal esce prematuramente.

Fix dell'overlay (implementato)

Con shift=12, le parole 6-7 (task/lock) del fake waiter ricadono in res_in[3..4] (zona azzerata dal kernel). Sfruttando la semantica di do_select: res_in[i] = in[i] & POLLIN-ready. Scrivendo SLIDE_INIT_TASK / fake_lock in in[3]/in[4] e facendo dup2 di tutti i fd corrispondenti sull'"estremità di lettura di una pipe con dati" (sempre EPOLLIN-ready) → res_in[3]=init_task, res_in[4]=fake_lock codificati con precisione. Le parole 3-5 (pi_tree) e 8-10 possono essere zero (il percorso ownerless-lock non usa pi_tree; prio/deadline vengono sovrascritti dal kernel a step[7]). pselect ritorna immediatamente grazie ai fd pronti → il waiter fa busy-wait in spazio utente (segnali disabilitati, zero syscall, per evitare che il riuso dello stack del kernel cancelli il fake waiter) finché il consumer non completa il trigger. La tabella HW_FUTEX_PI a 11 parole, la classe a doppio fd e il timeout di attesa del processo padre sono implementati (git diff).

Problemi secondari residui (annotati dall'agente di design, non bloccano l'overlay)

  • Il valore leakato di boot_id è un alias costante della direct-map (*(boot_id)=DM(loggers[0][1])); stext=leaked-p0_alias_image_offset(NFULNL_LOGGER) presenta un off-by rispetto a DM(_stext); se la fase root percorre interamente la physmap (spazio DM) è autoconsistente, altrimenti si deve usare lo slide runtime di perf_event_open (disponibile sotto rish).
  • Forma di scrittura: smt878u usa pi_tree (dequeue_pi), mentre il percorso ownerless di GOT-W29 usa solo tree (rt_mutex_dequeue) — questa correzione usa la forma tree (tree_pc=LOGGERS, tree_left=BOOT_ID).

Verifica su dispositivo reale (richiede rish)

  1. tools/cycle_probe (già compilato): verifica a basso costo del trigger EDEADLK ciclico; dopo EDEADLK, se sched_setattr sul waiter fa scattare l'oops del consumer = il puntatore pendente esiste + overlay atterrato.
  2. Exploit completo: deploy con build_tools/deploy_test.sh, osservare slide-kaslr-ok oppure l'oops del consumer.
  3. Bloccante minore: calibrare l'aritmetica del leak con lo slide di perf.

Directory

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

Ringraziamenti

  • PoC upstream: 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
Scarica lo strumento