Un grupo de investigadores ha descubierto la existencia de un importante problema de seguridad, que afecta a un gran número de controladores de dispositivos Ethernet.
El estándar IEEE define que los paquetes transmitidos en una red Ethernet deben tener un tamaño mínimo de 46 bytes y un máximo de 1500 bytes. Cuando se utilizan algunos protocolos de comunicaciones, como es el caso del protocolo IP, que requieren un tamaño inferior al mínimo establecido, es necesario completar el espacio libre con valores nulos (véase, por ejemplo, el RFC 894).
Se ha descubierto que muchos controladores de dispositivo Ethernet no realizan esta operación sino que, en su lugar, cuando deben enviar un paquete con un tamaño inferior al mínimo establecido por el estándar, se reutilizan los bytes contenidos en paquetes anteriores.
El siguiente fragmento de código C muestra la vulnerabilidad:
01 void xmit_frame(char *frame_buf, int frame_len)
02 {
03 int length;
04
05
06 if (frame_len < MIN_FRAME_SZ)
07 length = MIN_FRAME_SZ;
08 else
09 length = frame_len;
10
11 copy_to_tx_buf(frame_buf, length);
12
13 return;
14 }
La función xmit_frame() tiene dos parámetros, el primero de ellos es una variable que contiene el búfer a transmitir por la red, mientras que el segundo parámetro es la longitud del macro contenido en el búfer. La función verifica que el marco se ajusta a la longitud mínima establecido por el estándar (línea 06). En caso de que sea inferior, inicializa la variable length al valor mínimo (línea 07); si es superior, asigna el valor del parámetro (línea 09).
Esta longitud se utiliza para copiar el marco y transmitirlo a la red (línea 11). Es en este punto donde se produce la vulnerabilidad de seguridad. Si el marco a transmitir es inferior al valor mínimo, el espacio que hay entre frame_len y length contendrá bytes procedentes del contenido de un paquete anterior. Este vestigio de información es la información que se divulgará.
Esto, que a simple vista puede parecer de poca importancia, puede convertirse en un problema de seguridad muy serio en determinados entornos. Si se utiliza un controlador de dispositivo Ethernet que no realiza el rellenado con valores nulos de los bytes libre en los paquetes, éstos pueden incluir información sensible procedente de otros paquetes.
Utilizando el ejemplo de código anterior, debería efectuarse la siguiente modificación para eliminar la vulnerabilidad:
…
06 if (frame_len < MIN_FRAME_SZ) {
07 length = MIN_FRAME_SZ;
08 memset(frame_buf + frame_len, 0, length – frame_len);
09 } else
…
Esta vulnerabilidad está presente en un gran número de controladores de dispositivo Ethernet, en diversos sistemas operativos incluyendo, pero no limitado, a Linux, *BSD y Windows.
xavi@hispasec.com
Deja una respuesta