¿Cómo es printf () en C / C ++ una vulnerabilidad de desbordamiento del búfer?

13

Según un artículo que acabo de leer, las funciones printf y strcpy se consideran vulnerabilidades de seguridad debido a los desbordamientos de búfer. Entiendo que strcpy es vulnerable, pero podría alguien explicar cómo / si printf es realmente vulnerable, o simplemente lo entiendo mal.

Aquí está el artículo: enlace

El fragmento de código específico es:

  

El proveedor había buscado mecánicamente el código fuente y encontró algunos   50.000 usos impares de funciones de biblioteca C con capacidad de desbordamiento de búfer, como   “Strcpy ()” y “printf ().”

¡Gracias!

    
pregunta DarkMantis 09.10.2013 - 17:53
fuente

4 respuestas

16

Es posible tener problemas con printf() , al usar como cadena de formato un argumento proporcionado por el usuario, es decir, printf(arg) en lugar de printf("%s", arg) . Lo he visto hecho demasiado a menudo. Dado que la persona que llama no incluyó argumentos adicionales, se puede usar una cadena con algunos especificadores espurios % para leer lo que esté en la pila, y con %n algunos valores se pueden escribir en la memoria ( %n significa: "el siguiente argumento es un int * ; escribe el número de caracteres emitidos hasta el momento).

Sin embargo, me parece más plausible que el artículo que cita contenga un simple error tipográfico, y realmente signifique que sprintf() , no printf() .

(También podría argumentar que, aparte de gets() , no hay una función C inherentemente vulnerable; solo se deben utilizar las funciones con care . Los llamados reemplazos "seguros" como snprintf() realmente no resuelve el problema; lo ocultan reemplazando un desbordamiento de búfer con un truncamiento silencioso, que es menos ruidoso pero no necesariamente mejor.)

    
respondido por el Tom Leek 09.10.2013 - 18:54
fuente
5

Además de la respuesta de @Tom, también me gustaría guiarlo hacia el Pautas para la revisión de códigos OWASP , donde se resaltan algunos problemas relacionados con el uso de printf () y esta responde a una pregunta similar en el sitio web cs.stackexchange.

    
respondido por el Jor-el 09.10.2013 - 19:08
fuente
3

Este es un ejemplo que muestra cómo este desbordamiento puede ayudarlo. Imagina que no tienes acceso a los miembros privados (pwd por ejemplo), por lo que printf te ayudará a ver el contenido de esta variable

#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;

struct SecureLogin{
    SecureLogin(const char * login_)
    {
        strcpy(login,login_);
        strcpy(pwd,"ijk");//the user does not see this part of the source code as it is in a DLL
    }
    char login[8];
private:
    char pwd[8];

};


int main() {
    // your code goes here
    SecureLogin log("abc");
    printf("Pwd = %s\n",(&log.login[0])+8);//bcz you know the size of login is 8 bits
    return 0;
}

Salida:

  

Pwd = ijk

    
respondido por el Gabriel 03.12.2014 - 22:18
fuente
2

Algunas directivas de printf (es decir,% n) tienen efectos secundarios a las direcciones que se encuentran en la pila, por lo que las directivas de impresión pueden ser peligrosas, incluso si la salida explícita se implementa correctamente.

    
respondido por el ddyer 09.10.2013 - 19:15
fuente

Lea otras preguntas en las etiquetas