App-Signatur

Mit der App-Signatur können Entwickler den Autor der App identifizieren und ihre App aktualisieren, ohne komplizierte Oberflächen und Berechtigungen erstellen zu müssen. Jede App, die auf der Android-Plattform ausgeführt wird, muss vom Entwickler signiert sein. Apps, die ohne Signatur installiert werden sollen, werden entweder von Google Play oder vom Paketinstallationsprogramm auf dem Android-Gerät abgelehnt.

Bei Google Play stellt die App-Signatur eine Brücke zwischen dem Vertrauen von Google in den Entwickler und dem Vertrauen des Entwicklers in seine App dar. Entwickler wissen, dass ihre App unverändert auf dem Android-Gerät bereitgestellt wird. Außerdem können Entwickler für das Verhalten ihrer App zur Verantwortung gezogen werden.

Unter Android ist die App-Signatur der erste Schritt, um eine App in die Anwendungs-Sandbox zu verschieben. Im signierten App-Zertifikat wird festgelegt, welche Nutzer-ID mit welcher App verknüpft ist. Unterschiedliche Apps werden unter verschiedenen Nutzer-IDs ausgeführt. Durch die App-Signatur wird sichergestellt, dass eine Anwendung nur über ein klar definiertes IPC auf eine andere Anwendung zugreifen kann.

Wenn eine App (APK-Datei) auf einem Android-Gerät installiert wird, prüft der Paketmanager, ob das APK mit dem darin enthaltenen Zertifikat ordnungsgemäß signiert wurde. Wenn das Zertifikat (oder genauer der öffentliche Schlüssel im Zertifikat) mit dem Schlüssel übereinstimmt, der zum Signieren anderer APKs auf dem Gerät verwendet wird, kann das neue APK im Manifest angeben, dass es eine UID mit den anderen ähnlich signierten APKs teilt.

Apps können von einem Drittanbieter (OEM, Mobilfunkanbieter, alternativer Markt) signiert oder selbst signiert sein. Android bietet die Codesignatur mit selbst signierten Zertifikaten, die Entwickler ohne externe Unterstützung oder Berechtigung generieren können. Apps müssen nicht von einer zentralen Zertifizierungsstelle signiert werden. Android führt derzeit keine CA-Überprüfung für App-Zertifikate durch.

Apps können auch Sicherheitsberechtigungen auf Signaturschutzebene deklarieren, um den Zugriff nur auf Apps zu beschränken, die mit demselben Schlüssel signiert wurden, und dabei eindeutige UIDs und Anwendungs-Sandboxes beizubehalten. Mit der Funktion für die gemeinsame UID ist eine engere Beziehung zu einer freigegebenen Anwendungs-Sandbox zulässig. Dabei können zwei oder mehr Apps, die mit demselben Entwicklerschlüssel signiert sind, in ihrem Manifest eine gemeinsame UID deklarieren.

APK-Signaturschemas

Android unterstützt drei App-Signaturschemas:

Für maximale Kompatibilität sollten Apps mit allen Schemas signiert werden, zuerst mit v1, dann v2 und dann mit v3. Auf Geräten mit Android 7.0 und höher werden Apps, die mit Version 2 oder höher signiert sind, schneller installiert als solche, die nur mit Version 1 signiert sind. Ältere Android-Plattformen ignorieren Signaturen der Version 2 und höher. Daher müssen Apps V1-Signaturen enthalten.

JAR-Signatur (V1-Schema)

Die APK-Signatur ist seit Beginn ein Teil von Android. Es basiert auf einer signierten JAR-Datei. Weitere Informationen zur Verwendung dieses Schemas finden Sie in der Android Studio-Dokumentation unter App signieren.

V1-Signaturen schützen einige Teile des APK nicht, z. B. ZIP-Metadaten. Der APK-Verifier muss viele nicht vertrauenswürdige (noch nicht verifizierte) Datenstrukturen verarbeiten und dann Daten verwerfen, die nicht von den Signaturen abgedeckt sind. Das bietet eine beträchtliche Angriffsfläche. Außerdem muss der APK-Verifier alle komprimierten Einträge dekomprimieren, was mehr Zeit und Speicherplatz beansprucht. Um diese Probleme zu beheben, wurde mit Android 7.0 das APK-Signaturschema v2 eingeführt.

APK-Signaturschema v2 und v3 (Schema v2+)

Geräte mit Android 7.0 und höher unterstützen das APK-Signaturschema 2 (v2-Schema) und höher. Das V2-Schema wurde in Android 9 auf V3 aktualisiert, um zusätzliche Informationen in den Signaturblock aufzunehmen. Ansonsten funktioniert es aber genauso. Der Inhalt des APK wird gehasht und signiert. Anschließend wird der resultierende APK-Signaturblock in das APK eingefügt. Weitere Informationen zum Anwenden des V2+-Schemas auf eine App findest du unter APK-Signaturschema v2.

Bei der Validierung wird die APK-Datei gemäß dem v2- oder v2+-Schema als Blob behandelt und die Signatur wird für die gesamte Datei geprüft. Jede Änderung des APK, einschließlich Änderungen an den ZIP-Metadaten, macht die APK-Signatur ungültig. Diese Form der APK-Überprüfung ist wesentlich schneller und ermöglicht die Erkennung von mehr Klassen nicht autorisierter Änderungen.

Das neue Format ist abwärtskompatibel. APKs, die mit dem neuen Signaturformat signiert sind, können auf älteren Android-Geräten installiert werden, da die zusätzlichen Daten, die dem APK hinzugefügt wurden, einfach ignoriert werden. Voraussetzung ist, dass diese APKs auch mit der Version 1 signiert sind.

Überprüfung der APK-Signatur

Abbildung 1. Überprüfung der APK-Signatur

Der Hashwert der gesamten Datei des APK wird anhand der im APK-Signaturblock gespeicherten Signatur der Version 2 oder höher überprüft. Der Hash deckt alles ab, mit Ausnahme des APK-Signaturblocks, der die v2+-Signatur enthält. Jede Änderung am APK außerhalb des APK-Signaturblocks macht die V2- oder höher-Signatur des APK ungültig. APKs mit entfernter v2-Signatur werden ebenfalls abgelehnt, da ihre v1-Signatur angibt, dass das APK v2-signiert war. Daher verweigern Android 7.0 und höher die Überprüfung von APKs mit ihren v1-Signaturen.

Weitere Informationen zur Überprüfung der APK-Signatur finden Sie im Abschnitt „Überprüfung“ des APK-Signaturschemas v2.