Direkt zum Inhalt
19.10.2015 - Fachbeitrag

Wie die NSA den Diffie-Hellman Schlüsseltausch knackt

Der NSA-Whistleblower James Bamford veröffentlichte 2012 einen Artikel bei wired.com, dass der NSA ein Durchbruch bei Angriffen auf verschlüsselte Verbindungen gelungen sein muss und dass die NSA einen erheblichen Teil des verschlüsselten Datenverkehrs entschlüsseln kann. Die Dokumente des NSA-Whistleblowers Edward Snowden belegen diese Vermutung und zeigen, dass die NSA einen erheblichen Teil der SSL/TLS, SSH und VPN-Verbindungen entschlüsseln kann. Die "NSA VPN decryption infrastructur" zeigt, dass wenige Daten an einen Supercomputer gesendet werden, wenn ein "Internet Key Exchange"-Handshake zum Aufbau einer VPN-Verbindung erkannt wird. Der Supercomputer liefert den Key zum Entschlüsseln der Daten, die dann on-the-fly entschlüsselt und in XKeyscore eingespeist werden. Doch eine gute Server-Administration schützt...

Auf der ACM CCS im Okt. 2015 wurde das Paper "How is NSA breaking so much crypto?" mit dem Best Paper Award ausgezeichnet, da es erstmals eine plausible Erklärung für die Kapazitäten der NSA liefert. Die Autoren beschreiben einen Angriff auf den Diffie-Hellman Schlüsseltausch, wenn "common DH parameters" mit 1024 Bit Schlüssellänge verwendet werden, wie sie im RFC 2409 empfohlen wurden.

Es ist eine Ironie, dass ausgerechnet der Diffie-Hellmann-Schlüsseltausch den Ansatzpunkt für einen Angriff der NSA auf die Verschlüsselung bietet, da diese Technik als Forward Secrecy für die Transportverschlüsselung SSL/TLS sowie für SSH und VPNs besonders guten Schutz gegen Angriffe auf die Krypto bieten sollte.

Die NSA könnte Rainbow-Tables für Default-DHE-Parameter haben

Ähnlich wie bei dem Angriff auf die GSM-Verschlüsselung im Mobilfunk, kann die NSA mit der zur Verfügung stehenden Rechenpower ihrer Supercomputer für einige häufig verwendete DH-Parametersätze Rainbowtables berechnen. Nach Ansicht der Autoren braucht die NSA mit der angenommenen Rechenpower etwa 1 Jahr, um einen DH-Parametersatz mit 1024 zu analysieren. Danach können die vorberechneten Daten genutzt werden, um einen Diffie-Hellmann-Schlüsseltausch innerhalb von wenigen Sekunden zu knacken. Wenn ein Key Exhange von einem Lauschkonten erkannt wird, werden die ersten Daten an den Supercomputer gesendet, der entweder den Key knackt und den Schlüssel zurücksendet oder einen Fehler meldet. Wurde der Key geknackt, kann der verschlüsselte Datenverkehr on-the-fly entschlüsselt und in XKeyscore eingespielt werden. Wenn die NSA die beiden am häufigsten verwendeten 1024 Bit DH-Parametersätze mit ihren Supercomputern analysiert hat, dann kann sie etwa 2/3 der VPN Verbindungen, 1/4 der SSH Verbindungen und 1/5 der SSL/TLS Verbindungen on-the-fly knacken.

Sichere Server-Konfiguration mit individueller DHE-Tabelle

Um sich gegen diese Angriffe zu schützen, sollten die Administratoren von Web-, Mail-, SSH- und VPN-Servern ihre Konfigurationen anpassen. Einige FAQ für die Server-Konfigurationen wie z.B. die Apache FAQ sind als out-of-date zu betrachten.

  1. 1024 Bit DH-Parameter sollten nicht mehr verwendet werden.
  2. 2048 Bit DH-Parameter sollten regelmäßig gewechselt werden.

Apache 2.2

Apache 2.2 unterstützt keine 2048 Bit DH-Parameter. Der Diffie-Hellmann-Schlüsseltausch (DHE) sollte deshalb deaktiviert werden. Der ECDHE-Schlüsseltausch ist nicht von dem Angriff betroffen und kann weiter verwendet werden. Dazu müssen alle DHE-Parameter aus

SSLCipherSuite

entfernt werden -- ECDHE-Ciphers hingegen dürfen weiterhin aktiv bleiben.

Apache 2.4.x, nginx, Postfix, Dovecot

Diese Server können individuell generierte DH-Parameter verwenden. Die DH-Parameter können wöchentlich oder monatlich mit einem Cron-Job erneuert werden, der folgendes Kommando ausführt (Beispiele für Apache):

FILE=`mktemp` ; openssl dhparam 2048 -out $FILE && mv -f $FILE /etc/apache2/ssl/dh2048.pem

In den SSL-Konfigurationen der Server kann man die Datei mit den DH-Parametern konfigurieren. Für Apache 2.4.x steht folgende Option zur Verfügung:

SSLOpenSSLConfCmd DHParameters "/etc/apache2/ssl/dh2048.pem"

In der nginx-Konfiguration kann man folgende Option verwenden:

ssl_dhparam /etc/nginx/dh2048.pem

In Postfix verwendet man etwas irreführend folgende Option:

smtpd_tls_dh1024_param_file = /etc/postfix/dh2048.pem

Dovecot generiert automatisch wöchentlich neue DH-Parameter, wenn folgende Option gesetzt sind:

ssl_dh_parameters_length=2048

OpenSSH Server

OpenSSH bietet 8 Protokolle für den Schlüsseltausch. Drei Protokolle verwenden Eliptische Kurven mit NIST-Curven und werden deshalb als suspekt angesehen. Die Protokolle mit SHA1 oder 1024 Bit DH-Parametern gelten ebenfalls nicht mehr als sicher. Damit bleiben zwei als sicher geltende Protokolle für den Schlüsseltausch übrig. In der Konfigurationsdatei /etc/ssh/sshd_config kann man festlegen, dass nur diese beiden Protokolle für den Schlüsseltausch verwendet werden dürfen:

KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256

Wie funktioniert eigentlich kryptographische Verfahren auf Basis elliptischer Kurven?

Unser Crypto-Experte Karsten Ness hat dazu auf unserer letzten Secure Linux Administration Conference einen schönen Vortrag gehalten und gibt dort auch weitergehende Tipps zur sicheren Server-Konfiguration:

Kommentare

11 Antworten zu Wie die NSA den Diffie-Hellman Schlüsseltausch knackt

s-Icon
Steffen
20. October 2015 um 12:40

Danke für die Tipps!

In der "KexAlgorithms"-Zeile musste ich das Leerzeichen nach dem Komma entfernen, sonst gab es beim Starten von OpenSSH folgenden Fehler: "garbage at end of line"

Der Android-SSH-Client "VX ConnectBot" unterstützt leider keinen der beiden Algorithmen, aber mit dem Original "ConnectBot" (der mittlerweile wieder weiterentwickelt wird) klappt es: https://play.google.com/store/apps/details?id=org.connectbot

p-Icon
Peer Heinlein
20. October 2015 um 14:04

Leerzeichen habe ich entfernt, das hat sich vielleicht beim Einstellen in den Blog eingeschlichen, Danke für den Hinweis!

d-Icon
Daniel
20. October 2015 um 15:46

Danke!

Wäre schön noch courier-mta mit aufzunehmen:

http://www.courier-mta.org/mkdhparams.html

w-Icon
Werner Flamme
22. October 2015 um 10:14

Hallo Peer, der Apache 2.4 kennt den Parameter SSLOpenSSLConfCmd laut http://httpd.apache.org/docs/current/mod/mod_ssl.html#sslopensslconfcmd nur, wenn Apache >= 2.4.8 und gleichzeitig openssl in Version >= 1.0.2 eingesetzt werden. So kann man bei dem Apache 2.4.10 beim SLES 12 den Parameter aktuell nicht benutzen, weil dort nur openssl 1.0.1i zur Verfügung steht.
Soeben entdeckt ... :-\

r-Icon
Ralph Gottschalkson
25. November 2015 um 12:09

Sehr guter Artikel!
Könntet Ihr Eure Anleitung "Perfect Forward Secrecy (PFS) für Postfix und Dovecot einrichten" entsprechend updaten (für die Freunde des cut&paste - wie mich z.B. ;-) ) ?
Danke!

r-Icon
Richard Hering
25. November 2015 um 21:26

Wer einen FTP-Server betreibt, sollte diesen nicht vergessen:

ProFTPd:

TLSDHParamFile /etc/proftpd/dh2048.pem

Bei PureFTPd wird automatisch die /etc/ssl/private/pure-ftpd-dhparams.pem verwendet, sofern vorhanden.

m-Icon
Malte
31. December 2015 um 12:34

Hallo

Wichtig ist auch die Apache und OpenSSL Version.

Min.:

* Apache 2.4.8
* OpenSSL 1.02

Damit ist Ubuntu 14.04 schonmal raus

m-Icon
Mailserver mit Dovecot, Postfix und MySQL unter Ubuntu 16.04 LTS
21. April 2016 um 07:00

[…] wird empfohlen, die DH-Parameter täglich via Cronjob zu erneuern (Siehe auch Beitrag von mailbox.org). Dazu wird das Verzeichnis /etc/myssl erstellt […]

m-Icon
Mike
02. August 2016 um 12:11

<cite>Dovecot generiert automatisch wöchentlich neue DH-Parameter, wenn folgende Option gesetzt sind[...]</cite>

Mit Dovecot 2.2 wurde die wöchentliche Neugenerierung <a href="http://wiki2.dovecot.org/SSL/DovecotConfiguration&quot; rel="nofollow">deaktiviert</a>.

p-Icon
Protohuman
01. November 2017 um 06:38

Laut https://wiki.dovecot.org/SSL/DovecotConfiguration werden wöchentlich neue DH-Parameter nur in Dovecot 2.1 und älter generiert, bei Dovecot 2.2 jedoch nicht. Das widerspricht der Angabe im Blogposting. Was ist nun richtig?

m-Icon
Malte Schmidt-Tychsen
11. March 2019 um 09:16

Der Cron-Job funktioniert so nicht. Openssl erwartet numbits nach den Optionen. Also kommt 2048 nach -out $FILE. Nicht davor. Die Zeile lautet richtig:

FILE=`mktemp` ; openssl dhparam -out $FILE 2048 && mv -f $FILE /etc/apache2/ssl/dh2048.pem