ClubEnsayos.com - Ensayos de Calidad, Tareas y Monografias
Buscar

Sistemas de Gestion


Enviado por   •  19 de Julio de 2022  •  Documentos de Investigación  •  4.174 Palabras (17 Páginas)  •  36 Visitas

Página 1 de 17
  1. BUFFER OVERFLOW

Vulnerabilidad en la línea de código file_io_ansi.c:103

[pic 1]

  • Estudio Detallado
  1. Flujo de la Vulnerabilidad

[pic 2]

  1. Análisis de código

[pic 3]

        …… Análisis Propio del Código …….

Resumen:

La función pj_file_read() en file_io_ansi.c podría ser capaz de escribir fuera de los límites de la memoria asignada en la línea 103, lo que podría corromper los datos, provocar el bloqueo del programa o llevar a la ejecución de código malicioso.

Explicación:

El desbordamiento del búfer es probablemente la forma más conocida de vulnerabilidad de seguridad del software. La mayoría de los desarrolladores de software saben lo que es una vulnerabilidad de desbordamiento de búfer, pero los ataques de desbordamiento de búfer contra aplicaciones tanto heredadas como recién desarrolladas siguen siendo bastante comunes. Parte del problema se debe a la gran variedad de formas en que pueden producirse los desbordamientos de búfer, y otra parte se debe a las técnicas propensas a errores que suelen utilizarse para evitarlos.

En un exploit de desbordamiento de búfer clásico, el atacante envía datos a un programa, que almacena en un búfer de pila de tamaño insuficiente. El resultado es que la información de la pila de llamadas se sobrescribe, incluyendo el puntero de retorno de la función. Los datos establecen el valor del puntero de retorno, de modo que cuando la función regresa, transfiere el control a un código malicioso contenido en los datos del atacante.

Aunque este tipo de desbordamiento del búfer de la pila sigue siendo común en algunas plataformas y en algunas comunidades de desarrollo, hay una variedad de otros tipos de desbordamiento del búfer, incluyendo los desbordamientos del búfer de la pila y los errores "off-by-one" entre otros. Hay varios libros excelentes que proporcionan información detallada sobre cómo funcionan los ataques de desbordamiento de búfer, incluyendo Building Secure Software [1], Writing Secure Code [2], y The Shellcoder's Handbook [3].

A nivel de código, las vulnerabilidades de desbordamiento de búfer suelen implicar la violación de las suposiciones de un programador. Muchas funciones de manipulación de memoria en C y C++ no realizan una comprobación de límites y pueden sobrescribir fácilmente los límites asignados de los buffers sobre los que operan. Incluso las funciones con límites, como strncpy(), pueden causar vulnerabilidades cuando se usan incorrectamente. La combinación de la manipulación de la memoria y las suposiciones erróneas sobre el tamaño o la composición de una pieza de datos es la causa principal de la mayoría de los desbordamientos de búfer.

Las vulnerabilidades de desbordamiento de búfer suelen producirse en código que:

- Depende de datos externos para controlar su comportamiento.

- Depende de propiedades de los datos que se aplican fuera del ámbito inmediato del código.

- Es tan complejo que un programador no puede predecir con exactitud su comportamiento.

En este caso nos preocupa principalmente el segundo caso, porque no podemos verificar la seguridad de la operación realizada por fread() en file_io_ansi.c en la línea 103.

Los siguientes ejemplos demuestran los tres escenarios.

Ejemplo 1: Este es un ejemplo del segundo escenario en el que el código depende de propiedades de los datos que no se verifican localmente. En este ejemplo, una función llamada lccopy() toma una cadena como argumento y devuelve una copia de la cadena asignada a la pila con todas las letras mayúsculas convertidas a minúsculas. La función no realiza ninguna comprobación de límites en su entrada porque espera que str sea siempre menor que BUFSIZE. Si un atacante se salta las comprobaciones en el código que llama a lccopy(), o si un cambio en ese código hace que la suposición sobre el tamaño de str no sea cierta, entonces lccopy() desbordará buf con la llamada no limitada a strcpy().

char *lccopy(const char *str) {

        char buf[BUFSIZE];

        char *p;

        strcpy(buf, str);

        for (p = buf; *p; p++) {

                if (isupper(*p)) {

                        *p = tolower(*p);

                }

        }

        return strdup(buf);

}

Ejemplo 2.a: El siguiente código de ejemplo demuestra un simple desbordamiento de búfer que suele ser causado por el primer escenario en el que el código depende de datos externos para controlar su comportamiento. El código utiliza la función gets() para leer una cantidad arbitraria de datos en un buffer de la pila. Debido a que no hay manera de limitar la cantidad de datos leídos por esta función, la seguridad del código depende de que el usuario siempre introduzca menos caracteres que BUFSIZE.

...

        char buf[BUFSIZE];

        gets(buf);

...

Ejemplo 2.b: Este ejemplo muestra lo fácil que es imitar el comportamiento inseguro de la función gets() en C++ utilizando el operador >> para leer la entrada en una cadena char[].

        ...

        char buf[BUFSIZE];

        cin >> (buf);

        ...

Ejemplo 3: El código de este ejemplo también se basa en la entrada del usuario para controlar su comportamiento, pero añade un nivel de indirección con el uso de la función de copia de memoria acotada memcpy(). Esta función acepta un búfer de destino, un búfer de origen y el número de bytes a copiar. El búfer de entrada se llena mediante una llamada acotada a read(), pero el usuario especifica el número de bytes que memcpy() copia.

...

Descargar como (para miembros actualizados)  txt (26.6 Kb)   pdf (248 Kb)   docx (314.8 Kb)  
Leer 16 páginas más »
Disponible sólo en Clubensayos.com