Buffer Overflow

En este post hablaremos de cómo se produce uno de los ataques informáticos más antiguos: el desbordamiento de buffer.

Un desbordamiento de buffer se produce cuando un programa tiene reservada una cantidad de memoria X para una variable en el espacio de memoria, pero a la hora de asignarle su valor, éste tiene un tamaño mayor que X.

Lo que ocurre en esta situación es que, si el programa no controla bien la cantidad de datos que se copian, lo que no quepa en el espacio reservado se va a escribir en celdas de memoria adyacentes. 

Un usuario maligno podría utilizar esto a su favor para alterar otras variables cuya zona de memoria asignada sea contigua a la que produce el desbordamiento de buffer. Veamos un sencillo ejemplo:

 

El código anterior, escrito en C, recibe por argumento una contraseña, la copia en un buffer, y compara si ese buffer es igual a “lethani”. En caso de serlo, aparece un mensaje de que se han concedido privilegios de root al usuario.

A priori este código parece correcto, pero veamos que pasa si al introducir algunas password...

 

Se han concedido privilegios de root, a pesar de introducir una contraseña errónea. Este fenómeno es el buffer overflow, al introducir más caracteres de los que la variable buffer tenía reservada en memoria, la función strcpy ha continuado escribiendo en la variable logOK, sobreescribiendo el 1 por un 0, y concediendo por tanto privilegios de root.

Este es solo un ejemplo sencillo para demostrar cómo funciona el desbordamiento de buffer. Para evitarlo, simplemente bastaría con utilizar la función strncpy en vez de la función strcpy, puesto que en strncpy tienes que indicar el tamaño que quieres introducir en la variable.

Este tipo de ataque es muy antiguo, se descubrió en 1988 cuando apareció el gusano Morris, pues fue uno de los ataques que utilzó para propagarse. El gusano Morris fue un malware que se replicó en 6000 de los 60.000 servidores que había conectados a la red por aquel entonces, incluyendo el centro de navegación de la NASA. Además de este, otros gusanos muy famosos como el Code Red o el SQL Slammer se han aprovechado del desbordamiento de buffer.

Este ataque va más allá de poder sobreescribir una variable. Teniendo una vulnerabilidad de buffer overflow, es posible asegurarse de que la dirección que se sobreescribe corresponde a una real, e incluir así instrucciones en el buffer para ejecutar código maligno (o incluso ejecutar una shell).

Para asegurarte de que tu código no es vulnerable a buffer overflow, no utilices funciones peligrosas como strcpy o strcmp.

Lethani.

 

Deja una respuesta