lunes, 27 de septiembre de 1999

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

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
Página web de uno de los descubridores
IP Spoofing Trivial en los Kernel Linux Inferiores a 2.0.36



Jesús Cea Avión
jcea@argo.es
http://www.argo.es/~jcea/