Sicherheit durch dynamisch geladenen Code
Wir raten dringend davon ab, Code von außerhalb Ihrer Anwendungs-APK zu laden. Dies erhöht die Wahrscheinlichkeit einer Anwendungskompromittierung aufgrund von Code-Injection oder Code-Manipulation erheblich. Außerdem erhöht es die Komplexität der Versionsverwaltung und des Anwendungstests – und kann es unmöglich machen, das Verhalten einer Anwendung zu überprüfen, sodass es in einigen Umgebungen möglicherweise verboten ist.

Wenn Ihre Anwendung Code dynamisch lädt, müssen Sie vor allem bedenken, dass der dynamisch geladene Code mit denselben Sicherheitsberechtigungen wie das Anwendungs-APK ausgeführt wird. Der Benutzer trifft die Entscheidung, Ihre Anwendung auf der Grundlage Ihrer Identität zu installieren, und der Benutzer erwartet, dass Sie jeglichen Code bereitstellen, der innerhalb der Anwendung ausgeführt wird, einschließlich Code, der dynamisch geladen wird.

Viele Anwendungen versuchen, Code von unsicheren Speicherorten zu laden, z. B. über unverschlüsselte Protokolle aus dem Netzwerk oder von unbeschreibbaren Speicherorten wie externen Speichern. An diesen Standorten könnte jemand im Netzwerk den Inhalt während der Übertragung oder eine andere Anwendung auf dem Gerät eines Benutzers ändern, um den Inhalt auf dem Gerät zu ändern. Andererseits können Module, die direkt in Ihrem APK enthalten sind, nicht von anderen Anwendungen geändert werden. Dies gilt unabhängig davon, ob es sich bei dem Code um eine native Bibliothek oder eine Klasse handelt, die mit DexClassLoader geladen wird.


Sicherheit in einer virtuellen Maschine
Dalvik ist die virtuelle Laufzeitmaschine (VM) von Android. Dalvik wurde speziell für Android entwickelt, aber viele der Bedenken hinsichtlich des sicheren Codes in anderen virtuellen Maschinen gelten auch für Android. Im Allgemeinen müssen Sie sich nicht um Sicherheitsprobleme im Zusammenhang mit der virtuellen Maschine kümmern. Ihre Anwendung wird in einer sicheren Sandbox-Umgebung ausgeführt, sodass andere Prozesse im System nicht auf Ihren Code oder Ihre privaten Daten zugreifen können.

Wenn Sie mehr über die Sicherheit virtueller Maschinen erfahren möchten, machen Sie sich mit vorhandener Literatur zu diesem Thema vertraut. Zwei der beliebtesten Ressourcen sind:

Java sichern
Verwandte Projekte von Drittanbietern

Dieses Dokument konzentriert sich auf Bereiche, die Android-spezifisch sind oder sich von anderen VM-Umgebungen unterscheiden. Für Entwickler, die Erfahrung mit der VM-Programmierung in anderen Umgebungen haben, gibt es zwei allgemeine Probleme, die sich beim Schreiben von Apps für Android unterscheiden können:

Einige virtuelle Maschinen, wie die JVM- oder .NET-Laufzeitumgebung, fungieren als Sicherheitsgrenze und isolieren Code von den zugrunde liegenden Betriebssystemfunktionen. Unter Android stellt die Dalvik-VM keine Sicherheitsgrenze dar – die Anwendungssandbox wird auf Betriebssystemebene implementiert, sodass Dalvik ohne Sicherheitseinschränkungen mit nativem Code in derselben Anwendung zusammenarbeiten kann.
Angesichts des begrenzten Speicherplatzes auf Mobilgeräten ist es für Entwickler üblich, modulare Anwendungen zu erstellen und dynamisches Laden von Klassen zu verwenden. Berücksichtigen Sie dabei sowohl die Quelle, aus der Sie Ihre Anwendungslogik abrufen, als auch den Ort, an dem Sie sie lokal speichern. Verwenden Sie kein dynamisches Laden von Klassen aus nicht verifizierten Quellen, z. B. ungesicherten Netzwerkquellen oder externem Speicher, da dieser Code möglicherweise so geändert wird, dass er schädliches Verhalten enthält.


Sicherheit im nativen Code
Im Allgemeinen empfehlen wir die Verwendung des Android SDK für die Anwendungsentwicklung, anstatt nativen Code mit dem Android NDK zu verwenden. Mit nativem Code erstellte Anwendungen sind komplexer, weniger portierbar und weisen eher häufige Speicherbeschädigungsfehler wie Pufferüberläufe auf.

Android basiert auf dem Linux-Kernel. Wenn Sie nativen Code verwenden, ist es besonders hilfreich, mit den Best Practices für die Linux-Entwicklungssicherheit vertraut zu sein. Linux-Sicherheitspraktiken gehen über den Rahmen dieses Dokuments hinaus, aber eine der beliebtesten Ressourcen ist Secure Programming HOWTO – Creating Secure Software.

Ein wichtiger Unterschied zwischen Android und den meisten Linux-Umgebungen ist die Anwendungs-Sandbox. Unter Android werden alle Anwendungen in der Anwendungssandbox ausgeführt, auch solche, die mit nativem Code geschrieben wurden. Eine gute Möglichkeit für Entwickler, die mit Linux vertraut sind, darüber nachzudenken, ist zu wissen, dass jeder Anwendung eine eindeutige Benutzerkennung (UID) mit sehr eingeschränkten Berechtigungen zugewiesen wird. Dies wird im Android-Sicherheitsüberblick ausführlicher erläutert. Sie sollten mit den Anwendungsberechtigungen vertraut sein, auch wenn Sie nativen Code verwenden.