Anwendungssignierung

Die Anwendungssignierung ermöglicht es Entwicklern, den Autor der Anwendung zu identifizieren und ihre Anwendung zu aktualisieren, ohne komplizierte Schnittstellen und Berechtigungen zu erstellen. Jede Anwendung, die auf der Android-Plattform ausgeführt wird, muss vom Entwickler signiert werden . Anwendungen, die versuchen, ohne Signierung zu installieren, werden entweder von Google Play oder dem Paketinstallationsprogramm auf dem Android-Gerät abgelehnt.

Bei Google Play überbrückt die Anwendungssignierung das Vertrauen, das Google in den Entwickler hat, und das Vertrauen, das der Entwickler in seine Anwendung hat. Entwickler wissen, dass ihre Anwendung unverändert für das Android-Gerät bereitgestellt wird; und Entwickler können für das Verhalten ihrer Anwendung zur Rechenschaft gezogen werden.

Unter Android ist die Anwendungssignierung der erste Schritt, um eine Anwendung in ihrer Anwendungs-Sandbox zu platzieren. Das signierte Anwendungszertifikat definiert, welche Benutzer-ID welcher Anwendung zugeordnet ist; verschiedene Anwendungen laufen unter verschiedenen Benutzer-IDs. Die Anwendungssignierung stellt sicher, dass eine Anwendung nur über einen klar definierten IPC auf eine andere Anwendung zugreifen kann.

Wenn eine Anwendung (APK-Datei) auf einem Android-Gerät installiert wird, überprüft der Paket-Manager, ob das APK ordnungsgemäß mit dem in diesem APK enthaltenen Zertifikat signiert wurde. Wenn das Zertifikat (oder genauer gesagt der öffentliche Schlüssel im Zertifikat) mit dem Schlüssel übereinstimmt, der zum Signieren eines anderen APK auf dem Gerät verwendet wird, hat das neue APK die Möglichkeit, im Manifest anzugeben, dass es auf ähnliche Weise eine UID mit dem anderen teilt -signierte APKs.

Anwendungen können von einem Drittanbieter (OEM, Betreiber, alternativer Markt) oder selbst signiert werden. Android bietet Codesignierung mit selbstsignierten Zertifikaten, die Entwickler ohne externe Hilfe oder Erlaubnis generieren können. Anträge müssen nicht von einer zentralen Stelle unterzeichnet werden. Android führt derzeit keine CA-Überprüfung für Anwendungszertifikate durch.

Anwendungen können auch Sicherheitsberechtigungen auf der Signaturschutzebene deklarieren, wodurch der Zugriff nur auf Anwendungen beschränkt wird, die mit demselben Schlüssel signiert sind, während unterschiedliche UIDs und Anwendungs-Sandboxen beibehalten werden. Eine engere Beziehung zu einer gemeinsam genutzten Anwendungs-Sandbox ist mithilfe der Funktion „gemeinsam genutzte UID “ zulässig, bei der zwei oder mehr mit demselben Entwicklerschlüssel signierte Anwendungen eine gemeinsam genutzte UID in ihrem Manifest deklarieren können.

APK-Signaturschemata

Android unterstützt drei Anwendungssignaturschemata:

Für maximale Kompatibilität signieren Sie Anwendungen mit allen Schemas, zuerst mit v1, dann mit v2 und dann mit v3. Android 7.0+ und neuere Geräte installieren Apps, die mit v2+-Schemata signiert sind, schneller als solche, die nur mit v1-Schema signiert sind. Ältere Android-Plattformen ignorieren v2+-Signaturen und benötigen daher Apps, die v1-Signaturen enthalten.

JAR-Signierung (v1-Schema)

Die APK-Signierung war von Anfang an ein Teil von Android. Es basiert auf signiertem JAR . Einzelheiten zur Verwendung dieses Schemas finden Sie in der Android Studio-Dokumentation zum Signieren Ihrer App .

v1-Signaturen schützen einige Teile des APK nicht, z. B. ZIP-Metadaten. Der APK-Verifizierer muss viele nicht vertrauenswürdige (noch nicht verifizierte) Datenstrukturen verarbeiten und dann Daten verwerfen, die nicht von den Signaturen abgedeckt sind. Dies bietet eine beträchtliche Angriffsfläche. Darüber hinaus muss der APK-Verifizierer alle komprimierten Einträge dekomprimieren, was mehr Zeit und Speicherplatz verbraucht. Um diese Probleme zu lösen, hat Android 7.0 das APK-Signaturschema v2 eingeführt.

APK-Signaturschema v2 & v3 (v2+-Schema)

Geräte mit Android 7.0 und höher unterstützen das APK-Signaturschema v2 (v2-Schema) und höher. (Das v2-Schema wurde in Android 9 auf v3 aktualisiert, um zusätzliche Informationen in den Signaturblock aufzunehmen, funktioniert aber ansonsten genauso.) Der Inhalt des APK wird gehasht und signiert, dann wird der resultierende APK-Signaturblock in das APK eingefügt. Einzelheiten zum Anwenden des v2+-Schemas auf eine App finden Sie unter APK-Signaturschema v2 .

Während der Validierung behandelt das v2+-Schema die APK-Datei als Blob und führt eine Signaturprüfung für die gesamte Datei durch. Jede Änderung am APK, einschließlich Änderungen an den ZIP-Metadaten, macht die APK-Signatur ungültig. Diese Form der APK-Verifizierung ist wesentlich schneller und ermöglicht die Erkennung von mehr Klassen nicht autorisierter Änderungen.

Das neue Format ist abwärtskompatibel, sodass mit dem neuen Signaturformat signierte APKs auf älteren Android-Geräten installiert werden können (die einfach die zusätzlichen Daten ignorieren, die dem APK hinzugefügt wurden), solange diese APKs auch v1-signiert sind.

APK-Signaturüberprüfungsprozess

Abbildung 1. Überprüfungsprozess der APK-Signatur

Der gesamte Datei-Hash des APK wird anhand der v2+-Signatur verifiziert, die im APK-Signaturblock gespeichert ist. Der Hash deckt alles ab, außer dem APK-Signaturblock, der die v2+-Signatur enthält. Jede Änderung am APK außerhalb des APK-Signaturblocks macht die v2+-Signatur des APK ungültig. APKs mit entfernter v2+-Signatur werden ebenfalls abgelehnt, da ihre v1-Signatur angibt, dass das APK v2-signiert war, was dazu führt, dass Android 7.0 und höher die Verifizierung von APKs mit ihren v1-Signaturen verweigert.

Einzelheiten zum Verifizierungsprozess der APK-Signatur finden Sie im Abschnitt „Verifizierung“ des APK-Signaturschemas v2.