Android 13 unterstützt das APK-Signaturschema v3.1, eine Verbesserung des bestehenden APK-Signaturschemas v3. Mit dem v3.1-Schema werden einige der bekannten Probleme mit dem APK-Signaturschema v3 in Bezug auf die Rotation behoben. Insbesondere unterstützt das v3.1-Signaturschema das Targeting auf SDK-Versionen, wodurch die Rotation auf eine spätere Version der Plattform ausgerichtet werden kann.
Das v3.1-Signaturschema verwendet eine Block-ID, die unter Android 12 oder niedriger nicht erkannt wird. Daher wendet die Plattform das folgende Signiererverhalten an:
- Auf Geräten mit Android 13 oder höher wird der rotierte Signierer im v3.1-Block verwendet.
- Auf Geräten mit älteren Android-Versionen wird der rotierte Signierer ignoriert und stattdessen der ursprüngliche Signierer im v3-Block verwendet.
Für Apps, bei denen der Signaturschlüssel noch nicht rotiert wurde, sind keine zusätzlichen Maßnahmen erforderlich. Wenn diese Apps die Rotation durchführen, wendet das System standardmäßig das v3.1-Signaturschema an.
v3.1-Signierungsblock
Der v3.1-Signierungsblock hat denselben Inhalt wie der v3-Signierungsblock. Mit der neuen Block-ID werden diese Signaturen jedoch nur auf Geräten mit Android 13 und höher erkannt. So können Apps ihre Signaturschlüssel sicher rotieren, ohne sich um APKs mit mehreren Zielen kümmern zu müssen. Der ursprüngliche Signierer kann verwendet werden, um das APK im v3-Signierungsblock zu signieren, und der rotierte Signierer im v3.1-Signierungsblock. Außerdem kann die Plattform alle vorhandenen Bestätigungscodes für den v3-Signierungsblock wiederverwenden, wenn eine v3.1-Signatur bestätigt wird.
Standardmäßig verwendet die apksig Bibliothek den
v3.1-Signierungsblock, wenn in der Signierung
konfiguration ein rotierter Schlüssel und eine Abstammungslinie angegeben sind. Wenn die minSdkVersion einer App niedriger als
Android 12 ist und ein rotierter Schlüssel verwendet wird, muss auch der ursprüngliche Signaturschlüssel
angegeben werden, damit er zum Signieren des APK im v3-Signierungs
block verwendet werden kann. Das ähnelt dem aktuellen Verhalten, bei dem der ursprüngliche Signierer erforderlich ist, wenn das APK auf eine Version vor Android 9 ausgerichtet ist.
Um die Rotation von Schlüsseln ab einer bestimmten SDK-Version zu unterstützen, stellt die apksig-Bibliothek neue APIs zur Verfügung, mit denen eine Mindest-SDK-Version für die Rotation festgelegt werden kann. Wenn eine SDK-Version unter Android 12 als Mindestversion für die Rotationsunterstützung angegeben wird, wird der ursprüngliche v3-Block verwendet. Der v3.1-Signierungsblock wird nur bei der Rotation verwendet, wenn die Mindest-SDK-Version für die Rotation auf Android 12 und höher festgelegt ist. Der v3-Signierungsblock hat ein Attribut für den Schutz vor dem Entfernen der Mindest-SDK-Version für die Rotation.
| APK enthält Abstammungslinie | Wert von rotation-min-sdk-version | v3-Signierungsblock | v3.1-Signierungsblock |
|---|---|---|---|
| Nein | Standard oder ein beliebiger Wert (unten durch x dargestellt) | Mit dem ursprünglichen Signierer signiert, ausgerichtet auf Android 9 und höher | Nicht vorhanden |
| Ja | Standard | Mit dem ursprünglichen Signierer signiert, ausgerichtet auf Android 9 bis 12L | Mit dem rotierten Signierer signiert, ausgerichtet auf Android 12 und höher |
| Ja | x < 33 (Android 13) | Mit dem rotierten Signierer signiert, ausgerichtet auf Android 9 und höher | Nicht vorhanden |
| Ja | x >= 33 (Android 13) | Mit dem ursprünglichen Signierer signiert, ausgerichtet auf Android 9 bis (x-1) | Mit dem rotierten Signierer signiert, ausgerichtet auf x+ |
Probleme im Zusammenhang mit der Rotation
Die folgenden Probleme im Zusammenhang mit der Rotation wurden auf der Plattform behoben:
Fehlerkorrekturen für Android 12
- Die Plattform erteilt einer anfragenden App nur dann eine Signaturberechtigung, wenn der aktuelle Signierer der App in der Signierungsabstammungslinie der anderen App enthalten ist oder der aktuelle Signierer, der anderen App ist. So wird verhindert, dass einer anfragenden App eine Signaturberechtigung erteilt wird, wenn die beiden Apps die Best Practices für Signaturschlüssel befolgen und zu unterschiedlichen Signaturschlüsseln rotieren.
- Mit der APK-Rollback-Funktion der Plattform konnte ein APK, dessen Signaturschlüssel gerade rotiert wurde, nur dann zurückgesetzt werden, wenn der vorherige Schlüssel in der Signierungsabstammungslinie die Rollback-Funktion hatte. Diese Funktion macht die Rotation jedoch zunichte, da ein neues Paketupdate mit dem vorherigen Signaturschlüssel signiert und der rotierte Schlüssel zurückgesetzt werden kann.
- Bei einem APK, das nur mit dem rotierten Schlüssel signiert und später mit einem APK aktualisiert wurde, das mit dem ursprünglichen Schlüssel und dem rotierten Schlüssel in der Abstammungslinie signiert wurde, wird auf Geräten mit Android 11 und niedriger nur der rotierte Schlüssel in der Abstammungslinie angezeigt.
Fehlerkorrekturen für Android 11
PackageManager#checkSignatureswurde nicht richtig aktualisiert, um die ursprünglichen Signaturschlüssel von zwei Paketen zu prüfen. Dadurch wurde die Instrumentierung für Apps unterbrochen, die einen rotierten Signaturschlüssel verwenden, wobei das Instrumentierungs-APK den ursprünglichen Signaturschlüssel verwendet.- Pakete unter einer
sharedUserIdteilen sich ihre Signierungsabstammungslinie. Wenn eine App mit einer aktualisierten Signierungsabstammungslinie in einersharedUiserIdinstalliert oder aktualisiert wird, ersetzt die Abstammungslinie dieser App die gemeinsame Abstammungslinie für diesharedUserId(das heißt, wenn die Signierungsabstammungslinie einer App A -> B wäre und eine App in dersharedUserIdmit der Abstammungslinie B -> C aktualisiert wird, würde diesharedUserIdAbstammungslinie durch B -> C ersetzt werden). Ebenso konnten die Funktionen eines vorherigen Signierers in der Abstammungslinie nur aktualisiert werden, wenn die Signierungsabstammungslinie geändert wurde.
v4-Integration
Das v4-Signaturschema verwendet die Signierungskonfiguration, die an apksigner übergeben wird. Wenn mehrere Signierungskonfigurationen für die Rotation bereitgestellt werden, wird die zuletzt rotierte Signierungskonfiguration verwendet. Vor der Einführung von v3.1 enthielt v3 nur diese zuletzt rotierte Signierungskonfiguration, sodass v4 diese Konfiguration unverändert verwenden konnte. Dadurch konnte das v4-Signaturschema die Rotation unterstützen, da es den rotierten Signaturschlüssel in seiner SigningInfo verwendete. Die v4-SigningInfo enthält zwar nicht die vollständige Signierungsabstammungslinie, kann sie aber aus dem v3-Signierungsblock abrufen, um der Plattform Zugriff auf die Abstammungslinie für alle Signaturanfragen zu ermöglichen. Wenn v3.1 verwendet wird, um die Rotation für die angegebene rotation-min-sdk-version auszurichten, enthält die generische v3-Konfiguration sowohl die ursprüngliche Signierungskonfiguration als auch die zuletzt rotierte Signierungskonfiguration. Es wurde eine Erweiterung des v4-Signaturschemas erstellt, die zusätzliche Signierungsinfoblöcke für jede der Signierungskonfigurationen aus dem v3.1-Block enthält.
Validierung
Führen Sie die CTS-Tests PkgInstallSignatureVerificationTest.java in cts/hostsidetests/appsecurity/src/android/appsecurity/cts/ aus, um Ihre Implementierung von v3.1 zu testen.
Weitere Informationen zu Tests finden Sie im Abschnitt zur Bestätigung in v3.