Der immer häufigere Einsatz von mobilen Applikationen kann unter anderem auf die Zunahme der Verfügbarkeit der Plattform im privaten sowie in der Unternehmensumgebung zurückgeführt werden. Leider finden wir klassische Schwachstellen von Webapplikationen und auch Rich Clients hier immer wieder.
Bei unseren Mobile Application Penetrationtests finden wir immer wieder Apps, die vertrauliche Daten lokal im Klartext speichern oder eine unsichere Verschlüsselung verwenden.
Das Problem dabei ist häufig, dass es einige Missverständnisse zu der Thematik gibt und aufgrund dessen auch oft falsche Maßnahmen getroffen werden.
Wir überprüfen sowohl Android als auch iOS Apps und wollen heute eine Einführung in das Thema bieten und mit der Umsetzung für Android beginnen. In einem nachfolgenden Artikel besprechen wir äquivalent die iOS Plattform und behandeln praktische Umsetzungen.
Anwendungsfälle
Viele moderne Apps dienen nur als Front-End für eine API oder stellen einen angepassten Browser für eine bestehende Applikation dar. Dabei besteht häufig kein Bedarf, sensible Daten lokal zu hinterlegen.
Zur Einleitung in die Thematik wollen wir zuerst die Anwendungsfälle für das sichere Speichern von Daten auf mobilen Endgeräten ansprechen.
Applikationen, die effektiv nur eine Oberfläche für die Kommunikation zu einer API oder einem anderen Webservice bieten, haben auf den ersten Blick keine lokalen Daten zu hinterlegen. Um die Benutzerfreundlichkeiten zu verbessern, werden dann aber Benutzerdaten für die Anmeldung oder API Token gespeichert, sodass der Anwender sich nicht jedes Mal authentifizieren muss.
Diese Benutzerdaten oder Token müssen sicher hinterlegt werden. Wenn z.B. eine mobile Applikation entwickelt wurde, um auf das firmeninterne Dokumentenmanagementsystem zuzugreifen, sind die Benutzerdaten entsprechend vertraulich. Würde die App nun die Zugangsdaten in Klartext lokal hinterlegen, bietet das einem Angreifer eine recht einfache Möglichkeit, auf ein sonst sicheres System unerlaubt zuzugreifen.
Anwendungen, die primär offline betrieben werden, sind eher dem Dilemma ausgesetzt, wie vertrauliche Daten sicher gespeichert werden können.
Beispielsweise eine App, die ein privates Tagebuch anbietet, sollte die vertraulichen Daten entsprechend schützen und nicht in Klartext auf dem Endgerät frei einsehbar speichern.
Wen wovor schützen?
Oftmals ist nicht klar, was und wovor das Verschlüsseln von lokal gespeicherten Daten schützt.
Je nach Applikation schützt sichere Datenspeicherung auf mobilen Endgeräten den Benutzer und/oder die Anwendung bzw. die Programmlogik selbst.
In dem vorherigen Beispiel mit der sicheren Tagebuch-App wird durch sicher gespeicherte Tagebucheinträge der Benutzer geschützt.
Ein Spiel, das lokal einen Highscore führt, kann diesen verschlüsselt speichern, um sich selbst vor einfacher Manipulation zu schützen und dem Spieler das Schummeln zu erschweren.
Ein mobiles Front-End für eine API, die vertrauliche Daten handhabt und für die Benutzerfreundlichkeit Authentifizierungsdaten zwischenspeichert, schützt durch die Verschlüsselung dieser die API und den Benutzer.
Wer bzw. was geschützt wird, sollte somit geklärt sein, aber wovor sollten lokale Daten geschützt werden?
Im Normalfall werden Daten gegen Zugriff von Unbefugten geschützt. Auf mobilen Endgeräten gibt es hier verschiedene Möglichkeiten.
Zugriff durch Unbefugte über Software, Hardware oder externe Prozesse.
Über Apps können Unbefugte Zugriff auf Software auf dem gleichen System erlangen. Vertrauliche Daten können gelesen werden, wenn eine Applikation diese nicht entsprechend schützt und frei lesbar speichert, über Inter Process Communication (IPC) preisgibt oder einen Content Provider unsicher konfiguriert.
Hardwarezugriff durch Unbefugte ist nicht nur durch ein entwendetes, geborgtes oder verlorenes Smartphone möglich. Je nach dem, wie Daten gespeichert werden, ist auch der Zugriff auf die SD-Karte völlig ausreichend.
Unter externen Prozessen versteht man Vorgänge, die es erlauben, Datenzugriff und oftmals auch Zugriff auf Applikationen zu erlangen, ohne direkten Hardwarezugriff zu haben oder direkt mit dem Betriebssystem interagieren zu können. Backuplösungen und Synchronisationstools klonen dabei oft vertrauliche Daten, die somit von dem mobilen Endgerät unabhängig weiterverarbeitet werden können.
Unverschlüsselt
Vorweg, hier beschreiben wir, wie Sie nicht vorgehen sollten.
Unverschlüsseltes Speichern von vertraulichen Daten bedeutet, dass Unbefugte relativ einfach Zugriff auf diese Informationen erhalten können.
Auf Android sollten beispielsweise die Modi „MODE_WORLD_WRITEABLE“ und „MODE_WORLD_READABLE“ für sensible Daten unbedingt vermieden werden.
Wie bereits in einem vorherigen Artikel beschreiben, ist die definierte minSdkVersion mit dem Minimum an Sicherheitsanpassungen in Android gleichzusetzen.
Beispielsweise wurde bei Android erst nach und nach ein sinnvolles Sandboxing von Apps eingeführt. Ältere Versionen von Android schützen also App-Daten nicht gleich wie aktuelle Android-Versionen.
Unsicher verschlüsseln
Unsichere Verschlüsselung kennen wir hauptsächlich aus unseren Rich-Client Penetration Tests, aber treffen immer wieder bei mobilen Anwendungen auf die gleichen Vorgehensweisen.
In der Entwicklung wird oftmals klar, dass bestimmte Daten schützenswert sind und nicht unverschlüsselt gespeichert werden. Dabei fehlt aber Hintergrundwissen oder das Budget, um dies korrekt zu implementieren.
Die drei häufigsten Formen von unsicherer Verschlüsselung, denen wir immer wieder begegnen, sind folgende:
Verwendung von unsicheren Ciphern. Daten werden zwar scheinbar verschlüsselt gespeichert, aber es werden Verfahren verwendet, die bereits seit Jahren als gebrochen angesehen werden. So ist beispielsweise Data Encryption Standard (DES) ein Verschlüsselungsalgorithmus, der als unsicher angesehen werden sollte, aber immer wieder auftaucht.
Häufig werden sichere Cipher verwendet, aber der Schlüssel dafür wird einfach statisch gewählt und in Klartext in der Anwendung hinterlegt. Mit sog. Hardcoded Keys bringt auch der sicherste Verschlüsselungsalgorithmus keinen Schutz.
Gelegentlich finden wir noch Applikationen, die selbst geschriebene Algorithmen implementieren. Im Normalfall sind diese in kurzer Zeit gebrochen. Für die Verschlüsselung sollte man sich auf bestehende Bibliotheken verlassen, die sichere Algorithmen zur Verfügung stellen.
Sicher verschlüsseln
Wie auch von Google für Android offiziell empfohlen, sollte für die lokale Speicherung von vertraulichen Daten Verschlüsselung eingesetzt werden.
Google bietet für die Verschlüsselung eigene, sichere Funktionen an, die verwendet werden sollten.
AES-256 oder AES-128 sollte als symmetrischer Verschlüsselungsalgorithmus verwendet werden. Dabei sollte der Schlüssel bei der ersten Verwendung der Applikation dynamisch und sicher generiert werden. Kryptografisch sichere Zufallswerte können mit SecureRandom erstellt werden und die passenden AES Schlüssel können mit dem KeyGenerator generiert werden.
Nun sind die Daten mit einem etablierten Verfahren und einem sicheren Schlüssel verschlüsselt. Wie auch in dem vorherigen Kapitel „Unsicher verschlüsseln“ besteht jetzt die Gefahr, dass der Schlüssel unsicher hinterlegt wird.
Der Schlüssel sollte jetzt in dem Android KeyStore hinterlegt werden. Hier ist dieser für den Normalfall ausreichend geschützt.
Ein Angreifer mit entsprechendem Zugriff auf das System hat zwar weiterhin die Möglichkeit, diesen Schlüssel zu entwenden, aber es wird deutlich erschwert.
Sicherer verschlüsseln
Auf Kosten der Benutzerfreundlichkeit kann ein weiterer Schritt hinzugefügt werden. Das setzt voraus, dass ein weiterer Schlüssel eingeführt wird, der nur dem Benutzer selbst bekannt ist.
Der Prozess bleibt identisch wie in dem Kapitel „Sicher verschlüsseln“, jedoch wird der Schlüssel, der in dem Android KeyStore hinterlegt wurde, verschlüsselt.
Ein Benutzer muss dann für die Verwendung der App einen Schlüssel eingeben (z.B. einen mehrstelligen PIN), mit dem der Schlüssel aus dem KeyStore entschlüsselt wird, der wiederum die eigentlichen Daten entschlüsselt.
Da aber mit entsprechendem Zugriff auf das System ein Angreifer die Daten bzw. den Schlüssel auch wieder auslesen kann, hilft dieses Verfahren nur, wenn der KeyStore und die verschlüsselten Daten entwendet werden. Selbst dann kann ein Angreifer noch versuchen, über Brute-Force-Attacken an den PIN des Benutzers zu kommen.
Fazit
Grundsätzlich kann man sagen, dass lokal hinterlegte Daten niemals vor einem Angreifer mit Vollzugriff auf das mobile Endgerät sicher sind. Jedoch bietet korrekt implementierte Verschlüsselung einen sinnvollen Schutz, der im Normalfall ausreichend ist.
Außer dem sicheren Verschlüsseln von lokalen Daten ist es essentiell, alle Benutzerdaten – auch verschlüsselt gespeicherte – vor der Weiterverarbeitung zu validieren.
Wenn nicht unbedingt notwendig, sollten Daten sicher auf dem Server hinterlegt werden. Die Kommunikation muss dann noch entsprechend mit TLS geschützt werden.
Weitere relevante Themen:
Die OWASP Top 10 für Mobile Applikationen