Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
GhostLock-GOT-W29 — Investigación sobre CVE-2026-43499 (GhostLock) en HUAWEI MatePad Pro 11 GOT-W29 | Kitploit
Herramientas/GitHubGitHub/zzzxxxxxxxxxx/ghostlock-got-w29
Escalada de PrivilegiosAnálisis de VulnerabilidadesExplotaciónIngeniería InversaSeguridad MóvilExplotación de Binarios
GitHubzzzxxxxxxxxxx/ghostlock-got-w29

GhostLock-GOT-W29

Investigación sobre CVE-2026-43499 (GhostLock) en HUAWEI MatePad Pro 11 GOT-W29

Ver Repositorio
1hace 9 díasAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

CVE-2026-43499 (GhostLock) — Investigación sobre HUAWEI MatePad Pro 11 GOT-W29

Registro de investigación de escalada de privilegios para CVE-2026-43499 (Linux rtmutex/futex-PI UAF, "GhostLock") en HUAWEI MatePad Pro 11 GOT-W29 (Qualcomm kona / Snapdragon 870, HarmonyOS 4.x, kernel 4.19.157-perf+).

Dispositivo

CampoValor
ModeloHUAWEI MatePad Pro 11 GOT-W29 (tablet)
SoCQualcomm kona (SM8250, Snapdragon 870)
SistemaHarmonyOS 4.2 (104.2.0.237C00), de fábrica 4.0 (104.0.0.136)
Kernel4.19.157-perf+ (2025-10-13 build)
VA39-bit, 4K pages, KASLR on

Vulnerabilidad

CVE-2026-43499: remove_waiter() en kernel/locking/rtmutex.c en la ruta de reversión de rt_mutex_start_proxy_lock() limpia con current en lugar de waiter->task, lo que provoca un pi_blocked_on colgante (UAF de pila). Afecta a 2.6.39 ~ 7.1 (este kernel está dentro del rango). Corrección upstream: commit 3bfdc63936dd.

Confirmado en este dispositivo: código fuente rtmutex.c:1110-1112, descompilación de boot.elf y disparo en hardware real, todo verificado.

Resultados verificados (probados en el dispositivo)

1. Fuga de KASLR — mediante perf_event_open ✅

Con shell (uid 2000) y perf_event_paranoid=-1, perf_event_open(PERF_SAMPLE_IP, exclude_user=1) muestrea un clúster de direcciones del texto del kernel; alineando con los desplazamientos de símbolos conocidos se obtiene el slide.

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

Herramienta: tools/perf_kaslr.c. Requisito de ejecución: shell (Shizuku rish), sin intercepción de seccomp.

2. Disparador de EDEADLK ✅

Crea un ciclo PI para que FUTEX_CMP_REQUEUE_PI devuelva -EDEADLK; la reversión dispara el bug de remove_waiter.

Disposición clave: el futex objetivo del requeue está en manos del waiter que se va a requeue (futex2 = waiter_tid) → en task_blocks_on_rt_mutex 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

Herramienta: tools/edeadlk_probe.c (variant 8+2+1 = 11, o 27).

3. Mecanismo de primitiva de escritura (entendido)

En el paso [7] de rt_mutex_adjust_prio_chain, se hace rb_erase sobre un fake waiter (ruta de un solo hijo izquierdo): *(tree_left) = tree_pc (value→target) + escritura incremental con __rb_change_child. En target.h, todos los desplazamientos se midieron mediante desensamblado de boot.elf.

4. Desplazamientos completos (target/)

Ver target/got_w29_target.h. Puntos clave:

  • 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

Bloqueos y correcciones (actualización 2026-08-10)

Causa raíz real: el disparo de EDEADLK tomaba la subruta equivocada (antes del overlay)

El desensamblado de task_blocks_on_rt_mutex en boot.elf lo confirma: este kernel de dispositivo tiene en 0x3808-0x3868 una comprobación anticipada de owner==task (cmp owner,task; b.eq -> -EDEADLK), que retorna antes de la escritura de task->pi_blocked_on (0x38d4 str x21,[x20,#0xa90]). El disparador antiguo de GOT-W29 hacía que el waiter se auto-retuviera futex2=waiter_tid (self-own) → justo caía en esa comprobación anticipada → nunca se establecía pi_blocked_on → sin puntero colgante. La observación en el dispositivo (sin crash + boot_id sin cambios) coincide plenamente con "sin colgante": la colocación del overlay era un diagnóstico erróneo.

Disparo correcto (referencia smt878u, ya implementado): ciclo PI — el owner retiene FUTEX_LOCK_PI(target) (el objetivo del requeue); el waiter retiene el futex de la cadena; el owner se bloquea a su vez en la cadena (ciclo: waiter→target→ owner→chain→waiter). Al hacer el requeue, la cadena recorre la detección rt_mutex_owner(chain)==top_task (rtmutex step[6]) → -EDEADLK → la reversión de remove_waiter limpia a la persona equivocada usando el current del requeuer → el pi_blocked_on del waiter queda colgante. El owner necesita reducir su prioridad (nice=10) para que, tras el boost, su prio sea distinto de owner_waiter->prio; de lo contrario, rt_mutex_waiter_equal sale antes de tiempo.

Corrección del overlay (implementada)

Con shift=12, las palabras 6-7 (task/lock) del fake waiter caen en res_in[3..4] (zona que el kernel pone a cero). Aprovechando la semántica de do_select: res_in[i] = in[i] & POLLIN-ready. Se escribe SLIDE_INIT_TASK / fake_lock en in[3]/in[4], y todos los fd correspondientes se hacen dup2 al "extremo de lectura de una tubería con datos" (siempre EPOLLIN-ready) → res_in[3]=init_task, res_in[4]=fake_lock quedan codificados con precisión. Las palabras 3-5 (pi_tree) y 8-10 pueden ser cero (la ruta ownerless-lock no usa pi_tree; prio/deadline los sobrescribe el kernel en step[7]). pselect regresa inmediatamente por el fd ready → el waiter hace espera ocupada en modo usuario (señales deshabilitadas, cero syscalls, para evitar que la reutilización de la pila del kernel borre el fake waiter) hasta que el consumer complete el disparo. La tabla 11-word HW_FUTEX_PI y la clase de doble fd y el tiempo de espera del proceso padre ya están implementados (git diff).

Problemas menores pendientes (marcados por el agente de diseño, no bloquean el overlay)

  • El valor filtrado de boot_id es un alias constante de direct-map (*(boot_id)=DM(loggers[0][1])); stext=leaked-p0_alias_image_offset(NFULNL_LOGGER) tiene un off-by con DM(_stext); si la fase root usa physmap (espacio DM) en todo momento es autoconsistente; de lo contrario, hay que usar el slide en tiempo de ejecución de perf_event_open (disponible bajo rish).
  • Forma de escritura: smt878u usa pi_tree (dequeue_pi); la ruta ownerless de GOT-W29 solo usa tree (rt_mutex_dequeue) — esta corrección usa la forma de tree (tree_pc=LOGGERS, tree_left=BOOT_ID).

Verificación en hardware real (requiere rish)

  1. tools/cycle_probe (ya compilado): verificación barata del disparo de EDEADLK por ciclo; si tras EDEADLK se hace sched_setattr al waiter y se provoca un oops del consumer = existe el colgante + el overlay aterrizó.
  2. Exploit completo: desplegar con build_tools/deploy_test.sh y observar slide-kaslr-ok o consumer oops.
  3. Bloqueo menor: calibrar la aritmética de la fuga con el slide de perf.

Directorio

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

Agradecimientos

  • 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
Descargar herramienta