APK-Signaturschema v3.1

Überblick

Android 13 unterstützt APK Signature Scheme v3.1, eine Verbesserung gegenüber dem bestehenden APK Signature Scheme v3 . Das v3.1-Schema behebt einige der bekannten Probleme mit APK Signature Scheme v3 bezüglich der Rotation. Insbesondere unterstützt das v3.1-Signaturschema das SDK-Versions-Targeting, was eine Rotation ermöglicht, um auf eine spätere Version der Plattform abzuzielen.

Das Signaturschema der Version 3.1 verwendet eine Block-ID, die auf Android 12 oder niedriger nicht erkannt wird. Daher wendet die Plattform das folgende Unterzeichnerverhalten an:

  • Geräte, auf denen Android 13 oder höher ausgeführt wird, verwenden den rotierten Signierer im v3.1-Block.
  • Geräte, auf denen ältere Android-Versionen ausgeführt werden, ignorieren den rotierten Unterzeichner und verwenden stattdessen den ursprünglichen Unterzeichner im v3-Block.

Für Apps, deren Signaturschlüssel noch nicht gewechselt wurde, sind keine weiteren Maßnahmen erforderlich. Wenn sich diese Apps für eine Rotation entscheiden, wendet das System standardmäßig das Signaturschema der Version 3.1 an.

v3.1-Signaturblock

Der Signaturblock v3.1 hat denselben Inhalt wie der Signaturblock v3, aber mit der neuen Block-ID werden diese Signaturen nur auf Geräten mit Android 13 und höher erkannt. Dadurch können Apps ihre Signaturschlüssel sicher rotieren, ohne sich um APKs mit mehreren Zielen kümmern zu müssen, da der ursprüngliche Signierer zum Signieren des APK im v3-Signaturblock und der rotierte Unterzeichner im v3.1-Signaturblock verwendet werden kann. Dadurch kann die Plattform auch alle vorhandenen Verifizierungscodes für den v3-Signaturblock wiederverwenden, wenn sie eine v3.1-Signatur verifiziert.

Standardmäßig verwendet die apksig Bibliothek den v3.1-Signaturblock immer dann, wenn in der Signaturkonfiguration ein rotierter Schlüssel und eine Abstammung bereitgestellt werden. Wenn die minSdkVersion einer App kleiner als Android 13 ist und ein rotierter Schlüssel verwendet wird, muss auch der ursprüngliche Signaturschlüssel angegeben werden, damit dieser zum Signieren des APK im v3-Signaturblock verwendet werden kann. Dies ähnelt dem aktuellen Verhalten, bei dem der ursprüngliche Unterzeichner erforderlich ist, wenn das APK auf eine Version vor Android 9 abzielt.

Um die gezielte Schlüsselrotation ab einer bestimmten SDK-Version zu unterstützen, stellt die apksig Bibliothek neue APIs bereit, die das Festlegen einer SDK-Mindestversion für die Rotation ermöglichen. Wenn eine SDK-Version kleiner als Android 13 als Mindestversion für die Rotationsunterstützung angegeben ist, dann die ursprüngliche Version v3 Block verwendet wird. Der v3.1-Signaturblock wird nur bei Rotation verwendet, wenn die minimale SDK-Version für die Rotation auf Android 13 und höher eingestellt ist. Der v3-Signaturblock verfügt über ein neues Attribut für den Rotations-Mindest-SDK-Versionsentfernungsschutz.

APK enthält Abstammung Wert von rotation-min-sdk-version v3-Signaturblock v3.1-Signaturblock
NEIN Standardwert oder beliebiger Wert (dargestellt durch x unten) Mit dem ursprünglichen Unterzeichner signiert, für Android 9 und höher Nicht anwesend
Ja Standard Mit dem ursprünglichen Unterzeichner signiert, für Android 9 bis 12L Signiert mit rotiertem Unterzeichner, ausgerichtet auf Android 13 und höher
Ja x < 33 (Android 13) Signiert mit rotiertem Unterzeichner, für Android 9 und höher Nicht anwesend
Ja x >= 33 (Android 13) Mit dem ursprünglichen Unterzeichner signiert, auf Android 9 ausgerichtet – ( x -1) Mit rotiertem Unterzeichner signiert, Ziel x+

Rotationsbezogene Probleme

Die folgenden rotationsbezogenen Probleme wurden in der Plattform behoben:

Android 12-Korrekturen

  • Die Plattform würde einer anfordernden App nur dann eine Signaturberechtigung erteilen, wenn der aktuelle Unterzeichner einer der Apps in der Signaturlinie der anderen App liegt oder der aktuelle Unterzeichner ist. Dies verhindert, dass einer anfordernden App eine Signaturberechtigung erteilt wird, wenn die beiden Apps Best Practices für Signaturschlüssel befolgen und auf unterschiedliche Signaturschlüssel wechseln.
  • Die APK-Rollback-Funktion der Plattform konnte ein APK, dessen Signaturschlüssel gerade rotiert wurde, nicht zurücksetzen, es sei denn, der vorherige Schlüssel in der Signierungslinie verfügte über die Rollback-Fähigkeit, aber diese Fähigkeit macht den Zweck der Rotation zunichte, da sie die Signatur eines neuen Paketupdates durch ermöglicht vorherigen Signaturschlüssel und Zurücksetzen des gedrehten Schlüssels.
  • Eine APK, die nur mit dem rotierten Schlüssel signiert und später mit einer APK aktualisiert wurde, die mit dem Originalschlüssel und dem rotierten Schlüssel in der Abstammung signiert ist, zeigt auf Geräten mit Android 11 und früher nur den rotierten Schlüssel in der Abstammung an.

Fehlerbehebungen für Android 11

  • PackageManager#checkSignatures wurde nicht ordnungsgemäß aktualisiert, um die ursprünglichen Signaturschlüssel zweier Pakete zu überprüfen. Dadurch wurde die Instrumentierung für Apps, die einen rotierten Signaturschlüssel verwendeten, unterbrochen, während das Instrumentierungs-APK den ursprünglichen Signaturschlüssel verwendete.
  • Pakete unter einer sharedUserId teilen ihre Signaturherkunft. Immer wenn eine App mit einer aktualisierten Signaturherkunft in einer sharedUiserId installiert oder aktualisiert wird, ersetzt die Herkunft dieser App die gemeinsame Herkunft für die sharedUserId (d. h. wenn die Signierungsherkunft einer App A -> B wäre und eine App in der sharedUserId aktualisiert wird). mit Abstammung B -> C, dann würde die sharedUserId Abstammung durch B -> C ersetzt. Ebenso könnten die Fähigkeiten eines früheren Unterzeichners in der Linie nicht aktualisiert werden, es sei denn, die Unterzeichnerlinie wurde geändert.

v4-Integration

Das v4-Signaturschema verwendet die für apksigner bereitgestellte Signaturkonfiguration. Im Falle mehrerer zur Rotation bereitgestellter Signaturkonfigurationen wird die neueste rotierte Signaturkonfiguration verwendet. Vor der Einführung von v3.1 enthielt v3 nur diese neueste rotierte Signaturkonfiguration, sodass v4 diese Konfiguration unverändert verwenden konnte; Damit konnte das v4-Signaturschema die Rotation unterstützen, da es den rotierten Signaturschlüssel in seiner SigningInfo verwendete. Obwohl die SigningInfo der Version 4 nicht die vollständige Signaturlinie enthält, kann sie diese aus dem Signaturblock der Version 3 abrufen, um der Plattform für alle Signaturabfragen Zugriff auf die Linie zu ermöglichen. Wenn v3.1 als Zielrotation für die bereitgestellte rotation-min-sdk-version verwendet wird, enthält die generische v3-Konfiguration sowohl die ursprüngliche Signaturkonfiguration als auch die neueste rotierte Signaturkonfiguration. Es wurde eine Erweiterung des v4-Signaturschemas erstellt, die zusätzliche Signaturinformationsblöcke für jede der Signaturkonfigurationen aus dem v3.1-Block enthält.

Validierung

Um Ihre Implementierung von v3.1 zu testen, führen Sie die CTS-Tests PkgInstallSignatureVerificationTest.java in cts/hostsidetests/appsecurity/src/android/appsecurity/cts/ aus.

Weitere Informationen zum Testen finden Sie im Abschnitt zur Überprüfung in Version 3.