Vulnerabilidad y prevención de string de formato con ejemplo

Una string de formato es una string ASCII que contiene texto y parámetros de formato.

Ejemplo:

// A statement with format string
printf("my name is : %s\n", "Akash");

// Output
// My name is : Akash

Hay varias strings de formato que especifican la salida en C y muchos otros lenguajes de programación, pero nuestro enfoque está en C.

Las vulnerabilidades de string de formato son una clase de error que se aprovecha de un error del programador fácilmente evitable. Si el programador pasa un búfer controlado por el atacante como argumento a un printf (o cualquiera de las funciones relacionadas, incluidas sprintf, fprintf, etc.), el atacante puede realizar escrituras en direcciones de memoria arbitrarias. El siguiente programa contiene tal error:

// A simple C program with format
// string vulnerability
#include<stdio.h>
  
int main(int argc, char** argv)
{
    char buffer[100];
    strncpy(buffer, argv[1], 100);
  
    // We are passing command line
    // argument to printf
    printf(buffer);
  
    return 0;
}

Dado que printf tiene un número variable de argumentos, debe usar la string de formato para determinar el número de argumentos. En el caso anterior, el atacante puede pasar la string «%p %p %p %p %p %p %p %p %p %p %p %p %p %p %p» y engañar al printf para que lo piense. tiene 15 argumentos. Ingenuamente imprimirá las próximas 15 direcciones en la pila, pensando que son sus argumentos:

$ ./a.out "%p %p %p %p %p %p %p %p %p %p %p %p %p %p %p"
0xffffdddd 0x64 0xf7ec1289 0xffffdbdf 0xffffdbde (nil) 0xffffdcc4 0xffffdc64 (nil) 0x25207025 0x70252070 0x20702520 0x25207025 0x70252070 0x20702520

Aproximadamente a 10 argumentos de la pila, podemos ver un patrón repetitivo de 0x252070: ¡esos son nuestros %ps en la pila! Empezamos nuestra string con AAAA para ver esto más explícitamente:

$ ./a.out "AAAA%p %p %p %p %p %p %p %p %p %p"
AAAA0xffffdde8 0x64 0xf7ec1289 0xffffdbef 0xffffdbee (nil) 0xffffdcd4 0xffffdc74 (nil) 0x41414141

El 0x41414141 es la representación hexadecimal de AAAA. Ahora tenemos una forma de pasar un valor arbitrario (en este caso, estamos pasando 0x41414141) como argumento para printf. En este punto, aprovecharemos otra función de string de formato: en un especificador de formato, también podemos seleccionar un argumento específico. Por ejemplo, printf(“%2$x”, 1, 2, 3) imprimirá 2. En general, podemos hacer printf(“%$x”) para seleccionar un argumento arbitrario para printf. En nuestro caso, vemos que 0x41414141 es el décimo argumento de printf, por lo que podemos simplificar nuestra string1:

$ ./a.out 'AAAA%10$p'
AAAA0x41414141

Prevención de vulnerabilidades de string de formato

  • Siempre especifique una string de formato como parte del programa, no como entrada. La mayoría de las vulnerabilidades de strings de formato se resuelven especificando «%s» como string de formato y no usando la string de datos como string de formato.
  • Si es posible, haga que la string de formato sea una constante. Extraiga todas las partes variables como otros argumentos para la llamada. Difícil de hacer con algunas bibliotecas de internacionalización
  • Si las dos prácticas anteriores no son posibles, use defensas como Format_Guard . Raro en tiempo de diseño. Tal vez una forma de seguir usando una aplicación heredada y mantener bajos los costos. Aumente la confianza en que una aplicación de terceros será segura

Referencias
https://www.owasp.org/index.php/Format_string_attack
https://www.exploit-db.com/docs/28476.pdf

Este artículo es una contribución de Akash Sharan . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo usando contribuya.geeksforgeeks.org o envíe su artículo por correo a contribuya@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.

Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *