miércoles, 22 de diciembre de 1999

Ataque DoS a los kernel Linux 2.0.x

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/[..]/patches/v2.0/2.0.38/ip-opt-1.gz



Jesús Cea Avión
jcea@hispasec.com