Eingabevalidierung
Unzureichende Eingabevalidierung ist eines der häufigsten Sicherheitsprobleme bei Anwendungen, unabhängig davon, auf welcher Plattform sie ausgeführt werden. Android verfügt über Gegenmaßnahmen auf Plattformebene, die die Gefährdung von Anwendungen durch Eingabevalidierungsprobleme verringern. Wir empfehlen Ihnen, diese Funktionen nach Möglichkeit zu verwenden. Außerdem empfehlen wir die Verwendung typsicherer Sprachen, um die Wahrscheinlichkeit von Problemen bei der Eingabevalidierung zu verringern.
Wenn Sie nativen Code verwenden, können alle aus Dateien gelesenen, über das Netzwerk oder von einem IPC empfangenen Daten möglicherweise ein Sicherheitsrisiko darstellen. Die häufigsten Probleme sind Pufferüberläufe, „Use after free“- und „Off-by-One“-Fehler. Android bietet eine Reihe von Technologien wie ASLR und Data Execution Prevention (DEP), die die Ausnutzbarkeit dieser Fehler verringern, das zugrunde liegende Problem jedoch nicht lösen. Sie können diese Schwachstellen verhindern, indem Sie sorgfältig mit Zeigern umgehen und Puffer verwalten.
Dynamische, stringbasierte Sprachen wie JavaScript und SQL unterliegen ebenfalls Problemen bei der Eingabevalidierung aufgrund von Escape-Zeichen und Script-Injection.
Wenn Sie Daten in Abfragen verwenden, die an eine SQL-Datenbank oder einen Inhaltsanbieter gesendet werden, kann die SQL-Injection ein Problem darstellen. Die beste Verteidigung besteht darin, parametrisierte Abfragen zu verwenden, wie im Abschnitt über Inhaltsanbieter erläutert. Durch die Beschränkung der Berechtigungen auf Nur-Lesen oder Nur-Schreiben kann auch das Schadenspotenzial im Zusammenhang mit der SQL-Injection verringert werden.
Wenn Sie die in diesem Abschnitt beschriebenen Sicherheitsfunktionen nicht nutzen können, stellen Sie sicher, dass Sie gut strukturierte Datenformate verwenden und überprüfen Sie, ob die Daten dem erwarteten Format entsprechen. Während das Blockieren bestimmter Zeichen oder das Durchführen von Zeichenersetzungen eine wirksame Strategie sein kann, sind diese Techniken in der Praxis fehleranfällig und wir empfehlen, sie nach Möglichkeit zu vermeiden.
Benutzerdaten
Im Allgemeinen besteht der beste Ansatz für die Sicherheit von Benutzerdaten darin, die Verwendung von APIs zu minimieren, die auf sensible oder persönliche Benutzerdaten zugreifen. Wenn Sie Zugriff auf Benutzerdaten haben, vermeiden Sie nach Möglichkeit die Speicherung oder Übermittlung dieser Daten. Überlegen Sie, ob Ihre Anwendungslogik mithilfe eines Hashs oder einer nicht umkehrbaren Form der Daten implementiert werden kann. Beispielsweise könnte Ihre Anwendung den Hash einer E-Mail-Adresse als Primärschlüssel verwenden, um die Übertragung oder Speicherung der E-Mail-Adresse zu vermeiden. Dies verringert die Wahrscheinlichkeit, dass Daten versehentlich offengelegt werden, und verringert auch die Wahrscheinlichkeit, dass Angreifer versuchen, Ihre Anwendung auszunutzen.
Wenn Ihre Anwendung auf persönliche Informationen wie Passwörter oder Benutzernamen zugreift, beachten Sie, dass einige Gerichtsbarkeiten möglicherweise die Bereitstellung einer Datenschutzrichtlinie erfordern, in der Ihre Verwendung und Speicherung dieser Daten erläutert wird. Auch die Befolgung der bewährten Sicherheitspraxis zur Minimierung des Zugriffs auf Benutzerdaten kann die Compliance vereinfachen.
Überlegen Sie außerdem, ob Ihre Anwendung unbeabsichtigt personenbezogene Daten an andere Parteien weitergeben könnte, z. B. Komponenten Dritter für Werbung oder Dienste Dritter, die von Ihrer Anwendung genutzt werden. Wenn Sie nicht wissen, warum für eine Komponente oder einen Dienst personenbezogene Daten erforderlich sind, geben Sie diese nicht an. Im Allgemeinen verringert die Einschränkung des Zugriffs auf personenbezogene Daten durch Ihre Anwendung das Potenzial für Probleme in diesem Bereich.
Wenn Ihre App Zugriff auf vertrauliche Daten erfordert, prüfen Sie, ob Sie diese an einen Server übertragen müssen oder ob Sie den Vorgang auf dem Client ausführen können. Erwägen Sie die Ausführung von Code mit sensiblen Daten auf dem Client, um die Übertragung von Benutzerdaten zu vermeiden. Stellen Sie außerdem sicher, dass Sie Benutzerdaten nicht versehentlich anderen Anwendungen auf dem Gerät über zu freizügige IPCs, von allen Benutzern beschreibbare Dateien oder Netzwerk-Sockets zugänglich machen. Ein übermäßig freizügiger IPC ist ein Sonderfall der Offenlegung von durch Berechtigungen geschützten Daten, der im Abschnitt „Berechtigungsanfragen“ erläutert wird.
Wenn ein Globally Unique Identifier (GUID) erforderlich ist, erstellen Sie eine große, eindeutige Nummer und speichern Sie diese. Verwenden Sie keine Telefonkennungen wie Telefonnummer oder IMEI, die möglicherweise mit persönlichen Informationen verknüpft sind. Dieses Thema wird auf der Seite über Best Practices für eindeutige Bezeichner ausführlicher behandelt.
Seien Sie vorsichtig, wenn Sie in Protokolle auf dem Gerät schreiben. Unter Android sind Protokolle eine gemeinsam genutzte Ressource und stehen einer Anwendung mit der READ_LOGS-Berechtigung zur Verfügung. Auch wenn die Protokolldaten des Telefons temporär sind und beim Neustart gelöscht werden, kann eine unsachgemäße Protokollierung von Benutzerinformationen dazu führen, dass Benutzerdaten unbeabsichtigt an andere Anwendungen weitergegeben werden. Beschränken Sie nicht nur die Protokollierung personenbezogener Daten, sondern beschränken Sie auch die Protokollnutzung in Produktionsanwendungen. Um dies einfach zu implementieren, verwenden Sie Debug-Flags und benutzerdefinierte Protokollklassen mit einfach konfigurierbaren Protokollierungsstufen.