Envío de registros, alertas y datos de telemetría a través de un diodo de datos

Descubre cómo
Utilizamos inteligencia artificial para traducir el sitio web y, aunque nos esforzamos por garantizar la precisión, es posible que las traducciones no sean siempre 100 % exactas. Agradecemos tu comprensión.

Análisis detallado de CVE-2024-38063: una amenaza crítica en la pila TCP/IP de Windows

Por OPSWAT
Última actualización:
Comparte esta publicación
Foto de primer plano de Pham Ngoc Thien, participante en el programa OPSWAT

El 13 de agosto de 2024, el MSTC (Centro de Respuesta de Seguridad de Microsoft) dio a conocer el CVE-2024-38063, una vulnerabilidad crítica en la pila TCP/IP de Windows que puede ser aprovechada para poner en peligro funciones de red esenciales del sistema operativo. En este artículo, los participantes en el Programa de Becas OPSWAT ofrecen un análisis exhaustivo de los detalles técnicos y el impacto potencial de esta falla, así como estrategias de mitigación recomendadas para esta vulnerabilidad.

Participantes en el Programa OPSWAT : Pham Ngoc Thien - Universidad de Tecnología de la Información de Ho Chi Minh 

Resumen

CVE-2024-38063 es una vulnerabilidad crítica de la pila TCP/IP de Windows con una puntuación CVSS de 9,8, que afecta al procesamiento de paquetes IPv6. Los atacantes remotos pueden aprovechar esta vulnerabilidad mediante un desbordamiento por debajo del rango de un entero al gestionar los encabezados de extensión IPv6 para ejecutar código malicioso o provocar un ataque de denegación de servicio (DoS).

Dado que IPv6 está habilitado de forma predeterminada en la mayoría de los sistemas modernos, esta vulnerabilidad de «cero clics» supone un riesgo considerable. Por lo tanto, todas las versiones sin parches de Windows 10, Windows 11 y Windows Server , 2012, 2016, 2019 y 2022 con IPv6 habilitado son vulnerables a este CVE.

Diagrama que muestra el impacto de CVE-2024-38063 en las funciones de red de Windows

Conceptos clave

Pila TCP/IP de Windows

La pila TCP/IP de Windows es un componente fundamental del sistema operativo encargado de la comunicación en red a través del conjunto de protocolos TCP/IP (Protocolo de control de transmisión/Protocolo de Internet). Gestiona todas las interacciones de red, facilitando la comunicación entre dispositivos en redes locales y globales.

Captura de pantalla de la arquitectura de la pila TCP/IP de Windows

IPv6 y los encabezados de extensión

IPv6 se desarrolló para superar las limitaciones de IPv4. Introdujo diversas mejoras, como la modularidad y la flexibilidad mediante encabezados de extensión. Estos encabezados, situados entre el encabezado IPv6 y la carga útil, admiten datos opcionales y funciones avanzadas.

Entre los encabezados de extensión clave de IPv6 se incluyen:

  • Opciones paso a paso (siguiente encabezado = 0) 
  • Encabezado de enrutamiento (siguiente encabezado = 43) 
  • Encabezado de fragmento (Siguiente encabezado = 44) 
  • Encabezado de opciones de destino (Siguiente encabezado = 60) 
  • Encabezado de autenticación (AH) (Siguiente encabezado = 51) 
  • Carga útil de seguridad encapsulada (ESP) (Siguiente encabezado = 50) 

Cada encabezado de extensión apunta al siguiente a través del campo «Next Header», creando así una cadena secuencial. Esta modularidad introduce complejidad en el proceso de gestión de paquetes y abre la puerta a posibles vectores de explotación.

Diagrama que muestra los encabezados de extensión de IPv6 y la estructura de los paquetes
Formato de un datagrama IPv6

Desbordamiento por debajo del rango de los enteros

Se produce un desbordamiento por debajo del rango de un entero cuando un cálculo genera un valor inferior al valor mínimo representable para un tipo de datos. Por ejemplo, al restar un valor mayor de uno menor en un entero sin signo, el resultado puede convertirse en un valor positivo muy grande.

Se produce un desbordamiento de enteros cuando el valor supera el límite máximo del tipo de datos y «se desborda» hasta el valor mínimo representable (por ejemplo, 0 en un intervalo de 0 a 10). Ambos casos se deben a un manejo inadecuado de las condiciones límite en las operaciones aritméticas, lo que da lugar a graves vulnerabilidades en los sistemas de software.

Diagrama que explica el desbordamiento por debajo y por encima del rango de los números enteros en el procesamiento de datos

Análisis de vulnerabilidades

El flujo de trabajo del procesamiento de IPv6

Tras recibir un paquete IPv6, Windows analiza primero la cabecera IPv6. A continuación, la función `IppReceiveHeaderBatch` comprueba el valor del campo «Next Header» para seleccionar el controlador adecuado para las cabeceras siguientes. Para cada cabecera de extensión de la cadena, `IppReceiveHeaderBatch` invoca la rutina correspondiente para procesar esa cabecera específica.

Diagrama que muestra el flujo de trabajo del procesamiento de paquetes IPv6 en Windows

A pesar del diseño flexible y modular de este mecanismo, este presenta un posible vector de ataque. En IPv6, los paquetes fragmentados suelen reensamblarse en su destino, donde existe una vulnerabilidad en el proceso de reensamblaje de fragmentos y en el manejo de las cabeceras.

Un atacante puede provocar un error en la gestión de la memoria y desencadenar un desbordamiento de búfer enviando numerosos paquetes malformados con encabezados de extensión manipulados. Esto permite que el exceso de datos sobrescriba regiones de memoria no previstas, lo que podría dar lugar a la ejecución de código arbitrario. Esta vulnerabilidad se identifica como CVE-2024-38063.

Diagrama que ilustra el riesgo de desbordamiento de búfer debido a paquetes IPv6 mal formados

Falla crítica en la pila TCP/IP de Windows

El parche de Microsoft para solucionar la vulnerabilidad CVE-2024-38063 fue analizado a fondo por el investigador de seguridad Marcus Hutchins. En su blog técnico ofrece información detallada sobre la causa principal de esta vulnerabilidad. Partiendo de sus hallazgos, nuestro compañero ha profundizado en el tema para comprender a fondo el exploit.

Análisis de parches

El parche incluía una actualización del archivo tcpip.sys, que consistía en una modificación dentro de la función Ipv6pProcessOptions. Un cambio de una sola línea sustituyó una llamada a IppSendErrorList() por una llamada a IppSendError(), lo que indica que IppSendErrorList() podría haber contribuido a la vulnerabilidad CVE.

Captura de pantalla del código que muestra el archivo tcpip.sys antes del parche para CVE-2024-38063
Figura 1. Antes del parche
Captura de pantalla del código que muestra tcpip.sys tras la aplicación del parche para CVE-2024-38063
Figura 2. Después de la aplicación del parche

Tamaño de paquete nulo

Un análisis más detallado de la función IppSendErrorList() reveló que esta procesa una lista enlazada de paquetes llamando a la función IppSendError() para cada uno de ellos. La función IppSendError() asigna a los paquetes defectuosos el estado STATUS_DATA_NOT_ACCEPTED. A continuación, crea un mensaje de error ICMP que contiene información sobre el paquete problemático y lo reenvía. Sin embargo, cuando se invoca a IppSendErrorList() con always_send_icmp = true en varios paquetes, establece el campo packet_size en cero para cada paquete.

Captura de pantalla del código que muestra la función `IppSendErrorList` estableciendo el tamaño del paquete en cero

La función `Ipv6pProcessOptions` está diseñada para procesar encabezados de extensión que contienen campos de valores de opción, incluidos tanto los encabezados de opciones «Hop-by-Hop» como los de opciones de destino. Al establecer el tipo de opción en cualquier valor superior a 0x80, un atacante puede provocar un error específico en el procesamiento del encabezado de opciones, lo que obliga a que la opción `always_send_icmp` se establezca en «true» y, en consecuencia, hace que el tamaño del paquete se fije en cero.

Captura de pantalla del código que ilustra la manipulación del campo «Next Header» de IPv6 con fines de explotación

Aunque los paquetes de tamaño cero suelen descartarse, un atacante puede manipular el campo «Next Header» del paquete IPv6 original. Esta manipulación permite a los atacantes controlar cómo se interpreta el paquete en las etapas posteriores del procesamiento, lo que evita su rechazo inmediato y crea una oportunidad para el ataque. 

Diagrama que muestra el control del atacante sobre el procesamiento de paquetes IPv6

Desbordamiento por debajo del rango en el procesamiento de fragmentos

Al establecer el campo «Next Header» en 44, lo que indica un encabezado de fragmento, el paquete pasa a ser gestionado por las rutinas de fragmentación o reensamblaje de IPv6. Cuando el paquete llega al analizador de fragmentos, `Ipv6pReceiveFragment()`, este especifica que: 

  • El tamaño del paquete es cero. 
  • El encabezado del fragmento indica que aún quedan datos por procesar. 

En la función `Ipv6pReceiveFragment()`, el tamaño de asignación para `fragment_size` se calcula restando 0x30 (la longitud de la cabecera del paquete) del tamaño del paquete sin realizar ninguna validación. Si el tamaño del paquete es cero, esta resta da lugar a un desbordamiento por debajo del rango, lo que da como resultado un valor de 16 bits muy grande (alrededor de 0xFFD0 o 65488), lo que hace que el analizador procese una cantidad excesiva de memoria fuera de los límites válidos del paquete y provoque una corrupción de memoria. 

Captura de pantalla del código que muestra un desbordamiento por debajo del rango en el procesamiento de fragmentos IPv6
Figura 3: Desbordamiento por debajo del rango en el procesamiento de fragmentos

Del déficit al exceso y al desajuste en la asignación

La función `Ipv6pReassemblyTimeout()` se encarga de eliminar los fragmentos IPv6 incompletos tras un tiempo determinado, utilizando aritmética de 16 bits para determinar los tamaños de los búferes y las operaciones de copia. Debido al desbordamiento por debajo del rango mínimo en el paso anterior, en el que `packet_length` o `fragment_size` pasan a ser 0xFFD0, se produce un desbordamiento por encima del rango máximo durante la asignación.  

El cálculo resultante provoca que el registro se reinicie a cero, lo que da lugar a la asignación de solo 48 bytes de memoria. Sin embargo, dado que la cantidad de datos copiados (65 488 bytes de «reassembly->payload») no se corresponde con la memoria asignada, se produce un desbordamiento de búfer controlable en el pool del núcleo. 

Captura de pantalla del código que ilustra un desbordamiento de búfer debido a una discrepancia en la asignación de memoria

Esta discrepancia permite a los atacantes ejecutar código malicioso mediante un paquete especialmente diseñado que aprovecha la vulnerabilidad en el procesamiento de IPv6.

CVE-2024-38963: Prueba de concepto 

Con el fin de reproducir la vulnerabilidad CVE-2024-38963, nuestros compañeros crearon una serie de paquetes malformados diseñados para aprovechar la falla. El proceso que siguieron fue el siguiente:

1. Creación de paquetes IPv6 malformados

Inserta un encabezado de extensión de opciones de destino IPv6 (tipo 60) a continuación del encabezado IPv6 básico y, a continuación, incluye una opción no válida (por ejemplo, la opción de tipo 0x81). 

Esta manipulación obliga al núcleo de Windows (tcpip.sys) a establecer always_send_icmp = true, lo que provoca la generación de errores ICMPv6 a través de la rutina IppSendErrorList().

2. Forzar el procesamiento de la lista de búfer de red (NBL)

Al inundar el objetivo con ráfagas rápidas de estos paquetes malformados, aumentaban las posibilidades de que el núcleo agrupara varios paquetes en una sola lista de búfer de red (NBL). Cuando se agrupan dos o más paquetes, se activa el bucle vulnerable IppSendErrorList(), lo que provoca un restablecimiento incorrecto de los metadatos DataLength y Offset en los fragmentos posteriores (el tamaño del paquete pasa a ser cero). 

3. Inyección de paquetes IPv6 fragmentados

Tras la transmisión de paquetes malformados, se envían paquetes IPv6 fragmentados que incluyen encabezados de extensión de fragmento. Estos fragmentos se procesan utilizando los valores de DataLength ya dañados. 

4. Aprovechamiento del tiempo de espera de reensamblaje

El núcleo retiene los fragmentos durante 60 segundos (controlados por `Ipv6pReassemblyTimeout`) para permitir el reensamblaje de los paquetes. Durante este tiempo de espera, los valores corruptos de `DataLength` provocan un desbordamiento por debajo del rango en `Ipv6pReceiveFragment`, lo que da lugar a un tamaño de fragmento calculado incorrectamente (excesivamente grande).

5. Provocar el desbordamiento del búfer del montón

El núcleo asigna un búfer de pila basándose en los valores que han sufrido un desbordamiento por debajo del rango. Durante el proceso de reensamblaje se realizan dos cálculos distintos: uno determina el tamaño de la asignación de memoria (que, debido a un desbordamiento de 16 bits, resulta demasiado pequeño), y el otro calcula la longitud de la copia utilizando el valor grande que ha sufrido el desbordamiento por debajo del rango.

Esta discrepancia provoca una escritura fuera de límites, lo que da lugar a un desbordamiento de búfer en el montón que puede aprovecharse para provocar una denegación de servicio (DoS) o la ejecución remota de código.

Diagrama que describe el exploit de prueba de concepto para CVE-2024-38063

El código fuente utilizado para reproducir esta vulnerabilidad (CVE) con el fin de llevar a cabo un ataque de denegación de servicio:

Cuando un atacante aprovecha esta vulnerabilidad, el sistema de la víctima puede bloquearse de inmediato, lo que provoca una pantalla azul de la muerte: 

Captura de pantalla de la interfaz de usuario que muestra la «pantalla azul de la muerte» de Windows tras el aprovechamiento de la vulnerabilidad CVE-2024-38063

Remediación

Si no actualizas tu sistema operativo con regularidad, tu dispositivo queda expuesto a amenazas de seguridad, incluidas las relacionadas con los CVE (vulnerabilidades y exposiciones comunes). Para mitigar estos riesgos, MetaDefender ofrece una protección sólida al detectar la versión de tu sistema operativo y comprobar si hay vulnerabilidades, incluidos los CVE conocidos, como el CVE-2024-38063. 

MetaDefender Endpoint diseñado para proteger los dispositivos dentro de redes críticas de TI/TO frente a amenazas procedentes de periféricos y soportes extraíbles. Garantiza que el sistema operativo y las aplicaciones instaladas estén actualizados, señala cualquier versión obsoleta o vulnerable y muestra una lista de aplicaciones con vulnerabilidades conocidas y CVE, junto con las soluciones recomendadas. También ayuda a proteger los dispositivos frente a los riesgos de los soportes extraíbles bloqueando el acceso a USB hasta que se hayan analizado y se haya comprobado que están limpias mediante múltiples motores antimalware, al tiempo que aplica la tecnología Deep CDR™ a más de 180 tipos de archivos.  

Póngase en contacto hoy mismo con uno de nuestros expertos para descubrir cómo MetaDefender Endpoint transformar su estrategia de seguridad gracias a una inteligencia líder en el sector. 

¡Mantente al día con OPSWAT!

Regístrate hoy mismo para recibir las últimas novedades de la empresa, historias, información sobre eventos y mucho más.