Akamai adquirirá LayerX para reforzar el control de uso de IA en cualquier navegador. Obtener detalles

La corrección al detalle: Análisis con IA de la causa de la CVE-2025-60719

Maor Dahan

Dec 08, 2025

Maor Dahan

Maor Dahan

escrito por

Maor Dahan

Maor Dahan is a Senior Security Researcher at Akamai with more than a decade of experience in the cybersecurity industry. He specializes in operating system internals, vulnerability research, and malware analysis. Maor also has extensive experience designing and developing advanced detection and prevention mechanisms for innovative security products such as EDR, EPP, and virtualization-based security.

Compartir

Resumen ejecutivo

Los investigadores de Akamai han creado una nueva función de IA para el análisis instantáneo de la principal causa de un problema. La herramienta es un sistema multiagente supervisado, denominado PatchDiff-AI. En esta entrada del blog, la utilizamos para realizar un análisis profundo de la CVE-2025-60719, que afecta a casi todas las versiones de Windows. 

  • La vulnerabilidad: Una vulnerabilidad Use After Free (UAF) en el controlador de función auxiliar de Windows (afd.sys) para Winsock causada por una condición de carrera

  • El impacto: Escala de privilegios local; un atacante con privilegios bajos puede manipular la memoria del núcleo y obtener privilegios del sistema

  • Causa principal: El controlador no puede impedir que un punto final de socket se desvincule (se libere) mientras otras operaciones (como Transfer, GetInformation o Connect) están cancelando la referencia a objetos asociados

  • La solución: Microsoft ha agregado un mecanismo de barrera de sincronización (AfdPreventUnbind / AfdReallowUnbind) para bloquear explícitamente el estado del punto final durante las operaciones críticas

Siga leyendo para descubrir cómo se puede utilizar la herramienta PatchDiff-AI para analizar rápidamente la causa de una vulnerabilidad de alto impacto cubierta en el Patch Tuesday y permitir a los equipos de seguridad detectar y mitigar mejor las vulnerabilidades de un día.

La vulnerabilidad

CVE-2025-60719 representa un defecto significativo en la pila de red del núcleo de Windows, específicamente en afd.sys, la piedra angular de la API Winsock. Si la explotación da resultado, un proceso con privilegios bajos obtendría privilegios del sistema. Sin embargo, hemos probado nuestro exploit en un proceso AppContainer y ha fallado debido a que los permisos son insuficientes. 

La vulnerabilidad afecta a muchos productos de Windows, incluidas todas las siguientes versiones de Windows:

  • Windows Server: 2008 SP2 (x86/x64), 2008 R2 SP1, 2012, 2012 R2, 2016, 2019, 2022, 2022 23H2, 2025

  • Windows 11: 23H2, 24H2, 25H2 

  • Windows 10: Versiones 1607, 1809, 21H2, 22H2 

  • Otras versiones descatalogadas

Este amplio espectro de versiones afectadas aumenta significativamente la superficie de ataque.

Análisis de la causa principal

Con PatchDiff-AI, podemos analizar rápidamente el parche de seguridad que, según el aviso del proveedor, corrige la vulnerabilidad. La lectura de los resultados de la herramienta indica que los cambios de código relevantes implican los métodos AfdSocketTransfer*, AfdGetInformation, Afdbind y AfdConnect.

Una mirada más detallada revela que la causa raíz de esta vulnerabilidad reside en la administración del ciclo de vida de la estructura AFD Endpoint (denominada AFD_ENDPOINT) y la falta de atomicidad (sincronización de operaciones simultáneas) entre la obtención de un puntero de objeto y su uso.

Entre cambio y cambio

La herramienta PatchDiff-AI destacó un componente directamente relacionado con la lógica principal de la vulnerabilidad: el controlador de función auxiliar (afd.sys), que implementa el soporte de red de capa de transporte principal de Windows. Proporciona la interfaz Winsock, administra sockets de red y maneja otras funcionalidades relacionadas con la E/S.

El análisis de la herramienta se basa en la versión corregida 10.0.26100.7171, como parte de la actualización de seguridad KB5068861, y se prueba con la versión vulnerable 10.0.26100.6899, que forma parte de la actualización de seguridad KB5066835.

Hay cinco funciones modificadas en total, y todas ellas fueron clasificadas como relacionadas con la seguridad por la herramienta.

Al analizar la función AfdGetInformation, podemos identificar el bloque de código que ahora está protegido al bloquear la operación de desvinculación, impidiendo que el socket se libere (Figura 1). Dado que sabemos que este cambio se refiere al ciclo de vida del socket e interfiere con su estado, podemos asumir que está relacionado con una vulnerabilidad de UAF.

Al analizar la función AfdGetInformation, podemos identificar el bloque de código que ahora está protegido al bloquear la operación de desvinculación, impidiendo que el socket se libere (Figura 1). Fig. 1: Vista de BinDiff de la afd!AfdGetInformation con parches junto con su versión anterior

Controlador de funciones auxiliares: Inicio rápido

Existen algunos artículos detallados sobre cómo funciona el controlador de función auxiliar (afd.sys) y cómo usarlo. En resumen, se trata de un componente de Windows responsable de servir la API de Winsock. Hace posible que los procesos de bajo privilegio utilicen la pila de red para TCP/IP y otros protocolos de comunicación.

En la figura 2, encontramos muchos binarios de referencia que llaman a afd.sys a través de controles de entrada/salida (IOCTL). Y podemos entender qué llamada está relacionada con qué interfaz, uniendo las llamadas de la aplicación en modo de usuario y la activación lógica del módulo del núcleo. Nos ayudará más adelante a realizar llamadas directas al controlador y a depurar el comportamiento del controlador.

En la figura 2, encontramos muchos binarios de referencia que llaman a afd.sys a través de controles de entrada/salida (IOCTL). Fig. 2: Diagrama de la arquitectura en capas de Winsock (Fuente: https://recon.cx/2015/slides/recon2015-20-steven-vittitoe-Reverse-Engineering-Windows-AFD-sys.pdf)

La lógica al detalle

La vulnerabilidad es una condición de carrera clásica que conduce a un escenario UAF. Afecta a varias rutinas de entrega, incluidas AfdSocketTransfer*, AfdGetInformation, AfdBind y AfdConnect.

El problema principal surge cuando una aplicación en modo de usuario emite una solicitud IOCTL específica mientras cierra simultáneamente el socket en un subproceso independiente. En la versión sin parches, el controlador obtuvo punteros que dirigían al dispositivo final, al objeto File u objeto Device. Los utilizó sin asegurarse de si la operación de cierre simultánea había dejado de liberar la memoria subyacente. Esto creó una ventana en la que el núcleo operaba con memoria no válida, lo que permitía a un atacante local corromper la memoria del núcleo u obtener privilegios elevados.

Cuando un proceso recurre a la función afd!AfdGetInformation para obtener clases de información específica mediante un identificador de un socket enlazado (Listen), debe comprobar algunas condiciones necesarias, como el tipo de socket y su capa de protocolo. Entonces, si seguimos el flujo de llamada, podemos encontrar que la función subyacente presenta un cambio para las diferentes operaciones que el remitente puede utilizar.

El bloque de código vulnerable reside en el caso AFD_MAX_PATH_SEND_SIZE (Figura 3). En otras palabras, para alcanzar la ruta vulnerable será necesario que el remitente proporcione los valores correctos al llamar a la interfaz y que el socket esté conectado.

class AFD_INFORMATION_CLASS(IntEnum):
   AFD_INLINE_MODE = 1  # s: BOOLEAN
   AFD_NONBLOCKING_MODE = 2  # s: BOOLEAN
   AFD_MAX_SEND_SIZE = 3  # q: ULONG
   AFD_SENDS_PENDING = 4  # q: ULONG
   AFD_MAX_PATH_SEND_SIZE = 5  # q: ULONG
   AFD_RECEIVE_WINDOW_SIZE = 6  # q; s: ULONG
   AFD_SEND_WINDOW_SIZE = 7  # q; s: ULONG
   AFD_CONNECT_TIME = 8  # q: ULONG (seconds)
   AFD_CIRCULAR_QUEUEING = 9  # s: BOOLEAN
   AFD_GROUP_ID_AND_TYPE = 10  # q: AFD_GROUP_INFO
   AFD_REPORT_PORT_UNREACHABLE = 11  # s: BOOLEAN
   AFD_REPORT_NETWORK_UNREACHABLE = 12  # s: BOOLEAN
   AFD_DELIVERY_STATUS = 14  # q: SIO_DELIVERY_STATUS
   AFD_CANCEL_TL = 15  # s: void
Fig. 3: Enum of the possible classes AfdGetInformation function’s supported

En la figura 4, puede encontrar una versión descompilada del código vulnerable (antes) en comparación con el código revisado (después).

En la figura 4, puede encontrar una versión descompilada del código vulnerable (antes) en comparación con el código revisado (después). Fig. 4: Antes y después de aplicar el parche

La condición de carrera

El controlador afd.sys mantiene el ciclo de vida del punto final y se puede tener acceso al objeto final simultáneamente desde varios subprocesos. En la figura 5, m_Endpoint->State representa el estado del socket. 

El controlador afd.sys mantiene el ciclo de vida del punto final y se puede tener acceso al objeto final simultáneamente desde varios subprocesos. En la figura 5, m_Endpoint->State representa el estado del socket. Fig. 5: Limitar condicionalmente la ejecución a los estados “bound” y “connected” (línea 171)

Para mantener el socket en un estado válido, el módulo del núcleo debe manejarlo con extremo cuidado. En este caso, hay una ventana durante la cual el estado se puede cambiar a través de otro subproceso y, finalmente, liberar el punto final por completo mediante el comando de control unbind.

Un atacante local puede aprovecharlo creando una "carrera" entre dos subprocesos:

  • Hilo A: Envía repetidamente un IOCTL vulnerable (por ejemplo, IOCTL_AFD_GET_INFORMATION).

  • Hilo B: Repite la unión y desunión del socket.

Si el subproceso B gana la carrera después de que el subproceso A haya recuperado el puntero, pero antes de que el subproceso A lo utilice, el subproceso A dejará de referenciar la memoria liberada.

Un intruso en la fiesta

Mediante el informe PatchDiff-AI y los demás recursos, podemos comprender cómo utilizar la función afd!AfdGetInformation y llamarla con los argumentos correctos para ganar la carrera (Figura 6).

Fig. 6: Código de prueba de concepto que desencadena la vulnerabilidad

En la figura 7, puede encontrar la pila de llamadas del bloqueo cuando llama a AfdGetInformation hasta que se genera una excepción PageFault.

En la Figura 7 se puede observar la pila de llamadas del crash cuando se invoca AfdGetInformation, hasta el punto en que se produce una excepción de PageFault. Fig. 7: La pila de llamadas del flujo que provocó la falla

Vector de ataque 

Se trata de un error de escala de privilegios locales que solo afecta al sistema local. Un atacante que pueda ejecutar código arbitrario desde un proceso local de privilegios bajos puede aprovechar la condición de carrera y obtener privilegios más altos.

Aunque la herramienta PatchDiff-AI no está destinada a crear un exploit, puede ayudar a comprender el supuesto procedimiento de explotación.

  • Inicio: El atacante abre un AfdSocket válido utilizando NtCreateFile().

  • Preparación/Difusión: Aunque no es estrictamente necesario para el ataque, la exploit de EoP a menudo implica la difusión en pila para sustituir el AFD_ENDPOINT liberado por una estructura falsa controlada por el atacante.

  • Activación: El atacante genera dos subprocesos. El subproceso 1 se ejecuta en bucle en NtDeviceIoControlFile con el IOCTL vulnerable (por ejemplo, IOCTL_AFD_GET_INFORMATION). El subproceso 2 se ejecuta en bucles consecutivos IOCTL_AFD_BIND e IOCTL_AFD_UNBIND.

  • Ejecución: Cuando se gana la carrera, el núcleo ejecuta una llamada (como IoGetRelatedDeviceObject) en el objeto falso del atacante, lo que lleva a la manipulación de la memoria del núcleo.

Cómo proteger su sistema

  • Aplicar el parche: La única protección efectiva es instalar la actualización de seguridad de Windows correspondiente. El parche refuerza afd.sys al aplicar estrictamente la barrera de desenlazado.

  • Mitigación: El uso de un conjunto de reglas SIGMA o YARA para identificar la interacción con AFD que podría indicar un intento de explotación puede reducir la amenaza. En la mayoría de los casos, puede ser suficiente realizar un seguimiento de los procesos que inician las llamadas de IOCTL al controlador afd e intentar diseminar la memoria del conjunto de núcleo mediante llamadas repetidas (figura 8).

  • Detección: Dado que el punto final AFD (socket) se expone en última instancia a través del subsistema de E/S de Windows como un controlador de archivos, podemos interceptar las llamadas IRP y supervisar actividades sospechosas, especialmente en casos de puntos finales desconectados.

import "pe"

rule CVE_2025_60719 {
    meta:
        description = "Detects exploits for CVE-2025-60719 targeting afd.sys"
        author      = "Maor Dahan"
        date        = "2025-12-01"
        reference   = "https://github.com/akamai/CVE-2025-60719-AFD.SYS"

    strings:
        // Core Indicators - The specific device name is strong indicator
        $str_device  = "\\Device\\Afd\\Endpoint" ascii wide
	   $str_device_double  = "\\\\Device\\\\Afd\\\\Endpoint" ascii

        
        // Specific IOCTL constants used in the exploit
        // 0x12003 = IOCTL_AFD_BIND
        $ioctl_str_bind = "0x12003" ascii
        $ioctl_hex_bind = { 03 20 01 00 }
        
        // 0x12113 = IOCTL_AFD_UNBIND
        $ioctl_str_unbind = "0x12113" ascii
        $ioctl_hex_unbind = { 13 21 01 00 }
        
        // 0x1207B = IOCTL_AFD_GET_INFORMATION
        $ioctl_str_info = "0x1207B" ascii
        $ioctl_hex_info = { 7B 20 01 00 }

    condition:
        ($str_device or $str_device_double) and 
        (
            (
                pe.is_pe and
                pe.imports("ntdll.dll", "NtDeviceIoControlFile") and
                all of ($ioctl_hex_*)
            )
        or
            (
                not pe.is_pe and
                (
                    (
		       all of ($ioctl_str_*) or
		       3 of ($ioctl_*)
		   )
                )
            )
        )
}
Fig. 8: Sample YARA rule for identifying potential threats, both binaries and scripts

Conclusiones

Mediante PatchDiff-AI, puede automatizar la correlación entre los cambios binarios y la lógica de seguridad, y localizar rápidamente la causa sin perderse en el ruido de las modificaciones irrelevantes del código. Esto permite a los equipos de seguridad actuar rápidamente para evitar ataques de un día. 

El caso de la CVE-2025-60719 destaca la complejidad de la gestión de parches en los controladores del núcleo y cómo el análisis de la herramienta PatchDiff-AI puede proporcionar detalles en profundidad para diversos fines.

Maor Dahan

Dec 08, 2025

Maor Dahan

Maor Dahan

escrito por

Maor Dahan

Maor Dahan is a Senior Security Researcher at Akamai with more than a decade of experience in the cybersecurity industry. He specializes in operating system internals, vulnerability research, and malware analysis. Maor also has extensive experience designing and developing advanced detection and prevention mechanisms for innovative security products such as EDR, EPP, and virtualization-based security.

Etiquetas

Compartir

Entradas de blog relacionadas

Investigaciones sobre seguridad
Análisis de dominios maliciosos que suplantan la identidad de CrowdStrike: afectados y previsiones de futuro
Los investigadores de Akamai examinan el tráfico de ataque a los sitios que pretenden asociarse a servicios de mitigación o asistencia en relación con el incidente de la pantalla azul de CrowdStrike.
Investigaciones sobre seguridad
Coyote en el mundo real: El primer malware de la historia que abusa de UI Automation
July 22, 2025
Obtenga más información sobre la última variante de malware Coyote: el primer malware que usa indebidamente la automatización de la interfaz de usuario.
Ciberseguridad
Perspectiva de Akamai sobre el Patch Tuesday de septiembre de 2023
Vuelve una vez más el Patch Tuesday, esta vez con un total de 65 CVE. Dos fueron críticas y dos se explotaron libremente, pero vamos a tratar las más grandes.