
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.

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.

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.

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.

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.

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.

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.


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.

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.

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.

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.

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.

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.

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:

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.

