Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Ein Pufferüberlauf ist eine der häufigsten Sicherheitsrisikenquellen. Ein Pufferüberlauf wird im Wesentlichen dadurch verursacht, dass ungeprüfte externe Eingaben als vertrauenswürdige Daten behandelt werden. Der Akt des Kopierens dieser Daten mithilfe von Vorgängen wie CopyMemory, strcat, strcpy oder wcscpy kann unerwartete Ergebnisse erstellen, die systembeschädigungen ermöglichen. Im besten Fall stürzt Ihre Anwendung mit einem Core-Dump, einem Segmentierungsfehler oder einer Zugriffsverletzung ab. Im schlimmsten Fall kann ein Angreifer den Pufferüberlauf ausnutzen, indem er anderen schädlichen Code in Ihrem Prozess einführt und ausführt. Das ungeprüfte Kopieren von Eingabedaten in einen stackbasierten Puffer ist die häufigste Ursache für ausnutzbare Fehler.
Warnung
Verwenden Sie niemals ungebundene Zeichenfolgenfunktionen (strcpy, strcat, sprintf, gets) in sicherheitsrelevantem Code. Ersetzen Sie sie durch ihre begrenzten Entsprechungen (StringCbCopy, StringCbCat, StringCbPrintf) aus der sicheren Zeichenfolgenbibliothek , oder verwenden Sie die C11-Suffixvarianten _s (strcpy_s, strcat_s).
Pufferüberläufe können auf unterschiedliche Weise auftreten. Die folgende Liste enthält eine kurze Einführung in einige Typen von Pufferüberlaufsituationen und bietet einige Ideen und Ressourcen, die Ihnen helfen, neue Risiken zu vermeiden und vorhandene zu mindern:
-
Statische Pufferüberläufe
-
Ein statischer Pufferüberlauf tritt auf, wenn ein Puffer, der im Stack deklariert wurde, mit mehr Daten beschrieben wird, als ihm zugewiesen wurden. Die weniger sichtbaren Versionen dieses Fehlers treten auf, wenn nicht überprüfte Benutzereingabedaten direkt in eine statische Variable kopiert werden, was zu einer potenziellen Stapelbeschädigung führt.
-
Heap-Überläufe
-
Heap-Überläufe wie statische Pufferüberläufe können zu Speicher- und Stapelbeschädigungen führen. Da Heap-Überläufe im Heap-Speicher und nicht im Stack auftreten, halten manche sie für weniger gefährlich; dennoch erfordern Heap-Überläufe bei der Programmierung echte Sorgfalt und können ebenso Systemrisiken verursachen wie statische Pufferüberläufe.
-
Fehler bei der Array-Indizierung
-
Arrayindizierungsfehler sind auch eine Quelle von Speicherüberläufen. Sorgfältige Grenzprüfung und Indexverwaltung helfen, diese Art von Speicherüberlauffehler zu verhindern.
Das Verhindern von Pufferüberläufen ist in erster Linie das Schreiben guter Code. Überprüfen Sie immer alle Ihre Eingaben und brechen Sie bei Bedarf kontrolliert ab. Weitere Informationen zum Schreiben von sicherem Code finden Sie in den folgenden Ressourcen:
- Maguire, Steve [1993], Writing Solid Code, ISBN 1-55615-551-4, Microsoft Press, Redmond, Washington.
- Howard, Michael und LeBlanc, David [2003], Writing Secure Code, 2d ed., ISBN 0-7356-1722-8, Microsoft Press, Redmond, Washington.
Note
Diese Ressourcen sind in einigen Sprachen und Ländern möglicherweise nicht verfügbar.
Die sichere Handhabung von Zeichenfolgen ist ein seit Langem bestehendes Problemfeld, das weiterhin sowohl durch die Einhaltung guter Programmierpraktiken als auch häufig durch den Einsatz und die Nachrüstung bestehender Systeme mit sicheren Funktionen zur Verarbeitung von Zeichenfolgen angegangen wird. Ein Beispiel für eine solche Reihe von Funktionen für die Windows Shell beginnt mit StringCbCat.
Compiler- und Linker-Entschärfungen
Moderne Versionen des Microsoft C/C++-Compilers und Linker bieten mehrere Schutzebenen vor Pufferüberläufen. Aktivieren Sie diese Schutzmaßnahmen immer in Produktions-Builds:
| Flag | Purpose |
|---|---|
/GS |
Stapelpufferüberlauferkennung (standardmäßig aktiviert). Fügt Sicherheitscookies vor Absenderadressen ein. |
/sdl |
Aktiviert zusätzliche Sicherheitsprüfungen, einschließlich strengerem /GS Verhalten und Variabler Initialisierung. |
/DYNAMICBASE |
Randomisierung des Adressraumlayouts (ASLR). Randomisiert Ladeadressen, um die Ausbeutung zu erschweren. |
/NXCOMPAT |
Datenausführungsverhinderung (Data Execution Prevention, DEP). Markiert Speicherseiten als nicht ausführbare Datei. |
/CETCOMPAT |
Intel Control-flow Enforcement Technology (CET) für hardwaregestützte Shadow Stacks. |
/guard:cf |
Control Flow Guard (CFG) Überprüft indirekte Aufrufziele zur Laufzeit. |
Important
Kompilieren mit /sdl und /GS mindestens für den gesamten neuen Code. Bei sicherheitskritischen Anwendungen aktivieren Sie außerdem /guard:cf und linken Sie mit /CETCOMPAT, wenn Sie Hardware als Ziel verwenden, die CET unterstützt.
Laufzeitanalysetools
Verwenden Sie diese Tools während der Entwicklung und Tests, um Speichersicherheitsprobleme zu erkennen, bevor sie die Produktion erreichen:
-
AddressSanitizer (ASan): Kompilieren Sie mit
/fsanitize=address, um Pufferüberläufe, Use-after-free-Fehler und andere Speicherfehler zur Laufzeit zu erkennen. Verfügbar in Visual Studio 2019 16.9 und höher. - Application Verifier: Erkennt Heap-Beschädigungen, Behandeln von Missbrauch und andere häufige Programmierfehler.
-
Statische Analyse (
/analyze): Die integrierte statische Analyse erkennt Pufferüberläufe, nicht initialisierte Variablen und andere Probleme zur Kompilierungszeit.