Assignment Chef icon Assignment Chef
All German tutorials

Programming lesson

RISC-V Pufferüberlauf-Angriff verstehen: Ein Leitfaden für CDA 4205L Lab #13

Lerne, wie Pufferüberlauf-Angriffe in RISC-V funktionieren und wie du dich dagegen schützen kannst. Ein praxisnahes Tutorial für Studierende der Computerarchitektur.

Pufferüberlauf RISC-V Buffer Overflow Attack CDA 4205L Computerarchitektur Sicherheit RISC-V Assembly Stack Overflow Speicherorganisation Systemsicherheit RISC-V Debugger Sichere Programmierung Assembler Sicherheitslücke Pufferüberlauf verhindern RISC-V Tutorial Deutsch Hochschulprojekt Sicherheit

Einführung in Pufferüberlauf-Angriffe bei RISC-V

Im Rahmen des Labors CDA 4205L Lab #13 beschäftigen wir uns mit einem klassischen Sicherheitsproblem: dem Pufferüberlauf. Dieses Tutorial erklärt dir Schritt für Schritt, wie ein solcher Angriff in der RISC-V-Architektur abläuft und welche Gegenmaßnahmen du ergreifen kannst. Der Fokus liegt auf dem Verständnis der Speicherorganisation und den Auswirkungen auf die Systemsicherheit.

Grundlagen: Stack, Puffer und Speicherlayout

In der RISC-V-Architektur wird der Stack für lokale Variablen und Rücksprungadressen genutzt. Ein Puffer ist ein zusammenhängender Speicherbereich, der mehrere Daten gleichen Typs aufnimmt. Wenn ein Programm mehr Daten in einen Puffer schreibt, als dieser fassen kann, werden benachbarte Speicherbereiche überschrieben – das ist der Pufferüberlauf.

Stell dir vor, du hast einen Puffer für 8 Bytes und dahinter ein Passwort (ebenfalls 8 Bytes). Bei einer Eingabe von „aaaabbbb“ werden die ersten 8 Bytes in den Puffer geschrieben, die nächsten 8 überschreiben das Passwort. Die Folge: Der Vergleich zwischen Eingabe und Passwort liefert „wahr“, da beide nun identisch sind.

Der Angriff: Schritt für Schritt

1. Normales Verhalten

Das Programm erwartet das korrekte Passwort „cda4205L“. Gibst du ein falsches Passwort ein, wird der Zugriff verweigert. Mit einem Debugger (z.B. RARS) kannst du den Speicher einsehen und siehst, dass deine Eingabe im InputBuffer gespeichert wird, während das korrekte Passwort im Password-Bereich liegt.

2. Den Puffer überlaufen lassen

Gib nun eine lange Zeichenkette aus wiederholten Zeichen ein, z.B. „aaaaaaaaaaaaaaaa“ (16 'a'). Beobachte den Speicher: Der InputBuffer (8 Bytes) ist gefüllt, und die nächsten 8 Bytes (das Password) werden ebenfalls mit 'a' überschrieben. Das Programm vergleicht nun deine Eingabe mit dem überschriebenen Passwort – beide sind gleich, also erhältst du Zugang.

3. Anzahl der benötigten Zeichen

Um das Password zu erreichen, musst du genau 8 Zeichen eingeben (die Größe des InputBuffer). Um es vollständig zu überschreiben, benötigst du 16 Zeichen: 8 für den Puffer und 8 für das Passwort. Die genaue Anzahl kann je nach Implementierung variieren, aber das Prinzip bleibt gleich.

Schutzmaßnahmen: Wie verhindere ich den Angriff?

Moderne Compiler und Programmiersprachen bieten Schutzmechanismen:

  • Bounds-Checking: Überprüfe vor jedem Schreibzugriff, ob der Index innerhalb der Puffergrenzen liegt.
  • Sichere Funktionen: Verwende statt gets() die Funktion fgets() mit Längenbegrenzung.
  • Stack Canaries: Füge einen zufälligen Wert (Canary) zwischen Puffer und Rücksprungadresse ein. Wird dieser überschrieben, bricht das Programm ab.
  • ASLR: Zufällige Anordnung der Speicherbereiche erschwert gezielte Angriffe.

Praktische Übung: Den Code sichern

Im Labor CDA 4205L sollst du den bereitgestellten RISC-V-Assembler-Code so modifizieren, dass ein Pufferüberlauf nicht mehr möglich ist. Eine einfache Lösung: Erhöhe die Puffergröße oder führe eine Längenprüfung ein. Beispielsweise könntest du nach der Eingabe prüfen, ob die Anzahl der gelesenen Zeichen die Puffergröße überschreitet, und gegebenenfalls die Eingabe kürzen oder einen Fehler ausgeben.

Fazit

Der Pufferüberlauf ist eine der ältesten und zugleich gefährlichsten Sicherheitslücken. Dieses Tutorial hat dir gezeigt, wie er in der RISC-V-Architektur funktioniert und wie du dich dagegen schützen kannst. Indem du die Speicherorganisation verstehst und sichere Programmierpraktiken anwendest, trägst du zur Systemsicherheit bei. Viel Erfolg bei deinem Labor!