CWE ID: 121
Name: Stack-based Buffer Overflow
Ein stack-basierter Buffer Overflow liegt vor, wenn der Puffer, der überschrieben wird, im Stack allokiert ist – das heißt, er eine lokale Variable oder, seltener, ein Parameter einer Funktion darstellt.
Effektivität: Unknown
Beschreibung: Nutzen Sie eine Abstraktionsbibliothek, um riskante APIs zu abstrahieren. Dies ist keine vollständige Lösung.
Effektivität: Unknown
Beschreibung: Implementieren und führen Sie bounds checking auf der Eingabe durch.
Effektivität: Unknown
Beschreibung: Vermeiden Sie die Verwendung gefährlicher Funktionen wie gets
. Nutzen Sie stattdessen sicherere, äquivalente Funktionen, die boundary errors prüfen.
Auf dem Ausführungs-stack befinden sich typischerweise mehrere daten, die sicherheitskritisch sind und zu willkürlicher Codeausführung führen können. Am prominentesten ist die gespeicherte Rückgabeadresse, die die Speicheradresse angibt, zu der die Ausführung fortgesetzt werden soll, sobald die aktuelle Funktion beendet ist. Ein Angreifer kann diesen Wert mit einer beliebigen Speicheradresse überschreiben, auf die der Angreifer Schreibzugriff hat, in die er willkürlichen Code platziert, der mit den vollen Berechtigungen des anfälligen Programms ausgeführt werden soll. Alternativ kann der Angreifer die Adresse eines wichtigen call angeben, beispielsweise den POSIX system()
call, und die Argumente für diesen call auf dem stack belassen. Dies wird oft als “Return into libc”-exploit bezeichnet, da der Angreifer das Programm typischerweise zur Rücksprungzeit in eine interessante Routine in der C-Standardbibliothek (libc) zwingt. Andere wichtige Daten, die häufig auf dem stack vorhanden sind, sind der stack pointer und der frame pointer, zwei Werte, die Offsets zur Berechnung von Speicheradressen angeben. Die Veränderung dieser Werte kann oft zu einer “write-what-where”-Bedingung ausgenutzt werden.