Datenspeicher

Das häufigste Sicherheitsrisiko für eine Anwendung auf Android besteht darin, ob die Daten, die Sie auf dem Gerät speichern, für andere Apps zugänglich sind. Es gibt grundsätzlich drei Möglichkeiten, Daten auf dem Gerät zu speichern:

Interne Speicher
Externer Speicher
Anbieter von Inhalten

In den folgenden Abschnitten werden die mit jedem Ansatz verbundenen Sicherheitsprobleme beschrieben.


Interner Speicher
Standardmäßig kann nur Ihre App auf Dateien zugreifen, die Sie im internen Speicher erstellen. Android implementiert diesen Schutz und er ist für die meisten Anwendungen ausreichend.

Vermeiden Sie die veralteten Modi MODE_WORLD_WRITEABLE und MODE_WORLD_READABLE für IPC-Dateien. Sie bieten keine Möglichkeit, den Datenzugriff auf bestimmte Anwendungen zu beschränken, und sie bieten keine Kontrolle über das Datenformat. Wenn Sie Ihre Daten mit anderen App-Prozessen teilen möchten, sollten Sie stattdessen die Verwendung eines Inhaltsanbieters in Betracht ziehen, der Lese- und Schreibberechtigungen für andere Apps bereitstellt und von Fall zu Fall dynamische Berechtigungserteilungen vornehmen kann.

Um sensible Daten zusätzlich zu schützen, können Sie lokale Dateien mithilfe der Sicherheitsbibliothek verschlüsseln. Diese Maßnahme kann Schutz für ein verlorenes Gerät ohne Dateisystemverschlüsselung bieten.


Externer Speicher
Dateien, die auf externen Speichergeräten wie SD-Karten erstellt wurden, sind weltweit lesbar und beschreibbar. Da der externe Speicher vom Benutzer entfernt und auch von jeder Anwendung geändert werden kann, sollten Sie nur nicht vertrauliche Informationen im externen Speicher speichern.

Um Dateien auf externem Speicher sicherer zu lesen und zu schreiben, sollten Sie die Verwendung der Security-Bibliothek in Betracht ziehen, die die EncryptedFile-Klasse bereitstellt.

Führen Sie beim Umgang mit Daten aus externen Speichern eine Eingabevalidierung durch, wie Sie es auch mit Daten aus einer nicht vertrauenswürdigen Quelle tun würden. Speichern Sie ausführbare Dateien oder Klassendateien vor dem dynamischen Laden nicht auf einem externen Speicher. Wenn Ihre App ausführbare Dateien vom externen Speicher abruft, stellen Sie sicher, dass die Dateien vor dem dynamischen Laden signiert und kryptografisch überprüft werden.


Anbieter von Inhalten
Inhaltsanbieter bieten einen strukturierten Speichermechanismus, der auf Ihre eigene Anwendung beschränkt oder exportiert werden kann, um den Zugriff durch andere Anwendungen zu ermöglichen. Wenn Sie nicht beabsichtigen, anderen Anwendungen Zugriff auf Ihren ContentProvider zu gewähren, markieren Sie ihn im Anwendungsmanifest als android:exported=false. Andernfalls setzen Sie das Attribut „android:exported“ auf „true“, um anderen Apps den Zugriff auf die gespeicherten Daten zu ermöglichen.

Wenn Sie einen ContentProvider erstellen, der zur Verwendung durch andere Anwendungen exportiert wird, können Sie eine einzelne Berechtigung zum Lesen und Schreiben angeben oder Sie können unterschiedliche Berechtigungen zum Lesen und Schreiben angeben. Beschränken Sie Ihre Berechtigungen auf diejenigen, die zur Ausführung der jeweiligen Aufgabe erforderlich sind. Bedenken Sie, dass es in der Regel einfacher ist, Berechtigungen später hinzuzufügen, um neue Funktionen verfügbar zu machen, als sie zu entziehen und bestehende Benutzer zu beeinträchtigen.

Wenn Sie einen Inhaltsanbieter verwenden, um Daten nur zwischen Ihren eigenen Apps auszutauschen, empfehlen wir die Verwendung des Attributs android:protectionLevel, das auf Signaturschutz eingestellt ist. Signaturberechtigungen erfordern keine Benutzerbestätigung und bieten daher eine bessere Benutzererfahrung und einen kontrollierteren Zugriff auf die Daten des Inhaltsanbieters, wenn die Apps, die auf die Daten zugreifen, mit demselben Schlüssel signiert sind.

Inhaltsanbieter können auch einen detaillierteren Zugriff bereitstellen, indem sie das Attribut android:grantUriPermissions deklarieren und die Flags FLAG_GRANT_READ_URI_PERMISSION und FLAG_GRANT_WRITE_URI_PERMISSION im Intent-Objekt verwenden, das die Komponente aktiviert. Der Umfang dieser Berechtigungen kann durch das Element <grant-uri-permission> weiter eingeschränkt werden.

Verwenden Sie beim Zugriff auf einen Inhaltsanbieter parametrisierte Abfragemethoden wie query(), update() und delete(), um eine potenzielle SQL-Injection aus nicht vertrauenswürdigen Quellen zu vermeiden. Beachten Sie, dass die Verwendung parametrisierter Methoden nicht ausreicht, wenn das Auswahlargument durch die Verkettung von Benutzerdaten vor der Übermittlung an die Methode erstellt wird.

Haben Sie keine falsche Sicherheit hinsichtlich der Schreibberechtigung. Die Schreibberechtigung ermöglicht SQL-Anweisungen, die es ermöglichen, einige Daten mithilfe kreativer WHERE-Klauseln zu bestätigen und die Ergebnisse zu analysieren. Beispielsweise könnte ein Angreifer nach einer bestimmten Telefonnummer in einem Anrufprotokoll suchen, indem er eine Zeile nur dann ändert, wenn diese Telefonnummer bereits vorhanden ist. Wenn die Daten des Inhaltsanbieters eine vorhersehbare Struktur haben, kann die Schreibberechtigung dem Bereitstellen von Lesen und Schreiben gleichkommen.