Der Pufferüberlauf (Buffer Overflow) ist eine der häufigsten Software-Schwachstellen und betrifft in der Regel Anwendungen mit C oder C++ Programmierung. Der Pufferüberlauf tritt dann auf, wenn das eingehende Datenvolumen die vorgesehene Kapazität des Pufferspeichers sprengt. Dies kann zufällig oder im Zuge eines böswilligen Angriffs geschehen. Hackern mit üblen Absichten bietet ein Pufferüberlauf gute Angriffschancen.
In diesem Artikel werden Pufferüberlauf-Angriffe ausführlich besprochen. Wir befassen uns mit den verschiedenen Formen, in denen sie auftreten, und wie Sie Ihr Unternehmen vor diesen Angriffen schützen können.
Stellen Sie sich einen Pufferspeicher vor, der für die Speicherung von Anmeldedaten vorgesehen ist. Wenn der Puffer 8 Bits für den Benutzernamen und das Kennwort erwartet, aber 11 Bits empfängt, liegt ein Pufferüberlauf vor, da die überschüssigen Daten die Kapazität dieses Puffers überschreiten.
Pufferspeicher sind sequentielle Speichersegmente mit fester Länge, die für eine Zeichenkette oder ein Array aus Ganzzahlen zugewiesen wurden. In diesen Puffern werden Daten vorübergehend gespeichert, während sie von einem Ort zum anderen übertragen werden.
Wenn ein Programm oder ein Prozess versucht, mehr Daten in einen Puffer zu schreiben, als er aufgrund seiner festgelegten Länge aufnehmen kann, müssen die überzähligen Daten anderswo hin und fließen daher in den angrenzenden Speicher. Dort überschreiben oder beschädigen sie die dort abgelegten Daten. Dies kann zu Änderungen im Ausführungsablauf des Programms und damit zu merkwürdigem Programmverhalten, Abstürzen, Fehlern oder fehlerhaften Ergebnissen führen. Ein Pufferüberlauf kann böswillig genutzt werden und eröffnet Hackern die Möglichkeit, beliebigen Code auszuführen oder zu manipulieren, um einen gewünschten Effekt zu erzielen.
Wenn ein Hacker die Eingabe in schlecht geschriebene Teile eines Programms kontrollieren kann, kann er Speichersegmente mit ausführbarem Code überschreiben und durch seinen eigenen ersetzen.
Angriffstechniken variieren je nach Betriebssystem und Programmierarchitektur, das Ziel ist jedoch immer das gleiche: die Manipulation des Speichers, um die Ausführung von Programmen zu steuern.
Pufferüberläufe sind normalerweise stapelbasiert. Der Stapel (Stack) basiert bei der Speicherung von Daten auf einem Last-In, First Out-Prinzip (d. h. das jeweils zuletzt hinzugefügte ist als erstes verfügbar), und sein Platz ist begrenzt. Innerhalb des Stapels befinden sich Daten, die bei Funktionsaufrufen verwendet werden. Dazu zählen Funktionsparameter, lokale Funktionsvariablen und Verwaltungsinformationen.
Ein stapelbasierter Pufferüberlauf erfolgt, wenn ein Angreifer Daten mit bösartigem Code an eine Anwendung sendet, deren Daten in einem Stapel gespeichert werden. Da die Größe des Stapels begrenzt ist, hat der Code nur eine bestimmte Menge an Speicherplatz für Benutzereingaben zur Verfügung. Wenn diese Eingabe länger ist als der Platz, der im Stapel für diesen Zweck vorgesehen ist, kommt es zu einem Überlauf.
Damit hat der Angreifer das erreicht, was er wollte: Indem er Daten gesendet hat, die zu lang sind, um im Puffer des Stapels gespeichert zu werden, konnte sein Schadcode die vorhandenen Daten überschreiben. Dies betrifft auch den Rückgabezeiger (Return Pointer), über den der Angreifer die Kontrolle über die Datenübertragung erhält.
Sie können das Risiko, mit Pufferüberläufen angegriffen zu werden, glücklicherweise gleich auf mehrere Weisen eindämmen.
Ein Pufferüberlauf kann zwar in jeder Programmierumgebung auftreten, die eine direkte Speichermanipulation erlaubt, jedoch sind einige Programmiersprachen resistenter gegen Pufferüberläufe als andere.
Java, JavaScript, C#, Python und PERL verfügen über integrierte Schutzmechanismen gegen Pufferüberläufe. Ihre Struktur verringert die Wahrscheinlichkeit von Kodierungsfehlern, die zu Schwachstellen durch Überläufe führen können.
Abgesehen von der Programmiersprache muss aber auch für Laufzeitschutz für das Betriebssystem gesorgt werden. Die meisten Betriebssysteme sehen die folgenden Laufzeitschutz-Mechanismen vor, die den Erfolg eines Pufferüberlauf-Angriffs erschweren:
Bei der Address Space Layout Randomization (ASLR, Adressverwürfelung) wird die Anordnung der Adressraumpositionen von wichtigen Datenbereichen randomisiert. Die ASLR erschwert Angreifern, eine bestimmte Speicherfunktion zu lokalisieren, um sie anzugreifen.
Der Überschreibschutz für die „strukturierte Ausnahmebehandlung“ (Structured Exception Handling Overwrite Protection, SEHOP) kann Angriffe vereiteln, die strukturierte Ausnahmebehandlungstechniken zum Überschreiben (Structured Exception Handler, SEH) verwenden (bei einem stapelbasierten Pufferüberlauf).
Die Datenausführungsverhinderung kennzeichnet Speicherbereiche als ausführbar oder nicht ausführbar und verhindert so, dass Hacker Anweisungen ausführen, die im Zuge eines Überlaufs in einen Speicherbereich geschrieben wurden.
Es liegt in erste Linie bei den Anwendungen und Verbrauchern, Pufferüberläufe zu verhindern. Wenn in Anwendungen gute Programmierpraktiken verwendet werden und Verbraucher in einem modernen Betriebssystem laufen, kann die Gefahr von Pufferüberläufen entschärft werden.
Starten Sie jetzt
Erfahren Sie, wie Ping Sie dabei unterstützen kann, sichere Mitarbeiter- und Kundenerlebnisse in einer sich schnell entwickelnden digitalen Welt zu schaffen.
Kostenlose Demo anfordern