Best Practices zur App-Sicherheit

Dieser Abschnitt enthält Empfehlungen zur Sicherheit von Apps auf Android-Geräten.

Quellcodeüberprüfung

Bei der Überprüfung des Quellcodes können eine Vielzahl von Sicherheitsproblemen erkannt werden, einschließlich der in diesem Dokument aufgeführten. Android empfiehlt sowohl manuelle als auch automatisierte Quellcodeüberprüfungen.

  • Beachten Sie bei der Durchführung von Prüfungen umfassende Sicherheitsrichtlinien, um eine Abdeckung zu gewährleisten. Verwenden Sie relevante interne oder externe Standards, um für einheitliche und vollständige Prüfungen zu sorgen.
  • Führen Sie einen Linter wie den Android Studio-Linter auf dem gesamten App-Code mit dem Android SDK aus und beheben Sie alle erkannten Probleme.
  • Analysieren Sie den nativen Code mit einem automatisierten Tool, das Probleme mit der Arbeitsspeicherverwaltung erkennen kann, z. B. Überläufe des Zwischenspeichers und Off-by-One-Fehler.
  • Das Android-Buildsystem unterstützt viele der LLVM-Sanitizer, z. B. AddressSanitizer und UndefinedBehaviorSanitizer, die für die Laufzeitanalyse von speicherbezogenen Problemen verwendet werden können. In Kombination mit Fuzzing, das in Android über libFuzzer unterstützt wird, können Sanitizer ungewöhnliche Grenzfälle aufdecken, die einer weiteren Untersuchung bedürfen.
  • Ein sachkundiger Sicherheitsprüfer sollte Code mit höherem Risiko prüfen, z. B. Code für Kryptografie, Zahlungsabwicklung und Verarbeitung personenidentifizierbarer Informationen.

Automatisierte Tests

Automatisierte Tests können helfen, eine Vielzahl von Sicherheitsproblemen zu erkennen, und sollten regelmäßig durchgeführt werden.

  • Führen Sie während des gesamten Entwicklungsprozesses regelmäßig die neueste Version von CTS aus, um Probleme frühzeitig zu erkennen und die Zeit bis zur Fehlerbehebung zu verkürzen. Android verwendet CTS als Teil der Continuous Integration in unserem automatisierten Build-Prozess, der mehrmals täglich ausgeführt wird.
  • Automatisieren Sie Sicherheitstests von Schnittstellen, einschließlich Tests mit fehlerhaften Eingaben (Fuzz-Tests). Das Build-System von Android unterstützt libFuzzer zum Schreiben von Fuzz-Tests.

Scannen auf Sicherheitslücken

Mit einem Sicherheitslücken-Scan können Sie dafür sorgen, dass vorinstallierte Apps keine bekannten Sicherheitslücken aufweisen. Durch die erweiterte Erkennung können Sie den Zeitaufwand und die Kosten für die Behebung dieser Sicherheitslücken reduzieren und Risiken für Nutzer und Geräte verhindern.

  • Scannen Sie alle vorinstallierten Apps mit einem branchenweit anerkannten Tool zum Scannen von App-Sicherheitslücken und beheben Sie erkannte Sicherheitslücken.

Potenziell schädliche Apps

Achten Sie darauf, dass die auf Ihrem Gerät vorinstallierten Apps keine potenziell schädlichen Apps (Potentially Harmful Applications, PHAs) sind. Sie sind für das Verhalten aller Apps verantwortlich, die auf Ihren Geräten installiert sind. Scannen Sie vor der Markteinführung des Geräts alle vorinstallierten Apps auf Sicherheitslücken.

Weitere Informationen zu schädlichen Apps und dazu, wie Google sie im Play Store bekämpft, finden Sie in der Google Play Protect-Entwicklerleitfaden.

App-Installation und Berechtigungen

Zu viele Berechtigungen für vorinstallierte Apps können ein Sicherheitsrisiko darstellen. Beschränken Sie vorinstallierte Apps auf die erforderliche Mindestanzahl von Berechtigungen und sorgen Sie dafür, dass sie keinen Zugriff auf unnötige Berechtigungen oder Rechte haben. App-Berechtigungen werden in der AndroidManifest.xml beschrieben.

  • Gewähren Sie vorinstallierten Apps keine unnötigen Berechtigungen oder Privilegien. Prüfen Sie Apps mit Systemberechtigungen gründlich, da sie sehr sensible Berechtigungen haben können.
  • Alle angeforderten Berechtigungen müssen für die Funktion der jeweiligen App relevant und erforderlich sein.
  • Sorgen Sie dafür, dass für alle vorinstallierten Apps, die die Berechtigung INSTALL_PACKAGES verwenden, eine Offenlegung für Nutzer vorhanden ist.
  • Der Entwickler muss vertraglich verpflichtet sein, keine Apps als UID 0 zu installieren.
  • Prüfen Sie die im Manifest deklarierten Berechtigungen aller Apps, die über das Netzwerk des Entwicklers installiert werden sollen.
  • Der Entwickler muss vertraglich verpflichtet sein, alle Download-URLs von Apps mit automatischer Aktualisierung und Installation mit der Google Safe Browsing API zu scannen, bevor Apps auf dem Gerät bereitgestellt werden.

App-Signatur

App-Signaturen spielen eine wichtige Rolle bei der Gerätesicherheit und werden für Berechtigungsprüfungen und Softwareupdates verwendet. Bei der Auswahl eines Schlüssels für die Signatur von Apps ist es wichtig zu berücksichtigen, ob eine App nur auf einem einzelnen Gerät oder auf mehreren Geräten verfügbar ist.

  • Achten Sie darauf, dass Apps nicht mit einem öffentlich bekannten Schlüssel signiert sind, z. B. dem AOSP-Entwicklerschlüssel.
  • Achten Sie darauf, dass die zum Signieren von Apps verwendeten Schlüssel gemäß den branchenüblichen Praktiken für den Umgang mit vertraulichen Schlüsseln verwaltet werden, einschließlich eines Hardware Security Modules (HSM), das eingeschränkten, auditierbaren Zugriff bietet.
  • Achten Sie darauf, dass Apps nicht mit dem Plattformschlüssel signiert sind. Dadurch erhält die App Zugriff auf Berechtigungen für Plattformsignaturen, die sehr leistungsfähig sind und nur von Komponenten des Betriebssystems verwendet werden sollen. System-Apps sollten Berechtigungen mit erhöhten Zugriffsrechten verwenden.
  • Achten Sie darauf, dass Apps mit demselben Paketnamen nicht mit unterschiedlichen Schlüsseln signiert sind. Das tritt häufig beim Erstellen einer App für verschiedene Geräte auf, insbesondere wenn der Plattformschlüssel verwendet wird. Wenn die App geräteunabhängig ist, verwenden Sie auf allen Geräten denselben Schlüssel. Wenn die App gerätespezifisch ist, erstellen Sie eindeutige Paketnamen pro Gerät und Schlüssel.

Apps und Prozesse isolieren

Das Sandboxing-Modell von Android bietet bei richtiger Verwendung zusätzliche Sicherheit für Apps und Prozesse.

Root-Prozesse isolieren

Root-Prozesse sind das häufigste Ziel von Angriffen auf die Rechteausweitung. Durch die Reduzierung der Anzahl der Root-Prozesse wird das Risiko der Rechteausweitung verringert.

  • Achten Sie darauf, dass auf den Geräten der erforderliche Mindestcode als Root ausgeführt wird. Verwenden Sie nach Möglichkeit einen regulären Android-Prozess anstelle eines Root-Prozesses. Wenn ein Prozess auf einem Gerät als Root ausgeführt werden muss, dokumentieren Sie den Prozess in einer AOSP-Funktionsanfrage, damit er öffentlich geprüft werden kann.
  • Wenn möglich, sollte Root-Code von nicht vertrauenswürdigen Daten isoliert werden und der Zugriff über die Inter-Process-Kommunikation (IPC) erfolgen. Sie können beispielsweise die Root-Funktionen auf einen kleinen Dienst beschränken, der über Binder zugänglich ist, und den Dienst mit einer Signaturberechtigung für eine App mit wenigen oder keinen Berechtigungen für die Verarbeitung von Netzwerkverkehr freigeben.
  • Root-Prozesse dürfen nicht auf einem Netzwerk-Socket warten.
  • Root-Prozesse dürfen keine allgemeine Laufzeitumgebung wie eine Java-VM enthalten.

System-Apps isolieren

Vorinstallierte Apps sollten im Allgemeinen nicht mit der eindeutigen Kennung (UID) des freigegebenen Systems ausgeführt werden. Wenn eine App die freigegebene UID des Systems oder eines anderen privilegierten Dienstes (z.B. Smartphone) verwenden muss, darf sie keine Dienste, Broadcastempfänger oder Inhaltsanbieter exportieren, auf die von Nutzern installierte Drittanbieter-Apps zugreifen können.

  • Achten Sie darauf, dass auf den Geräten der erforderliche Mindestcode als System ausgeführt wird. Verwenden Sie nach Möglichkeit einen Android-Prozess mit einer eigenen UID, anstatt die System-UID wiederzuverwenden.
  • Systemcode sollte nach Möglichkeit von nicht vertrauenswürdigen Daten isoliert und die IPC nur für andere vertrauenswürdige Prozesse freigegeben werden.
  • Systemprozesse dürfen keinen Netzwerk-Socket überwachen. Dies ist eine CTS-Anforderung.

Prozesse isolieren

Die Android-Anwendungs-Sandbox bietet Apps eine gewisse Isolation von anderen Prozessen im System, einschließlich Root-Prozessen und Debuggern. Sofern das Debuggen nicht ausdrücklich von der App und dem Nutzer aktiviert wurde, sollte keine App gegen diese Erwartung verstoßen.

  • Achten Sie darauf, dass Root-Prozesse nicht auf Daten in einzelnen App-Datenordnern zugreifen, es sei denn, Sie verwenden eine dokumentierte Android-Debugging-Methode.
  • Achten Sie darauf, dass Root-Prozesse nicht auf den Arbeitsspeicher von Apps zugreifen, es sei denn, Sie verwenden eine dokumentierte Android-Debugging-Methode.
  • Achten Sie darauf, dass auf den Geräten keine Apps installiert sind, die auf Daten oder den Arbeitsspeicher anderer Apps oder Prozesse zugreifen.