
Notas de investigación y desarrollo de PoC para CVE-2026-43499 (GhostLock) kernel UAF en vivo Y200i Android 14, cubriendo primitivas de recuperación de pila de cadena PI de futex y límites de diseño de marcos.
Dispositivo: vivo Y200i (PD2354C), Snapdragon 4 Gen 2 (SM4450), Android 14 / OriginOS 4 Kernel: 5.10.218-gki-g3a51ea9d5834 (VA de 39 bits, páginas de 4K, KASLR activado, STACKLEAK=y, sin SVE)
Objetivo: root temporal mediante CVE-2026-43499 (GhostLock).
Funcionando hasta ahora:
Bloqueado: la primitiva de recuperación de pila no puede alcanzar el rb_node del rt_mutex_waiter.
Números clave (idénticos en dos paquetes de firmware independientes):
__arm64_sys_futex 0xe0
do_futex 0xc0 (NO inlineado - existe un bl do_futex)
futex_wait_requeue_pi 0x1b0 (waiter en sp+0x20)
=> profundidad de la cadena futex T0-0x330
__arm64_sys_pselect6 0xa0 core_sys_select 0x1c0 (fd_set en sp+0x50) => profundidad de la cadena pselect T0-0x210, ventana controlable de solo 120 bytes => hueco de 0x120, arquitectónicamente sin solapamiento
disposición del waiter (5.10 compacto, coincide con PFEM10): +0x18 pi_tree_entry.__rb_parent_color <- lo que recorre rt_mutex_adjust_prio_chain +0x20 pi_tree_entry.rb_right +0x28 pi_tree_entry.rb_left +0x30 task +0x38 lock +0x40 prio +0x48 deadline
Evidencia de rt_mutex_adjust_prio_chain: ldr x8, [task, #0x888] ; task->pi_waiters.rb_leftmost sub x8, x8, #0x18 ; rb_entry(node, rt_mutex_waiter, pi_tree_entry)
Dado que copy_from_user escribe hacia direcciones más altas, cubrir pi_tree_entry requiere que la base de la copia sea <= T0-0x318.
Rutas agotadas: pselect6/core_sys_select T0-0x210 -> faltan 0x120 poll/do_sys_poll la ventana termina en T0-0x344, máx 0xf0B (N_STACK_PPS=30) -> faltan 0x14 rt_sigreturn (fpsimd) T0-0x300 -> solo alcanza waiter+0x30 rt_sigreturn (SVE) T0-0x310 -> cubriría waiter+0x10, pero esta CPU no tiene SVE; el kernel rechaza los registros de sigframe SVE con -EINVAL compat rt_sigreturn / vfp T0-0x2c0 -> aún más superficial
Escaneo completo del kernel de todos los sitios copy_from_user: 655 en total, 118 alcanzables, profundidad máxima 0x300 (bpf_prog_get_info_by_fd, también restringido por CAP_BPF). Se necesitan 0x318.
Conclusión: la geometría de pila de este kernel está limitada a 0x300 para copy_from_user basado en pila; cubrir pi_tree_entry necesita 0x318. No es un problema de ajuste - es una diferencia en la disposición del marco en tiempo de compilación. do_futex no está inlineado aquí, a diferencia de PFEM10 (5.10.236, Clang 12.0.5), muy probablemente por un modelo de coste de inlineado diferente.
Buscando:
Referencia: https://github.com/x-spy/CVE-2026-43499-popsicle