Estamos en 2025 y, mientras los equipos de seguridad refuerzan sus perímetros, las listas de correo del núcleo de Linux bullen con una nueva amenaza. El Grupo de Análisis de Amenazas (TAG) de Google ha confirmado el armamento de CVE-2025-38352.
No se trata de un error de corrupción de memoria común y corriente. Es un sofisticado, dependiente del tiempo Condición de carrera que reside en las profundidades del subsistema POSIX del temporizador de la CPU del Kernel de Linux. Con una puntuación CVSS de 7,4, puede parecer manejable a primera vista, pero no se deje engañar por la puntuación. En manos de vendedores comerciales de software espía, esta vulnerabilidad ya ha sido utilizada como arma para lograr un rendimiento fiable. Escalada local de privilegios (LPE) en dispositivos Android totalmente parcheados, eludiendo mitigaciones modernas como KASLR y PAN.
Para el ingeniero de seguridad de élite, CVE-2025-38352 representa el pináculo de la explotación "Race-to-Use-After-Free". Explota la microscópica brecha entre un proceso que entra en estado "Zombie" y el kernel que limpia sus temporizadores. Este artículo abandona los resúmenes de alto nivel para realizar una disección quirúrgica de kernel/time/posix-cpu-timers.cy por qué el análisis temporal basado en la IA es la única forma de detectar lo que los auditores humanos pasan por alto.
El fallo fatal del núcleo: un baile de espoletas roto
Para entender CVE-2025-38352, debemos mirar cómo el Kernel de Linux maneja la concurrencia durante la terminación del proceso. La vulnerabilidad proviene de una violación de atomicidad en la forma en que el kernel procesa los temporizadores de CPU caducados mientras un hilo está intentando borrarlos simultáneamente.
La ruta del código vulnerable
El fallo reside en el handle_posix_cpu_timers() función. Esta función es responsable de iterar sobre una lista de temporizadores activos y disparar aquellos que han expirado. Para llevar a cabo esta iteración, debe mantener el valor suspiro->siglock.
Sin embargo, antes del parche, la lógica contenía una secuencia fatal:
- Adquisición de cerraduras: El núcleo adquiere
suspiro->siglockpara recorrer la lista de temporizadores. - La caída: Para gestionar una capacidad de expiración específica (en concreto
CPUCLOCK_PERTHREAD), el código brevemente deja caer la cerradura para realizar una operación de comprobación o de puesta en cola. - El uso: Vuelve a adquirir el bloqueo y procede a desreferenciar el objeto temporizador.
La ventana de la carrera
Es dentro de esta ventana microscópica -donde se deja caer la cerradura- donde el atacante ataca.
Un hilo concurrente (Hilo B) emite una llamada al sistema timer_delete(). Como el bloqueo está libre, el hilo B lo adquiere con éxito, elimina el temporizador de la lista y libera la memoria mediante kfree_rcu o slab deallocation.
Cuando el subproceso A (el contexto víctima) vuelve a adquirir el bloqueo, mantiene un puntero a un archivo posix_cputimer que técnicamente ya no existe. Procede a escribir en esta memoria (por ejemplo, actualizando el tiempo de expiración), desencadenando un Uso después de la liberación (UAF) escribir.

Arma al zombi: Los primitivos del exploit
Explotar una condición de carrera del kernel se compara a menudo con ganar la lotería. Sin embargo, los desarrolladores de exploits avanzados no juegan a los dados, sino que amañan el juego. En el contexto de CVE-2025-38352, los atacantes amañan el juego utilizando Procesos zombi.
1. Ampliar la ventana (la técnica de la "zombificación")
La ventana de carrera estándar puede tener sólo unos pocos nanosegundos de ancho. Para que la explotación sea fiable (tasa de éxito 90%+), los atacantes utilizan el estado de salida del proceso.
Creando un proceso hijo y haciéndolo salir, pero deliberadamente... no cosechándolo (vía waitpid)-el proceso entra en EXIT_ZOMBIE estado. En este estado, la estructura de la tarea permanece en memoria, pero la lógica de limpieza está pendiente. Los atacantes descubrieron que disparar operaciones de temporizador en un proceso Zombie fuerza al kernel a una ruta de código más lenta y compleja dentro de posix_cpu_timer_deldilatando artificialmente la ventana de carrera de nanosegundos a microsegundos.
2. SLUB Feng Shui (Pulverización de montones)
Una vez que se activa el UAF, el núcleo escribe datos en una ranura de memoria liberada. Si esa ranura está vacía, el kernel se bloquea (DoS). Para obtener Root, el atacante debe reemplazar el objeto temporizador liberado con una carga útil.
Los atacantes aprovechan la Asignador SLUB comportamiento predecible (último en entrar, primero en salir).
- Gratis: Desencadenar la carrera para liberar al
temporizadorestructura. - Spray: Inundar inmediatamente el heap del kernel con objetos controlados por el usuario del mismo tamaño exacto (por ejemplo, usando
sendmsgdatos auxiliares oclave_serieobjetos). - Corrupción: El kernel, pensando que está actualizando el temporizador, escribe en el objeto del atacante. Si el atacante rocía una estructura que contiene un puntero a una función (por ejemplo, un
tty_structooperaciones_archivo), el kernel sobrescribe ese puntero. - Ejecución: Cuando el atacante invoca el objeto pulverizado (por ejemplo, cerrando el archivo), el kernel salta a la dirección sobrescrita -> Cadena ROP -> Raíz.

Más allá de Syzkaller: Por qué fracasó el fuzzing tradicional
CVE-2025-38352 no fue detectado por fuzzers automatizados como Syzkaller de Google durante años. ¿Por qué?
El fuzzing tradicional guiado por cobertura es probabilístico. Lanza llamadas aleatorias al kernel con la esperanza de colapsarlo.
- No entiende Cronometraje.
- No entiende Dependencias estatales (por ejemplo, "El subproceso A debe estar saliendo mientras el subproceso B borra un temporizador").
La probabilidad estadística de que un fuzzer ciego llegue a esta condición de carrera específica, con el proceso en el exacto ZOMBIE estado, es astronómicamente baja.
La solución de la IA: El análisis temporal de Penligent
Este fracaso de las herramientas tradicionales pone de relieve la necesidad de Análisis lógico basado en IA. Aquí es donde Penligent.ai cambia el paradigma de "Fuzzing" a "Reasoning".
Penligent utiliza un Agente de IA consciente del tiempo diseñado para la caza de errores de concurrencia:
1. Reconocimiento de patrones de concurrencia
En lugar de entradas aleatorias, el modelo de Penligent analiza el AST (árbol de sintaxis abstracta) del núcleo. Identifica "Pares Peligrosos" - llamadas al sistema que modifican el mismo recurso compartido (en este caso, posix_cputimer) pero siguen caminos de bloqueo diferentes. Se ha marcado timer_delete y handle_posix_cpu_timers como objetivo de colisión de alta probabilidad.
2. Dilatación de la ventana de carrera mediante IA
Penligent no se limita a ejecutar syscalls; las orquesta. Al reconocer la necesidad de ampliar la ventana de carrera, la IA dedujo automáticamente la EXIT_ZOMBIE mediante el análisis de informes de vulnerabilidad "Ref-Count" anteriores. Generó una Prueba de Concepto que paralizaba programáticamente la CPU (utilizando sched_yield o extensas barreras de memoria) para garantizar la colisión.
Para el ingeniero de seguridad, esto significa que Penligent va más allá de informar de "fallos potenciales" para ofrecer hazañas verificadas y armadas que demuestren el verdadero perfil de riesgo del código.
Remediación y detección del equipo azul
La solución, incorporada al núcleo de Linux a finales de 2025, implica una comprobación lógica en lugar de un simple bloqueo.
La solución:
En run_posix_cpu_timers(), el núcleo ahora comprueba explícitamente si (tsk->exit_state). Si la tarea ya está muerta o muriendo, aborta el procesamiento del temporizador inmediatamente. Esto elimina efectivamente la variable "Zombie" de la ecuación.
Estrategias de detección (EDR/Syslog):
Los equipos Blue deben buscar los siguientes indicadores de compromiso (IoC) en servidores Linux/Android:
- Temporizador de alta frecuencia: Un proceso que crea y borra rápidamente miles de temporizadores POSIX por segundo.
- Inundaciones zombis: Una acumulación inusual de
Zprocesos estatales que se generan rápidamente y no se cosechan. - Mancha del núcleo:
dmesgregistros que muestran "Fallos generales de protección" o "Corrupción de losas" enkmalloc-192(o el tamaño de losa específico para temporizadores en su arco).
Conclusión
CVE-2025-38352 sirve como recordatorio festivo de que el código heredado es un campo de minas. El código del temporizador POSIX se escribió hace décadas, pero contenía un fallo latente que requería el complejo panorama de memoria de 2025 para convertirse en un arma.
Para el ingeniero de seguridad empedernido, la lección está clara: el futuro de la investigación de vulnerabilidades no consiste en encontrar simples desbordamientos de búfer. Se trata de comprender la cuarta dimensión del código.Tiempo. Mientras los núcleos empleen complejos mecanismos de bloqueo, las condiciones de carrera seguirán siendo las "joyas de la corona" de la explotación.

