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

IP Spoofing en Linux 2.2.x (x<13)

Última Actualización: 30 de Septiembre de 1.999 - Jueves

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

Un error de implementación en los kernel Linux 2.2.x permite una predicción muy aproximada del número de secuencia inicial de una conexión TCP/IP. Acertando en dicha predicción, es posible injectar información aparentemente procedente de una IP diferente a la del atacante. Si entre la máquina atacada y la IP que se simula existe algún mecanismo de confianza (especialmente, herramientas r* y NFS) el atacante puede comprometer la seguridad de la máquina atacada.

El ataque fue publicado el pasado 26 de Septiembre en la lista de desarrollo del Kernel, y fue seguido por una furiosa actividad para evaluar su alcance y solucionar el problema en el menor plazo posible. El error fue introducido en los kernels 2.2.x; los kernel 2.0.x no son vulnerables.

El problema es doble: por una parte, uno de los secretos utilizados a la hora de calcular el ISN no es ni secreto ni aleatorio, sino una constante conocida: cero. En segundo lugar, se utilizan campos como los números de puerto de la conexión para calcular el ISN, pero no la IP del remitente, debido a otro bug de programación.

El problema está corregido en la versión 2.2.13pre13. Pero gracias a disponer del código fuente, no hace falta esperar a la aparición del kernel 2.2.13 oficial. Cualquiera puede solucionarlo de forma local sin más que aplicar algunos parches.

Para el primer problema, tenemos:

--- linux.vanilla/drivers/char/random.c Thu Dec 31 20:03:49 1998
+++ linux.13p12/drivers/char/random.c   Sun Sep 19 15:00:34 1999
@@ -1698,7 +1698,7 @@
        if (!rekey_time || (tv.tv_sec - rekey_time) > REKEY_INTERVAL) {
                rekey_time = tv.tv_sec;
                /* First three words are overwritten below. */
-               get_random_bytes(&secret+3, sizeof(secret)-12);
+               get_random_bytes(&secret[3], sizeof(secret)-12);
                count = (tv.tv_sec/REKEY_INTERVAL) << HASH_BITS;
        }

Y para el segundo problema, el parche es

--- linux.vanilla/net/ipv4/tcp_ipv4.c   Sat Aug 28 20:00:59 1999
+++ linux.13p13/net/ipv4/tcp_ipv4.c     Sun Sep 26 23:25:18 1999
@@ -525,7 +525,8 @@

 static inline __u32 tcp_v4_init_sequence(struct sock *sk, struct
sk_buff *skb)
 {
-       return secure_tcp_sequence_number(sk->saddr, sk->daddr,
+       return secure_tcp_sequence_number(skb->nh.iph->daddr,
+                                         skb->nh.iph->saddr,
                                          skb->h.th->dest,
                                          skb->h.th->source);
 }

Una vez más se puede ver como el enfoque "Open Source" ha podido localizar y corregir un problema en apenas unas pocas horas.

Más información:

TESO
http://teso.scene.at/

Página web de uno de los descubridores
http://www.cs.uni-potsdam.de/homepages/students/linuxer/

IP Spoofing Trivial en los Kernel Linux Inferiores a 2.0.36
http://www.argo.es/~jcea/artic/hispasec01.htm



Python Zope ©1999 jcea@jcea.es

Más información sobre los OpenBadges

Donación BitCoin: 19niBN42ac2pqDQFx6GJZxry2JQSFvwAfS