Quizduell-Hack durch Reverse Engineering

Wenn man sich einmal die Netzwerk-Kommunikation der populären Quizduell-App anschaut, stellt man schnell fest, dass die Antworten zu allen Fragen einer Spielrunde im voraus problemlos ausgelesen werden können. Wie geht das und wie könnte man so etwas verhindern?

Wenn man sich einmal die Netzwerk-Kommunikation der populären Quizduell-App anschaut, stellt man schnell fest, dass die Antworten zu allen Fragen einer Spielrunde im voraus problemlos ausgelesen werden können. Wie geht das und wie könnte man so etwas verhindern?

Motivation

Ich möchte mit diesem Post nicht zu Betrügereien verleiten, sondern zeigen, welche Schwachstellen existieren und natürlich auch, wie diese von den Entwicklern einfach zu vermeiden sind.
Damit die Technik nicht sofort von jedermann angewandt werden kann, lasse ich bewusst ein paar Details weg.

Tools

Drink

Zu dem Hack empfehle ich nach alter Fravia-Tradition einen Drink:
Highland Park Svein aus der Warrior-Serie, Single Malt Whiskey

Vorgehensweise

Wir wollen versuchen, uns in die Kommunikation der App einzuklinken, um mitzuhören, was dort so gesprochen wird.

Dazu verwenden wir Fiddler und installieren ihn im gleichen lokalen Netz wie unser iOS-Device. Auf diesem importieren wir dann das Fiddler-Zertifikat, damit es als vertrauenswürdig eingestuft wird. Die aktive WLAN-Verbindung bekommt dann als Proxy den eben installierten Fiddler verpasst. Schon läuft alle Kommunikation durch unseren Proxy. Auf Android wäre unser Unterfangen übrigens nicht so einfach, da hier kein globaler Proxy definiert werden kann, der auch für Apps gelten würde.

Wenn wir jetzt die Quizduell-App starten, läuft sämtliche Kommunikation zum Server durch unseren Proxy. Die App baut eine SSL-verschlüsselte Verbindung zum Proxy auf. Der Proxy entschlüsselt die Daten und baut seinerseits wieder eine SSL-verschlüsselte Verbindung zum eigentlichen Ziel-Server auf. Der Proxy kann also als „Man in the middle“ die Daten unverschlüsselt mitlesen. Die Kommunikation der App kann man jetzt also wohl als kompromittiert bezeichnen.

Schauen wir uns mal die Daten an. Zunächst fällt auf, dass massiv viel Traffic durch Werbung verursacht wird. Da werden auch jede Menge Daten an Adserver geschickt, um das Nutzerverhalten zu analysieren. Ist wohl der Preis, den man heutzutage bei einer kostenlosen App zahlen muss…

Wir konzentrieren uns auf die Kommunikation, die mit qkgermany.feomedia.se geführt wird. Denn das ist der eigentliche Applikationsserver mit REST-Schnittstelle.

Kommunikation mit dem Quizduell-Server
Kommunikation mit dem Quizduell-Server

Hier sehen wir beim Starten eines neuen Spiels, dass vorher ein umfangreiches Daten-Paket im JSON-Format vom Server geliefert wird. In dem Paket stehen unter anderem alle Fragen, die in dem anstehenden Spiel gestellt werden können, mit ihren korrekten Antworten. Es sind 54 Stück, die je nach gewählten Kategorien tweilweise im Duell eingesetzt werden. Hier könnte man sich jetzt entweder alle Fragen vorher durchlesen oder man könnte live während des Spieles im JSON-Array nachgucken, wie die richtige Antwort zur aktuellen Frage lautet.

Alle Fragen eines gestarteten Spiels im JSON-Array
Alle Fragen eines gestarteten Spiels im JSON-Array

Verschlüsselung

Quizduell setzt für die Verschlüsselung zwischen Client und Server zwar SSL ein, aber sichert es für den App-Gebrauch nicht ausreichend ab.

Auf der Domain qkgermany.feomedia.se wird ein selbstsigniertes Zertifikat eingesetzt, es ist also nicht von einer offiziellen CA signiert. Ein normaler Webbrowser hätte damit seine Probleme und würde die Domain als nicht vertrauenswürdig einstufen. Auch deswegen, weil das Zertifikat erst 2035 abläuft und aktuelle Browser so lange Laufzeiten nicht mehr akzeptieren.

Das alles ist in diesem Szenario aber in Ordnung, da ja lediglich die App als Client agiert.

Zudem wird Forward Secrecy durch den Diffie-Hellman-Schlüsseltausch eingesetzt. Damit ist es nach aktuellem Stand für lauschende Geheimdienste, die einfach nur mitlesen, nicht möglich, den Traffic zu entschlüsseln.

Die Verschlüsselung an sich ist also gut! Was nicht so gut ist, ist das Vertrauen, das die App fremden Zertifikaten entgegenbringt. Denn in unserem Beispiel verwenden wir das Fiddler-Zertifikat und dieses wird anstandslos von der App akzeptiert.

Gegenmaßnahme Zertifikats-Pinning

Manch einer mag sagen, ein bisschen bei einem Spiel zu schummeln, wäre harmlos. Gerade in Zeiten der NSA-Datensammelwut sollte es aber allen Entwicklern ums Prinzip gehen.

Wenn eine Anwendung kritische Daten über das Netzwerk verschickt, sollten diese ausreichend gesichert sein. Die hier gezeigte, einfache Man-in-the-middle-Attacke, ist eigentlich ein Klassiker. Heutzutage sollte jeder App-Entwickler wissen, wie man diese Lücke schließt.

In diesem Fall sollte lediglich eine Maßnahme ergriffen werden. Danach hat ein Angreifer schon viel größere Probleme, zum Erfolg zu kommen: Das Zertifikats-Pinning

Die App muss bei ihrer Kommunikation mit dem Server sicherstellen, dass es auch wirklich der richtige Server ist, mit dem sie kommuniziert und nicht jemand dazwischen. Das Zertifikat des Servers muss hierzu in der App hinterlegt, also gepinned werden. Wenn eine Antwort vom Server ankommt, kann das Zertifikat abgeglichen und dadurch das Vertrauen hergestellt werden. Alternativ kann auch ein Hash des Zertifikats in der App gespeichert und dieser zum Vergleich herangezogen werden.

Diese Methode hat zwar für die Wartbarkeit der App Nachteile, denn das Zertifikat läuft irgendwann ab und dann muss die App bei jedem User aktualisiert werden. Aber die Vorteile überwiegen.

Konkretere Hinweise zur Umsetzung können beim OWASP nachgelesen werden.

Update vom 27.03.2014

FEO Media AB (die Entwickler vom Quizduell) haben sich bei mir gemeldet. Sie beheben gerade die von mir benannten Schwachstellen und kommen demnächst mit einem Update raus.
Die neue Version werde ich dann auch noch einmal unter die Lupe nehmen.

Aktuelle Versionen während des Tests waren bei iOS 4.2.9 und bei Android 1.3.1.

Update vom 02.05.2014

Es ist jetzt die Version 4.4.5 der iOS-App erschienen. Ein kurzer Test bestätigt, dass eine einfache Man-in-the-middle-Attacke mittels SSL-Proxy nicht mehr möglich ist. Sehr schön!

Bleibt die Frage, was mit Usern geschieht, die nicht updaten wollen. Für die steht die Backdoor vermutlich noch eine Weile offen.

Update vom 20.05.2014

Tja, jetzt ist die Quizduell-App groß im Fernsehen und sie hält dem Useransturm nicht stand und hat offenbar immer noch Sicherheitsprobleme… Die von mir aufgezeigten Protokollschwächen waren offenbar nicht das einzige Manko der App. Immerhin wurde das Zertifikatspinning noch rechtzeitig eingebaut, das wird sicherlich einige Attacken vereitelt haben.

2 Gedanken zu „Quizduell-Hack durch Reverse Engineering“

  1. Der Kardinalfehler scheint mir aber zu sein, überhaupt die Antworten an die App zu senden. *Nach* dem Beantworten der Frage sollte der Server gefragt werden, ob die Antwort korrekt ist. Beim Spielprinzip vom Quizduell halte ich es auch schon für falsch, die Fragen schon vorher en bloc an die App zu senden. Die (einzelne) Frage darf erst dann gesendet werden, wenn man das Wissensgebiet ausgewählt hat (bzw. wenn der Gegner die Frage gespielt hat).

    Dadurch würde natürlich mehr Kommunikation zwischen App und Server entstehen und eine Runde offline zu spielen, wäre nicht möglich, aber Schummeln wäre ausgeschlossen.

Kommentare sind geschlossen.