it-swarm.com.de

Wie ist printf () in C / C ++ eine Sicherheitsanfälligkeit bezüglich Pufferüberlauf?

Laut einem Artikel, den ich gerade gelesen habe, gelten die Funktionen printf und strcpy als Sicherheitslücken aufgrund von Pufferüberläufen. Ich verstehe, wie strcpy anfällig ist, aber könnte jemand möglicherweise erklären, wie/ob printf wirklich anfällig ist, oder ich verstehe es einfach falsch.

Hier ist der Artikel: https://www.digitalbond.com/blog/2012/09/06/100000-vulnerabilities/#more-11658

Das spezifische Snippet lautet:

Der Anbieter hatte den Quellcode mechanisch durchsucht und etwa 50.000 Verwendungen von Pufferüberlauf-fähigen C-Bibliotheksfunktionen wie "strcpy ()" und "printf ()" gefunden.

Vielen Dank!

14
DarkMantis

Es ist möglich, Probleme mit printf() zu haben, indem als Formatzeichenfolge ein vom Benutzer bereitgestelltes Argument verwendet wird, d. H. printf(arg) anstelle von printf("%s", arg). Ich habe es viel zu oft gesehen. Da der Aufrufer keine zusätzlichen Argumente gepusht hat, kann eine Zeichenfolge mit einigen falschen % - Spezifizierern verwendet werden, um alles zu lesen, was sich auf dem Stapel befindet, und mit %n Können einige Werte in den Speicher geschrieben (%n bedeutet: "Das nächste Argument ist ein int *; schreiben Sie dort die Anzahl der bisher ausgegebenen Zeichen).

Ich finde es jedoch plausibler, dass der Artikel, den Sie zitieren, einen einfachen Tippfehler enthält und wirklich sprintf() bedeutet, nicht printf().

(Ich könnte auch argumentieren, dass es außer gets() keine inhärent anfällige C-Funktion gibt; nur Funktionen, die mit Sorgfalt verwendet werden müssen . Die sogenannten "sicheren" Ersetzungen wie snprintf() lösen das Problem nicht wirklich; sie verbergen es, indem sie einen Pufferüberlauf durch eine stille Kürzung ersetzen, die weniger laut, aber nicht unbedingt besser ist.)

18
Tom Leek

Zusätzlich zur Antwort von @Tom möchte ich Sie auch zu den OWASP-Codeüberprüfungsrichtlinien führen, in denen einige Probleme bei der Verwendung von printf () hervorgehoben sind und this antworten zu einer ähnlichen Frage auf der Website cs.stackexchange.

6
Jor-el

Hier ist ein Beispiel, das zeigt, wie dieser Überlauf Ihnen helfen kann. Stellen Sie sich vor, Sie haben keinen Zugriff auf die privaten Mitglieder (z. B. pwd), sodass printf Ihnen hilft, den Inhalt dieser Variablen zu sehen

#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);
    // Pass a string address which is the base address of the login
    // field, but add 8 bytes, which skips onto the pwd field (we know
    // login is 8 bytes)
    return 0;
}

Ausgabe:

Pwd = ijk

3
Gabriel

Einige printf-Anweisungen (dh% n) haben Nebenwirkungen auf Adressen im Stapel, sodass Druckanweisungen gefährlich sein können, selbst wenn die explizite Ausgabe korrekt implementiert ist.

2
ddyer