Berichte über die Sicherheitsrisiken vom mobilen Instant-Messaging-Dienst WhatsApp ziehen sich durch die Medien. Man liest von „Sicherheitslücken“, „groben Fehlern“ oder gar „Übertragung im Klartext“. Aber wie sieht deren Verschlüsselung eigentlich heute aus? Und welche Fehler wurden gemacht? Im folgenden Artikel versuche ich diese Fragen auf anschauliche Weise zu beantworten.

WhatsApp-Sicherheit heute

Wie bereits heise oder auch t3n berichteten, hat Thijs Alkemade — der Chefentwickler des Instant-Messaging-Dienstes Adium — einen Artikel veröffentlicht, in dem er die (Un-)Sicherheit von WhatsApp demonstriert. Er ist der Ansicht, dass alle bisher über Whatsapp gesendeten Nachrichten als kompromittiert anzusehen seien.

Aber nun von Anfang an: Bei der ersten Anmeldung registriert sich das Smartphone mit seiner Rufnummer über eine HTTPS-Verbindung am WhatsApp-Server. Dieser sendet per SMS einen Authentifizierungs-Code an das Smartphone zurück. Der Code wird dort wiederum benutzt, um über HTTPS ein sicheres langes Zufalls-Passwort vom Server zu erhalten. Dazu gleicht der Server den vom Client/Smartphone zurückgeschickten Code mit seinem zuvor generierten Code ab. Bei positiver Übereinstimmung sendet der Server nun das Passwort an den Client.

WhatsApp-Registrierungsprozess [Ochsenkühn 2013] - Icons: freepik von flaticon.com
WhatsApp-Registrierungsprozess [Ochsenkühn 2013] – Icons: freepik von flaticon.com

Von nun an besitzen also sowohl Smartphone als auch die Server von WhatsApp das Nutzerpasswort.

Authentifizierung im Detail

Wenn ein Nutzer jetzt eine Kommunikation starten möchte, geschieht folgende so genannte symmetrische Challenge-Response-Authentifizierung über das Whatsapp-eigene Protokoll „WAUTH-1“:

  1. Zuerst meldet sich das Smartphone mit seiner Rufnummer beim WhatsApp-Server an.
  2. Der Server schickt nun im Gegenzug eine „Challenge“ zurück. Diese können wir uns als einen langen Wert aus Buchstaben und Zahlen vorstellen.
  3. Zuletzt muss der Client (also das Smartphone) mit einer „Response“ antworten, in welcher er beweist, dass er ein gemeinsames Geheimnis (das Passwort) zwischen Server und Client kennt.

Wie sieht das genau aus?
Sobald die Challenge beim Client eingetroffen ist, verwendet er PBKDF2 – eine Funktion, die aus einem Passwort einen Schlüssel herleitet. Diese Funktion bekommt als Eingabeparamter das Nutzerpasswort und erzeugt nun in 16 Runden mit der SHA-1 Hash-Funktion und der vorher erhaltenen Challenge als „Salz“ einen Schlüssel. Die ersten 160 Bit dieses Schlüssels sind nun unser Session-Key.

Als nächstes erzeugt sich der Client ein Klartextpaket aus seiner Rufnummer, der Challenge und einem aktuellen Zeitstempel. Dieser Klartext wird nun mit dem Session-Key im symmetrischen RC4-Verfahren verschlüsselt. Geheimtext = VRC4(Klartextpaket, Session-Key)
Anschließend wird auf diesen verschlüsselten Text noch ein HMAC (mit SHA-1) angewendet, um eine Prüfsumme zu erhalten. Die letztendlich an den Server verschickte Response sieht nun so aus:

Response = 4 Byte der Prüfsumme + RC4-verschlüsselter Geheimtext

Der Server macht genau dasselbe (wobei der Zeitstempel einen gewissen Ungenauigkeitsgrad besitzt, so dass er auf beiden Seiten derselbe ist) und gleicht die Ergebnisse ab. Wenn sie übereinstimmen, hat sich der Nutzer erfolgreich authentifiziert und kann nun kommunizieren.

WhatsApp Authentifizierung [Ochsenkühn 2013] - Icons: Freepik von flaticon.com
WhatsApp Authentifizierung [Ochsenkühn 2013] – Icons: Freepik von flaticon.com

Die Kommunikation per WhatsApp

Das klingt bisher alles gar nicht schlecht. Das eigentliche Problem welches Alkemade entdeckt hat, liegt aber in der Kommunikation. Auch hier verwendet WhatsApp den RC4-Algorithmus zur symmetrischen Verschlüsselung.

Exkurs 1: Bei einer symmetrischen Verschlüsselung verwendet man zum ver- und entschlüsseln denselben Schlüssel.

Exkurs 2: Bei einer asymmetrischen Verschlüsselung hingegen verschlüsselt man mit einem öffentlichen Schlüssel seines Kommunikationspartners. Dieser entschlüsselt den Geheimtext im Anschluss mit seinem geheimen privaten Schlüssel.

Exkurs 3: In gängigen Verschlüsselungsprotokollen werden beide Verfahren verwendet. Meist wird der Klartext symmetrisch verschlüsselt. Der zugehörige Schlüssel wird anschließend asymmetrisch verschlüsselt und dem Gegenüber zugeschickt, so dass auch er den symmetrisch verschlüsselten Klartext wieder entschlüsseln und lesen kann. Genauere Informationen hierzu findet man unter dem Stichwort Hybride Verschlüsselung.

RC4 ist ein Stromchiffrierer und erzeugt aus einem Schlüssel (in diesem Fall aus dem Session-Key) eine Zufallsfolge, welche Bit für Bit per XOR mit dem Klartext verknüpft wird.

WhatsApp macht nun einen grundlegenden Fehler: Sie benutzen 2 Mal dieselbe Zufallsfolge, und zwar für eingehende und ausgehende Nachrichten. Dadurch lässt sich der Schlüssel ganz einfach aushebeln:
(A = Klartext von Alice, B = Klartext von Bob, Z = Zufallsfolge)

(A XOR Z) XOR (B XOR Z) = A XOR B

Wenn man also die verschlüsselte Nachricht A mit der verschlüsselten Nachricht B per XOR verknüpft, erhält man wiederum eine XOR-Verknüpfung aus A und B (ohne die Zufallsfolge Z). Kennt oder errät ein Angreifer nun Teile von A (respektive B) kann er dadurch Teile von B auslesen. Oftmals findet man beispielsweise immer wiederkehrende Teile des Protokolls oder Grußformeln.

Bessere Sicherheit ja, perfekte Sicherheit nein!

Die Macher von WhatsApp haben also in puncto Sicherheit deutlich nachgebessert (siehe Versenden im Klartext oder IMEI/MAC-Adresse als Passwörter), machen jedoch wieder einen groben Fehler in grundlegender Kryptographie. Inwieweit dieser Fehler praktisch ausgenutzt werden kann, darüber kann man sich so seine Gedanken machen.

Auf jeden Fall sollte man es zumindest in Betracht ziehen, auf eine Alternative zu wechseln. Die Frage ist hierbei nur: Welcher Messenger ist denn sicher(er)?