Вы находитесь на странице: 1из 3

ENSAYO BÚFFER OVERFLOW

Paola Andrea Barco Forero


Especialización de seguridad en redes 148532,SENA
Girardot, Colombia
panbarco@misena.edu.co

Resumen— El enmarcar o profundizar un término técnico a  Otro segmento de datos donde se almacenan las
algún proceso se nos es muy importante, he aquí un documento variables globales.
tomado desde un punto de vista no tan técnico y dedicado a  Un último segmento denominado pila (o stack)
hacer su comprensión lo más claro posible, el Búffer Overflow donde se almacenan valores temporales.
O desbordamiento de memoria.

I. INTRODUCCIÓN
Este documento es una guía para el lector acerca de la técnica
de ataque búffer overflow, y conozca más detalladamente
dicho término, para que de forma concisa entienda y
reconozca ésta si ha llegado a ser víctima de ello o si en el
futuro llegara a serlo; y que permita al lector prepararse
para una defensa más eficaz al momento de presentarse tal
amenaza.
II. ¿QUÉ ES EL BÚFFER OVERFLOW?
Se produce cuando la entrada de un sistema es mayor que el
área de memoria asignada para contenerla (búffer) y el
sistema no lo comprueba adecuadamente.
A. Algunos antecedentes de ataques basados en Buffer
overflow
En los registros de la historia encontramos muchas anécdotas
acerca de éstos ataques, sin embargo podemos asegurar que el
auge por el interés en la seguridad informática se da desde los
80’s más exactamente a finales, encontramos que por causa
de una película se tomó gran referencia para desarrollar el
mito de la figura del hacker al igual que toda la cultura del
bajo mundo que le rodea. Ahora bien, un ataque basado en
desbordamiento de buffer, se centra en el primero conocido
en la historia cuando el universitario Robert T. Morris
desarrolló el primer gusano o worm en auto-propagarse por
internet utilizando un fallo de buffer overflows en el daemon
fingered que poseían todos los UNIX de la época. Miles de
ordenadores conectados a internet fueron infectados
quedando totalmente inutilizados; desde este punto de la El segmento que nos interesa es la pila, ésta pila es una
historia empieza a tomarse enserio el tema de seguridad en estructura que posee un comportamiento FIFO (FIRST IN
redes, puesto que al hallarse errores en algo siempre existirá FIRST OUT, es decir, que cuando insertemos algún elemento
alguien queriendo aprovecharse; por lo tanto nuestra misión se colocará en su cima y cuando queramos realizar alguna
es sellar o eliminar cualquier grieta que pueda ser explotada extracción, se hará también desde la cima ); los programas o
en nuestra contra. aplicaciones utilizarán dicha estructura para almacenar
De acuerdo con lo anterior podemos resumir que las variables locales y argumentos de funciones. Lo cual nos
vulnerabilidades en buffer overflows se basan en el uso indica que el crecimiento en la pila es decreciente, las
incorrecto de ciertas funciones por parte del programador, así direcciones de memoria más alta estarán en la parte inferior,
que para poder explotar éstas necesitamos unos sin embargo las dos direcciones que nuestro programa son:
conocimientos mínimos de cómo opera el sistema a la hora de  La dirección de la cima de la pila, la cual es
ejecutar nuestro código. necesaria para saber dónde colocar el próximo
B. Conocimientos básicos elemento, ésta dirección se almacena en el registro
El sistema operativo administra y desigana a cada programa %esp.
una parte o fragmento de la memoria de la siguiente manera:  La dirección del inicio de la zona que contiene las
 Un segmento de código donde estará almacenado el variables de la función que estamos ejecutando
código de nuestro programa.
actualmente, la cual se denomina puntero de marco “retorno” de nuestra imagen 2; ya sabiendo esto puedo
de pila y se almacena en el registro %ebp. resumir que:
Los desbordamientos de buffer consisten en introducir código
III. COMPORTAMIENTO DE LA PILA máquina en el espacio reservado para las” variables locales” y
Para poder observar el comportamiento de la pila se realizará después modificar la dirección de retorno para que apunte a la
el siguiente ejercicio con un programa sencillo: posición de memoria donde hemos introducido nuestro
Void fn(int argl, int arg2) { código máquina. En éstos casos el código se conoce como
Int x; Shell code, es decir, son las instrucciones necesarias para que
Int y; el procesador despliegue un intérprete de comandos, como
por ejemplo el bash, o el sh. Entonces, encontramos que
X=3;
teniendo en cuenta lo anterior podemos afirmar que en la
Y=4; mayoría de las veces se aprovecha la función strcpy en el
Printf(“Estamos dentro de la función \ n”); código lo que hace que se copie la cadena de comando de
} destino a la de origen pero que en ningún momento el tamaño
Void main(int argc, char**argv) { del buffer origen, produciéndonos una acción cíclica en un
int a; número de veces necesario para sobre escribir la dirección
int b; antigua de retorno y colocar en su lugar el string origen de
a=1; nuestro código máquina con la nueva dirección de retorno,
b=2; haciendo que al final la pila recupere la dirección de retorno
fn(a,b); (la nueva) y nuestro programa se posicionará en el sector de
} memoria que nosotros le hemos indicado y en la que está
Antes de llamar a la función fn nuestra pila contendría tan nuestro código, o sea que hemos inyectado código máquina a
solo las variables locales int a, int b correspondientes a la la posición reservada para las variables locales, reduciendo la
función main() capacidad de memoria en este proceso, lo cual conlleva a una
amenaza latente de seguir repitiéndose.

De esta manera hemos comprendido la manera en que


trabajan los buffer overflows y cómo se realizan.
Sin embargo es necesario saber cómo puedo protegerme.

IV. SOLUCINES ACTUALES

DEP (Data Execution Prevention) Bit NX (Non Execute)


Para activar DEP por hardware es necesario que el
microprocesador que estemos utilizando venga con esta
característica, ya que éste es un avance tecnológico de la
industria de microprocesadores que es aprovechada por los
sistemas operativos. El objetivo es evitar que un programa
pueda ser inyectado en un sistema por medio de un
desbordamiento de buffer. Para ello se dividen, en tiempo de
ejecución, las páginas de la memoria en dos clases: Paginas
de ejecución en las que se cargarán los procesos o páginas de
NO ejecución donde se van a almacenar datos y/o parámetros
de llamada a procedimientos. Para realizar esto las páginas de
memoria llevan asociadas un NX (Non eXecute) que indica si
se puede ejecutar lo que esté allí o sí por el contrario, nada
Imagen tomada de: que esté almacenado en esa zona de memoria puede ser
http://www.bulma.net/body.phtml?nIdNoticia=660 ejecutado. El realizar esta división y marcado de las páginas
permite, que, aunque se produzca un desbordamiento de
Según la imagen el puntero de marco nos apunta al inicio de buffer, este nunca podrá ser utilizado para inyectar un código
la zona (parte inferior de la imagen 2). Con nuestro programa a través de un parámetro, con lo cual estamos garantizando
hacemos que las funciones, a medida que las va “llamando” que el sistema no ejecuta nada que no esté ya introducido
el procesador van quedando registradas en la pila, de modo previamente.
que quede grabado en el sector de “parámetro” en nuestra Aplicar DEP por hardware previene que se pueda introducir
imagen 2 y en ese proceso hay un final en el programa que le código inyectado, si el contador de programa se quedara
indica a donde regresar o a qué posición dirigirse cuando apuntando a una zona de memoria marcada como NX el
acabe la función llamada, ésta se registra en el sector de sistema intentaría recuperarse y si no pudiera se produciría
una parada. Debido a esto, es posible que ciertas aplicaciones,
que utilicen la inyección de código como forma normal de
trabajar dejen de funcionar correctamente No es una práctica
correcta de desarrollo pero en algunos casos se utiliza. Para
intentar garantizar la compatibilidad de aplicaciones de este
tipo se pueden crear listas blancas en Windows Vista.

IV. VULNERABILIDADES
Si se pasa al programa una cadena de caracteres demasiado
grande podemos alterar la dirección del retorno a la función.
Obviamente éstos fallos no se harían voluntariamente por el
administrador del sistema atacado, mientras que un usuario si
lo haría para concederse privilegios de root o abrir una Shell
en uno de los puertos en pocas palabras dejar el equipo a su
merced.

IV.CONCLUSIONES
Al saber qué es el búffer overflow encontramos que debemos
saber unos conocimientos básicosque consisten en saber el
comportamiento de la pila, la cual nos enseña gráficamente el
proceso y la división jerárquica que se realiza en una
memoria, luego de esto podemos encontrar unas solucines
actuales que consiste en el DEP (data execution prevention)
bit nx (non execute) o la no ejecución de datos, con el cual
podemos sellar nuestras posibles Vulnerabilidades en este
tema del buffer overflow.

REFERENCIAS
[1] http://gsyc.es/~anavarro/papers/bufferoverflow.pdf
[2] http://www.bulma.net/body.phtml?nIdNoticia=660
[3] http://geeks.ms/blogs/vista-tecnica/archive/2007/02/06/la-protecci-n-
contra-desbordamientos-de-buffer-en-windows-vista-iii-de-iv.aspx

Вам также может понравиться