Was ist ein Pufferüberlauf?

Ein Pufferüberlauf tritt auf, wenn ein Programm, das Daten in einen Puffer schreibt, dabei die Kapazität dieses Puffers überschreitet. Es ist, als würde man einen halben Liter Milch in ein Glas für 0,4 Liter gießen.

Share facebook icon linkedin icon twitter icon email icon

Pufferüberlauf

Lernziele

Nach Lektüre dieses Artikels können Sie Folgendes:

  • Puffer definieren
  • Pufferüberlauf und wie er bei einem Cyberangriff genutzt werden kann, erklären
  • Verstehen, wer am gefährdetsten ist und wie man sich vor Pufferüberlaufangriffen schützen kann

Was ist ein Pufferüberlauf?

Pufferüberläufe sind eine Anomalie, die auftritt, wenn Software, die Daten in einen Puffer schreibt und dabei die Kapazität des Puffers überschreitet. Das führt dazu, dass benachbarte Speicherstellen überschrieben werden. Mit anderen Worten: Zu viele Informationen werden an einen Container übergeben, der nicht über ausreichend Speicherplatz verfügt, und diese Informationen nehmen letztendlich den Platz von Daten in benachbarten Containern ein.

Pufferüberläufe können von Angreifern ausgenutzt werden, um den Speicher eines Computers zu modifizieren und die Programmausführung zu untergraben oder die Kontrolle zu übernehmen.

Buffer Overflow

Was ist ein Puffer?

Ein Puffer oder Datenpuffer ist ein Bereich des physischen Speichers, in dem Daten vorübergehend gespeichert werden, während sie von einem Ort an einen anderen verschoben werden. Diese Puffer befinden sich normalerweise im RAM-Speicher. Computer verwenden häufig Puffer, um die Performance zu verbessern. Die meisten modernen Festplatten nutzen die Pufferung, um effizient auf Daten zuzugreifen Viele Online-Dienste verwenden ebenfalls Puffer. Beispielsweise werden beim Online-Video-Streaming häufig Puffer eingesetzt, um Unterbrechungen zu verhindern. Wenn ein Video gestreamt wird, lädt der Videoplayer jeweils ungefähr 20 % des Videos herunter und speichert es in einem Puffer. Anschließend wird es aus diesem Puffer gestreamt. Auf diese Weise wirken sich geringfügige Schwankungen der Verbindungsgeschwindigkeit oder kurze Unterbrechungen des Dienstes nicht auf die Performance des Videostreams aus.

Puffer enthalten definierte Datenmengen. Sofern das Programm, das den Puffer verwendet, keine integrierten Anweisungen zum Verwerfen von Daten enthält, überschreibt es Daten im Speicher neben dem Puffer, wenn zu viel an den Puffer gesendet wird.

Pufferüberläufe können von Angreifern ausgenutzt werden, um Software zu beschädigen. Trotz des guten Verständnisses sind Pufferüberlaufangriffe immer noch ein großes Sicherheitsproblem, das Cyber-Sicherheitsteams zusetzt. Im Jahr 2014 waren Hunderte Millionen Benutzer wegen einer Sicherheitslücke der SSL-Software einer als „Heartbleed“ bekannten Bedrohung durch Angriffe mit Pufferüberlauf ausgesetzt.

Wie nutzen Angreifer Pufferüberläufe aus?

Angreifer können absichtlich eine sorgfältig gestaltete Eingabe in ein Programm einspeisen, durch die das Programm versucht, diese Eingabe in einem Puffer zu speichern, der nicht groß genug ist, und dann Teile des mit dem Pufferbereich verbundenen Speichers überschreibt. Wenn das Speicherlayout des Programms genau definiert ist, können die Angreifer absichtlich Bereiche überschreiben, von denen bekannt ist, dass sie ausführbaren Code enthalten. Die Angreifer können diesen Code dann durch ihren eigenen ausführbaren Code ersetzen, was die Funktionsweise des Programms erheblich verändern kann.

Wenn der überschriebene Teil im Speicher beispielsweise einen Pointer enthält (ein Objekt, das auf eine andere Stelle im Speicher verweist), kann der Code der Angreifer diesen Code durch einen anderen Pointer ersetzen, der auf eine Exploit-Nutzlast verweist. Das kann die Kontrolle über das gesamte Programm auf den Code des Angreifers übertragen.

Wer ist durch Pufferüberlaufangriffe gefährdet?

Einige Programmiersprachen sind anfälliger für Pufferüberläufe als andere. C und C++ sind zwei beliebte, aber angreifbare Sprachen, da sie keinen integrierten Schutz gegen den Zugriff auf oder das Überschreiben von Daten in ihrem Speicher enthalten. Windows, Mac OSX und Linux enthalten Code, der in einer oder beiden Sprachen geschrieben ist.

Moderne Sprachen wie Java, PERL und C# verfügen über integrierte Features, die das Risiko eines Pufferüberlaufs verringern, aber nicht vollständig beseitigen können.

Wie sich vor Pufferüberlaufangriffen schützen

Glücklicherweise verfügen moderne Betriebssysteme über Laufzeitschutz, der hilft, Pufferüberlaufangriffe abzuschwächen. Lassen Sie uns zwei gängige Schutzmaßnahmen untersuchen, die dazu beitragen, das Risiko des Missbrauchs zu verringern:

  • Randomisierung des Adressraums. Ordnet die Position des Adressraums für Bereiche mit Schlüsseldaten eines Prozesses zufällig neu an. Pufferüberlaufangriffe setzen im Allgemeinen die Kenntnis des genauen Speicherorts von wichtigem ausführbaren Code voraus. Die Randomisierung der Adressräume macht das nahezu unmöglich.
  • Verhinderung der Datenausführung. Markiert bestimmte Bereiche des Speichers als ausführbar oder nicht ausführbar und verhindert damit, dass ein Exploit Code ausführt, der in einem nicht ausführbaren Bereich gefunden wird.

Softwareentwickler können auch Vorsichtsmaßnahmen gegen Sicherheitsschwachstellen durch Pufferüberlauf ergreifen, indem sie in Sprachen mit integriertem Schutz schreiben oder in ihrem Code spezielle Sicherheitsverfahren einsetzen.

Trotz aller Vorsichtsmaßnahmen entdecken Entwickler immer neue Sicherheitslücken durch Pufferüberlauf, manchmal erst nachdem sie erfolgreich ausgenutzt wurden. Wenn neue Sicherheitslücken entdeckt werden, müssen die Ingenieure die betroffene Software patchen und sicherstellen, dass Benutzer der Software Zugriff auf den Patch erhalten.

Welches sind die verschiedenen Arten von Pufferüberlaufangriffen?

Es gibt eine Reihe verschiedener Pufferüberlaufangriffe, die unterschiedliche Strategien anwenden und auf unterschiedliche Codeteile abzielen. Es folgen einige der bekanntesten.

  • Stack-Overflow-Angriff. Das ist die häufigste Art Pufferüberlaufangriff und beinhaltet das Überlaufen eines Puffers auf dem Call Stack*.
  • Heap-Überlaufangriff. Diese Art von Angriff zielt auf Daten im offenen Speicherpool, der als Heap* bezeichnet wird.
  • Integer-Überlaufangriff. Bei einem Integer-Überlauf führt eine arithmetische Operation zu einer Integer, die zu groß für den Integer-Typ ist, der sie speichern soll. Das kann zum Pufferüberlauf führen.
  • Unicode-Überlauf. Ein Unicode-Überlauf erzeugt einen Pufferüberlauf, indem Unicode-Zeichen in eine Eingabe eingefügt werden, die ASCII-Zeichen erwartet. (ASCII und Unicode sind Codierungsstandards, mit denen Computer Text darstellen können. Beispielsweise wird der Buchstabe „a“ in ASCII durch die Zahl 97 dargestellt. Während ASCII-Codes nur Zeichen aus westlichen Sprachen enthalten, kann Unicode Zeichen für fast jede geschriebene Sprache der Welt darstellen. Da Unicode so viel mehr Zeichen enthält, sind viele Unicode-Zeichen größer als das größte ASCII-Zeichen.)

*Computer basieren auf zwei verschiedenen Modellen der Speicherzuweisung, dem Stack und dem Heap. Beide befinden sich im RAM des Computers. Der Stack ist übersichtlich organisiert und enthält Daten nach dem Last-in-First-out-Prinzip. Unabhängig davon, welche Daten zuletzt im Stack abgelegt wurden, werden sie als erste ausgegeben, ähnlich wie die zuletzt in ein Munitionsmagazin eingelegte Kugel als erste abgefeuert wird. Der Heap ist ein unorganisierter Pool mit zusätzlichem Speicher. Daten werden in keiner bestimmten Reihenfolge in den Heap ein- oder aus diesem ausgegeben. Da der Zugriff auf den Speicher eines Stacks viel schneller ist als der Zugriff auf einen Heap, ist der Heap im Allgemeinen für größere Datenmengen oder Daten reserviert, die ein Programmierer explizit verwalten möchte.