Ein Pufferüberlauf (Buffer Overflow) ist ein Speicherfehler, bei dem ein Programm mehr Daten in einen Puffer schreibt, als dieser aufnehmen kann, und dabei benachbarten Speicher überschreibt.
Wie ein Pufferüberlauf entsteht
Programme in C und C++ reservieren Puffer fester Größe für Strings, Netzwerkpakete und andere Daten. Kopiert der Code Eingaben ohne Längenprüfung – etwa mit strcpy oder sprintf –, laufen die überzähligen Bytes in den Nachbarspeicher über. Bei einem Stack-Überlauf lässt sich die Rücksprungadresse einer Funktion überschreiben, bei einem Heap-Überlauf werden andere Objekte und Verwaltungsdaten des Allocators beschädigt.
Ein Angreifer, der die überlaufenden Daten kontrolliert, kann die Ausführung auf eigenen Code umleiten oder vorhandene Codefragmente verketten (Return-Oriented Programming). Ergebnis ist oft Remote Code Execution oder eine Rechteausweitung, im besten Fall nur ein Absturz.
Warum Pufferüberläufe wichtig sind
Pufferüberläufe gehören zu den ältesten und am häufigsten ausgenutzten Sicherheitslücken. Der Morris-Wurm nutzte 1988 einen davon, Code Red (2001) und SQL Slammer (2003) verbreiteten sich weltweit über Überläufe in Microsoft-Servern. Out-of-Bounds Write (CWE-787) steht bis heute weit oben in den CWE Top 25 der gefährlichsten Softwareschwächen. Laut Microsoft und Google machen Speicherfehler zusammen mit Use-After-Free den Großteil kritischer Lücken in großen C/C++-Codebasen aus.
Wie man Pufferüberläufe verhindert
- Neuen Code in speichersicheren Sprachen wie Rust, Go, Java oder C# schreiben, wie CISA und NSA empfehlen.
- In C/C++ Funktionen mit Grenzprüfung und moderne Container nutzen, mit Fuzzern und AddressSanitizer testen.
- Compiler- und Betriebssystemschutz aktiv lassen: Stack Canaries, DEP/NX, ASLR und Control-Flow Integrity.
- Zügig patchen – öffentliche Exploits für Überläufe erscheinen schnell.