Die so genannte Heartbleed-Attacke nutzt einen Programmierfehler in Open SSL aus. Genauer gesagt befindet sich die Schwachstelle in der Heartbeat-Erweiterung des TLS-Protokolls, daher der Name. Diese Erweiterung dient dazu, eine TLS-Verbindung zwischen Client und Server aktiv zu halten. Dazu wird einfach eine Payload beliebigen Inhalts zwischen den zwei Hosts gesendet. Der Empfänger schickt die Nachricht des Senders einfach an den Sender zurück, um anzuzeigen, dass die Verbindung noch steht.
Diese im Prinzip einfache TLS-Erweiterung ist grundsätzlich auch trivial zu programmieren. Allerdings hat sich in der konkreten Implementierung ein folgenschwerer Fehler eingeschlichen. Kurz gesagt: Der Empfänger glaubt dem Absender schlichtweg, wie viele Bytes in der Payload enthalten sind. Der Sender kann nun eine falsche Länge angeben und die Payload derart zusammenbauen, dass er Speicher auf dem Empfänger-System auslesen kann. Aufgrund der Symmetrie der Heartbeat-Erweiterung funktioniert diese Attacke in beide Richtungen.
Die konkrete Attacke besteht darin, dass der Angreifer seinem Opfer (beispielsweise einem verwundbaren Server) eine Heartbeat-Payload schickt, die viel kleiner ist als vom Sender spezifiziert. Im Extremfall kann der Angreifer eine Payload von einem Byte Länge schicken und angeben, dass es sich um eine 16 KByte große Load handelt. Der Empfänger wird nun versuchen, 16 KByte an den Sender zurückzuschicken. Da aber die eigentliche Payload nur ein Byte groß ist, wird der Empfänger beliebige andere Daten aus seinem eigenen Speicher an den Angreifer schicken.
Im Allgemeinen wäre dies noch nicht dramatisch, da die Daten beliebige Daten des Systems sein könnten. Allerdings verwendet Open SSL eine eigene Speicherverwaltung (“OPENSSL_malloc()” statt “malloc()”), so dass die 16 KByte immer Open-SSL-Daten sind. Meist sind dies Passwörter, geheime Serverschlüssel, oder andere hoch sensitive
Informationen. Diese Kombination macht die Sicherheitslücke so gefährlich.
Obwohl die Sicherheitslücke so weitreichende Folgen hat, ist der eigentliche Programmierfehler trivial zu korrigieren. Der Fehler befindet sich in der Funktion “tls1_process_heartbeat()” in der Quelltextdatei “t1_lib.c”. Der Patch fügt einfach folgende If-Abfrage hinzu:
if (1 + 2 + payload + 16 > s->s3->rrec.length) return 0; /* silently discard per RFC 6520 sec. 4 */
Diese If-Abfrage vergleicht die Länge der “payload”-Variablen über die “SSL3_RECORD”-Struktur (“s3->rrec”) mit der eigentlichen Größe der übertragenen Daten. Falls diese nicht zusammenpassen, ignoriert die Software das Paket einfach und sendet keine
Antwort, womit die Attacke vereitelt ist.
Betroffen sind die Open-SSL-Versionen 1.0.1 bis 1.0.1f und 1.0.2-beta.

