\n\n\n\n\n\n\n\n\n\n\n

flawopen.com/Simulatoren/Heartbleed Buffer Overread

Speichersicherheit / OpenSSL TLS

Interaktiver OpenSSL Heartbleed Buffer-Overread Visualisierer (CVE-2014-0160)

Interaktiver Browser-Speichersimulator: Wie unvalidierte TLS-Heartbeat-Längenfelder zu unkontrollierten Speicherüberläufen und Datenabflüssen im Server-Heap führten.

💡 Einfache Erklärung (ELI5)

Stellen Sie sich vor, Sie sagen einem trainierten Papagei ein 4-Buchstaben-Wort 'BIRD' und fordern ihn auf: 'Wiederhole mein Wort, aber mache deine Antwort 64.000 Buchstaben lang!' Der Papagei krächzt 'BIRD' und plappert sofort die nächsten 63.996 Zeichen aus seinem Kurzzeitgedächtnis aus — darunter geheime Passwörter, private SSL-Zertifikate und sensible Kontonummern anderer Besucher. Bei Heartbleed vertraute OpenSSL der Längenangabe des Clients ungeprüft und kopierte unberechtigt 64 Kilobyte Server-RAM zurück an den Angreifer.

Kernkonzepte und Subsystem-Begriffe

TLS Heartbeat Extension
RFC 6520 Keep-Alive-Mechanismus zur Überprüfung aktiver Verbindungen ohne Session-Neuaufbau.
\n
Payload Length Feld
16-Bit-Zahlenwert im Heartbeat-Header, der die deklarierte Nutzlastgröße angibt (bis zu 65.535 Bytes).
\n
Buffer Overread
Speicherfehler, bei dem ein Programm über das vorgesehene Ende eines Puffers hinaus liest.
\n
Unbegrenztes memcpy()
Speicherkopierbefehl, dessen Längenparameter direkt von ungeprüften Client-Daten gesteuert wird.

Schritt-für-Schritt-Ablauf des Exploits

1

Übermittlung der manipulierten Heartbeat-Anfrage

Der Angreifer sendet eine Heartbeat-Anfrage mit 1 Byte Nutzlast ('A'), gibt im Längenfeld aber 65.535 Bytes (0xFFFF) an.

\n
2

Fehlende Überprüfung der Paketgrenzen

OpenSSL liest die Länge mittels n2s(p, payload) aus, ohne zu prüfen, ob 1 + 2 + payload + 16 <= rrec.length erfüllt ist.

\n
3

Allokation des ungeprüften 64-KB-Antwortpuffers

Der Server reserviert basierend auf der Angreiferangabe volle 64 KB Speicher im Heap.

\n
4

Überlauf des Puffers und Speicherabfluss

memcpy() kopiert 64 KB Speicherdaten am 1-Byte-Paket vorbei und übermittelt private SSL-Schlüssel und Sitzungscookies an den Angreifer.

Quellcode-Vergleich: Längenvalidierung in tls1_process_heartbeat()

UNGEPATSCHTER FEHLER: FEHLENDE GRENZWERTPRÜFUNG IN OPENSSL 1.0.1f
/* 16-Bit-Länge direkt aus dem Paket ohne Prüfung lesen */
n2s(p, payload);
pl = p;

/* Antwortpuffer anhand der vom Client deklarierten Größe allozieren */
buffer = OPENSSL_malloc(1 + 2 + payload + padding);
bp = buffer;

/* FEHLER: Kopiert bis zu 64 KB angrenzenden Server-Heap-Speicher! */
memcpy(bp, pl, payload);
r = ssl3_write_bytes(s, TLS1_RT_HEARTBEAT, buffer, 3 + payload + padding);
GEHÄRTETER PATCH: STRIKTE PRÜFUNG DER TATSÄCHLICHEN PAKETLÄNGE (RFC 6520)
/* 16-Bit-Länge aus dem Paket lesen */
n2s(p, payload);
pl = p;

/* FIX: Prüfen, ob die deklarierte Nutzlast die empfangene Datensatzgröße übersteigt */
if (1 + 2 + payload + 16 > s->s3->rrec.length)
    return 0; /* Manipuliertes Paket lautlos verwerfen */

buffer = OPENSSL_malloc(1 + 2 + payload + padding);
bp = buffer;
memcpy(bp, pl, payload);

Checkliste zur Systemhärtung

← Alle Simulatoren Vollständiges CVE-2014-0160 Heartbleed Teardown lesen →