GhostLock (CVE-2026-43499) es una vulnerabilidad de escalada de privilegios en el kernel de Linux que existió durante más de 15 años (desde v2.6.39-rc1 hasta v7.1-rc1). La causa raíz es un error de ciclo de vida (Use-After-Free, UAF) en la función remove_waiter() dentro del subsistema rtmutex. Esta función, diseñada para que un hilo se limpie a sí mismo, fue reutilizada incorrectamente en el "proxy path" de FUTEX_CMP_REQUEUE_PI. En este escenario, remove_waiter() asume erróneamente que current (el hilo que realiza la operación de requeue) es el waiter real y, por lo tanto, limpia el campo pi_blocked_on del hilo incorrecto. Esto deja al hilo waiter con un puntero colgante (dangling pointer) a su propio stack frame liberado.
El exploit se basa en la capacidad de un atacante local sin privilegios para forzar una condición de EDEADLK en el subsistema rtmutex mediante una secuencia específica de operaciones con tres futexes y tres hilos. Esta condición activa la ruta de rollback defectuosa, dejando el puntero pi_blocked_on del hilo waiter apuntando a memoria de stack liberada. La ventana de UAF es amplia, ya que el puntero colgante persiste hasta que el hilo waiter regresa a userspace. La explotación posterior implica la reutilización del stack (stack-UAF reclaim) utilizando PR_SET_MM_MAP para sobrescribir el stack frame liberado con una estructura rt_mutex_waiter falsificada. Esto permite obtener una primitiva de escritura controlada (aunque limitada) en el kernel.
La primitiva de escritura se utiliza para sobrescribir una entrada en la tabla inet6_protos (específicamente inet6_protos[IPPROTO_UDP]) con una dirección que apunta al CPU Entry Area (CEA). El CEA es una región de memoria controlable en el kernel, lo que permite al atacante forjar una estructura inet6_protocol falsa y, posteriormente, un ROP stack. Al enviar un paquete UDP IPv6 de loopback, se activa el handler sobrescrito, lo que lleva a un secuestro del flujo de control (CFH). La etapa final del exploit utiliza un ROP corto para modificar los bits de modo de core_pattern (coredump_sysctls[1].mode), haciéndolo escribible globalmente. Esto permite a un proceso sin privilegios manipular core_pattern para ejecutar código como root, logrando la escalada de privilegios completa. Las salvaguardas como KASLR se eluden mediante técnicas como prefetch para filtrar las direcciones base del kernel y del physmap, y la aleatorización del CEA se sortea utilizando su offset físico fijo.