\n\n\n\n\n\n\n\n\n\n\n
flawopen.com/Simulatoren/Heartbleed Buffer Overread
Interaktiver Browser-Speichersimulator: Wie unvalidierte TLS-Heartbeat-Längenfelder zu unkontrollierten Speicherüberläufen und Datenabflüssen im Server-Heap führten.
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.
Der Angreifer sendet eine Heartbeat-Anfrage mit 1 Byte Nutzlast ('A'), gibt im Längenfeld aber 65.535 Bytes (0xFFFF) an.
OpenSSL liest die Länge mittels n2s(p, payload) aus, ohne zu prüfen, ob 1 + 2 + payload + 16 <= rrec.length erfüllt ist.
Der Server reserviert basierend auf der Angreiferangabe volle 64 KB Speicher im Heap.
memcpy() kopiert 64 KB Speicherdaten am 1-Byte-Paket vorbei und übermittelt private SSL-Schlüssel und Sitzungscookies an den Angreifer.
/* 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);
/* 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);