Entonces, ¿qué causa la condición del desbordamiento de búfer?
Hablando de forma sencilla, el desbordamiento del búfer se produce cada vez que un programa escribe más información en el búfer, que el espacio que se había asignado para la memoria. Y bueno, ¿esto que tendría que ver con la seguridad? El problema para la seguridad se crea cuando este desbordamiento de buffer es provocado intencionalmente por alguien mediante envio de datos que incluyen porciones de código, calculando la cantidad de datos para poder predeterminar cual es el sobrante que se va a sobreescribir y donde. Provocado el desbordamiento, contienen una instrucción que apunta a una posición de memoria distinta, donde se encuentra el codigo ejecutable enviado por el atacante. El programa, inducido a funcionar anormalmente por la perdida de datos causada por el desbordamiento, ejecutará el código enviado por el atacante.
Para el usuario final, este problema es de forma coloquial, inevitable. A menos que dispongamos del código fuente de la aplicación, y que tengamos un alto conocimiento de programación, nada podremos hacer para evitarlo. Bueno, nada no; en realidad lo que sí puede hacer el usuario final es tener todas las aplicaciones (o sistema operativo) actualizadas al día. De esta forma, iremos "parcheando" las vulnerabilidades encontradas por los desarrolladores de software.
Ahora bien, para poder entender los desbordamioentos del búfer, es importante saber en qué partes se divide la memoria.
.text: contiene las instrucciones del programa, es decir, la parte ejecutable. El tamaño de esta sección es fijada en tiempo de ejecución, cuando se carga el proceso.
.data: se utiliza para almacenar variables globales inicializadas (por ejemplo: int enData = 0;). Esta sección también es fija en tiempo de ejecución.
.bss (below stack section): contiene las variables globales no inicializadas, como por ejemplo: int enbss;. El tamaño es fijado en tiempo de ejecución.
heap: esta sección se usa para almacenar variables alocadas dinámicamente y crece desde las direcciones de memoria más bajas hacia las más altas. La alocación se controla mediante las funciones malloc() y free().
stack: esta es la conocida pila. La sección de la pila permite guardar datos entre llamadas a funciones y crece desde las direcciones altas de memoria hacia las direcciones bajas. Esta forma de crecimiento es la que permite buffer overflows.
entorno/argumentos (env): se usa para almacenar una copia de las variables a nivel sistema que pueden ser requeridas por el proceso durante su ejecución. Como ejemplo, alguna de estas variables son el path, nombre del shell, hostname, etc. Esta sección es escribible, permitiendo exploits del tipo format string y buffer overflows.
En la siguiente imagen, podemos ver qué lugar ocupa cada parte en la memoria:

Los desbordamientos de búfer, están presentes siempre que el programa lea datos de alguna fuente y los asigne a un buffer interno, ya sea una entrada de usuario por línea de comandos, por ventana a lo windows (rellenar un formulario web, conectar con una aplicación servidor...), leyendo un archivo, etc.
Este problema es casi tan antiguo como el inicio de la integración de las computadoras a nivel empresarial. De hecho, los primeros ataques de "buffer overflow", se registran en 1988, en el que mediante un gusanto, se atacó a un servicio Unix conocido como "fingerd". Y Si bien uno creería que al ser un problema conocido hace tantos años, actualmente debería ser menos frecuente y menos peligroso; la realidad demuestra totalmente lo contrario. Los buffer overflows están entre nosotros y son tan peligrosos como hace 20 años. Basta buscar un poco en internet para encontrar exploits de este tipo a montones. El desbordamiento, es de las vulnerabilidades más peligrosas, permitiendo a un atacante ejecutar código localmente, remotamente, escalar privilegios, atacar otras máquinas...Cualquier cosa que se le ocurra al atacante.
Conceptos de seguridad I
Conceptos de seguridad II
Conceptos de seguridad III
Conceptos de seguridad IV
Conceptos de seguridad V
Conceptos de seguridad VI |