Member of The Internet Defense League Últimos cambios
Últimos Cambios
Blog personal: El hilo del laberinto Geocaching

Ataque DoS a los kernel Linux 2.0.x

Última Actualización: 21 de Enero de 2.000 - Viernes

Artículo publicado en el boletín Una-Al-Día de Hispasec, el 22 de Diciembre de 1.999.

Los kernel 2.0.x (recordemos que la versión actual es 2.2.x) son susceptibles de un ataque DoS (Denial of Service - denegación de servicio) cuando se envían paquetes IP de gran tamaño y estos incluyen opciones IP.

El problema es debido a que el kernel comprueba que el tamaño de los datos más la cabecera IP no supera los 65535 bytes, pero no comprueba que ese tamaño *más* el tamaño de las opciones IP no supere tampoco dicho valor. Un paquete IP, normalmente, no incluye opciones IP, pero un atacante malicioso sí puede hacerlo.

Los kernel 2.0.x imprimen varios mensajes de error y acaban realizando un reinicio de la máquina o "reboot". Los nuevos kernels 2.2.x imprimen errores "message too long" en la consola, como aviso, y no se ven afectados por el ataque. El ataque tampoco parece afectar a Windows ni a Solaris.

Gracias al hecho de que Linux es un producto con código abierto y cualquiera puede estudiar su funcionamiento y corregir cualquier problema, uno de los desarrolladores del Kernel publicó un parche oficial a las pocas horas de hacerse público el ataque. El parche debe aplicarse a la versión 2.0.38, que es la última versión de la serie 2.0.x:

>>>>>
diff -urN 2.0.38/net/ipv4/ip_output.c 2.0.38-ping-R/net/ipv4/ip_output.c
--- 2.0.38/net/ipv4/ip_output.c Thu Jun 18 23:48:22 1998
+++ 2.0.38-ping-R/net/ipv4/ip_output.c  Tue Dec 14 23:02:43 1999
@@ -703,7 +703,13 @@

        if (!sk->ip_hdrincl) {
                length += sizeof(struct iphdr);
-               if(opt) length += opt->optlen;
+               if(opt)
+               {
+                       /* make sure to not exceed the max packet size */
+                       if (0xffff-length < opt->optlen)
+                               return -EMSGSIZE;
+                       length += opt->optlen;
+               }
        }

        if(length <= dev->mtu && !MULTICAST(daddr) && daddr!=0xFFFFFFFF && daddr!=dev->pa_brdaddr)

<<<<<

En principio parece poco probable que se publique una versión 2.0.39 del kernel para incluir este parche, ya que la versión actual del kernel es la 2.2.x, y la serie 2.3.x está alcanzando ya el estado de "code freeze", lo que significa que 2.4.x aparecerá dentro de muy poco.

Por lo tanto, todos los usuarios de viejos kernel 2.0.x deberían actualizar a 2.0.38 (si se empeñan en seguir usando kernel 2.0.x) y aplicar éste y otros parches similares ellos mismos, sin esperar a que se distribuya una hipotética y poco probable 2.0.39. De todas formas la lista de correo de desarrollo del kernel linux todavía está discutiendo el tema.

Más información:

ftp://ftp.us.kernel.org/pub/linux/kernel/people/andrea/patches/v2.0/2.0.38/ip-opt-1.gz



Python Zope ©2000 jcea@jcea.es

Más información sobre los OpenBadges

Donación BitCoin: 19niBN42ac2pqDQFx6GJZxry2JQSFvwAfS