APK Signature Scheme v3.1

Présentation

Android 13 est compatible avec le schéma de signature des APK v3.1, une amélioration du schéma de signature des APK v3 existant. Le schéma v3.1 résout certains des problèmes connus liés au schéma de signature d'APK v3 concernant la rotation. En particulier, le schéma de signature v3.1 est compatible avec le ciblage de version de SDK, ce qui permet à la rotation de cibler une version ultérieure de la plate-forme.

Le schéma de signature v3.1 utilise un ID de bloc qui n'est pas reconnu sur Android 12 ou version antérieure. Par conséquent, la plate-forme applique le comportement de signataire suivant:

  • Les appareils équipés d'Android 13 ou version ultérieure utilisent le signataire rotatif dans le bloc v3.1.
  • Les appareils exécutant d'anciennes versions d'Android ignorent le signataire rotatif et utilisent plutôt le signataire d'origine dans le bloc v3.

Les applications qui n'ont pas encore modifié leur clé de signature ne nécessitent aucune action supplémentaire. Chaque fois que ces applications choisissent de pivoter, le système applique le schéma de signature v3.1 par défaut.

Bloc de signature v3.1

Le bloc de signature v3.1 aura le même contenu que le bloc de signature v3, mais avec le nouvel ID de bloc, ces signatures ne seront reconnues que sur les appareils équipés d'Android 13 ou version ultérieure. Cela permet aux applications de faire pivoter leurs clés de signature en toute sécurité sans avoir à se soucier des APK multicibles, car le signataire d'origine peut être utilisé pour signer l'APK dans le bloc de signature v3 et le signataire pivoté dans le bloc de signature v3.1. Cela permet également à la plate-forme de réutiliser tous les codes de validation existants pour le bloc de signature v3 lors de la validation d'une signature v3.1.

Par défaut, la bibliothèque apksig utilise le bloc de signature v3.1 chaque fois qu'une clé et une lignée rotées sont fournies dans la configuration de signature. Si la version minSdkVersion d'une application est inférieure à Android 13 et qu'une clé rotée est utilisée, la clé de signature d'origine doit également être spécifiée afin qu'elle puisse être utilisée pour signer l'APK dans le bloc de signature v3. Ce comportement est semblable à celui actuel, où le signataire d'origine est requis si l'APK cible une version antérieure à Android 9.

Pour prendre en charge la rotation des clés de ciblage à partir d'une version de SDK particulière, la bibliothèque apksig exposera de nouvelles API qui permettront de définir une version minimale de SDK pour la rotation. Si une version de SDK inférieure à Android 13 est spécifiée comme version minimale pour la prise en charge de la rotation, le bloc v3 d'origine sera utilisé. Le bloc de signature v3.1 n'est utilisé que lorsqu'une rotation est effectuée, lorsque la version minimale du SDK pour la rotation est définie sur Android 13 ou version ultérieure. Le bloc de signature V3 comportera un nouvel attribut pour la protection contre le masquage de la version minimale du SDK de rotation.

L'APK inclut Lineage Valeur de rotation-min-sdk-version Bloc de signature v3 Bloc de signature v3.1
Non Valeur par défaut ou valeur quelconque (représentée par x ci-dessous) Signé par le signataire d'origine, ciblant Android 9 ou version ultérieure Non présent
Oui Par défaut Signé par le signataire d'origine, ciblant Android 9 à Android 12L Signé avec un signataire rotatif, ciblant Android 13 et versions ultérieures
Oui x < 33 (Android 13) Signé avec un signataire rotatif, ciblant Android 9 ou version ultérieure Non présent
Oui x ≥ 33 (Android 13) Signé par le signataire d'origine, ciblant Android 9 - (x-1) Signé avec un signataire rotatif, ciblant x+

Problèmes liés à la rotation

Les problèmes de rotation suivants ont été résolus dans la plate-forme:

Corrections apportées à Android 12

  • La plate-forme n'accorde une autorisation de signature à une application à l'origine de la demande que si le signataire actuel de l'une des applications figure dans la lignée de signature de l'autre application ou s'il est le signataire actuel de l'autre application. Cela évite d'accorder une autorisation de signature à une application à l'origine de la demande si les deux applications suivent les bonnes pratiques concernant les clés de signature et passent à des clés de signature différentes.
  • La fonctionnalité de rollback de l'APK de la plate-forme ne pouvait pas effectuer de rollback d'un APK dont la clé de signature venait d'être modifiée, sauf si la clé précédente de la lignée de signature était dotée de cette fonctionnalité. Toutefois, cette fonctionnalité va à l'encontre de l'objectif de la rotation, car elle permet de signer une nouvelle mise à jour de package avec la clé de signature précédente et de revenir à la clé modifiée.
  • Un APK signé uniquement avec la clé rotée et mis à jour ultérieurement avec un APK signé avec la clé d'origine et la clé rotée dans la lignée n'affichera que la clé rotée dans la lignée sur les appareils exécutant Android 11 ou version antérieure.

Corrections apportées à Android 11

  • PackageManager#checkSignatures n'a pas été correctement mis à jour pour vérifier les clés de signature d'origine de deux packages. Cela a endommagé l'instrumentation pour les applications utilisant une clé de signature rotée avec l'APK d'instrumentation utilisant la clé de signature d'origine.
  • Les packages d'un sharedUserId partagent leur lignée de signature. Chaque fois qu'une application avec une lignée de signature mise à jour est installée ou mise à jour dans une sharedUiserId, la lignée de cette application remplace la lignée partagée de la sharedUserId (c'est-à-dire que si la lignée de signature d'une application était A -> B et qu'une application est mise à jour dans la sharedUserId avec la lignée B -> C, la lignée de la sharedUserId sera remplacée par B -> C). De même, les fonctionnalités d'un signataire précédent de la lignée ne pouvaient pas être mises à jour, sauf si la lignée de signature était modifiée.

Intégration de la version v4

Le schéma de signature v4 utilise la configuration de signature fournie à apksigner. En cas de plusieurs configurations de signature fournies pour la rotation, la dernière configuration de signature rotée est utilisée. Avant l'introduction de la version 3.1, la version 3 n'incluait que cette dernière configuration de signature rotée. La version 4 pouvait donc utiliser cette configuration telle quelle. Le schéma de signature de la version 4 était ainsi compatible avec la rotation, car il utilisait la clé de signature rotée dans son SigningInfo. Bien que SigningInfo v4 n'inclue pas la lignée de signature complète, il peut l'extraire du bloc de signature v3 pour permettre à la plate-forme d'accéder à la lignée pour toutes les requêtes de signature. Lorsque la version 3.1 est utilisée pour cibler la rotation pour la version de SDK minimale de rotation fournie, la configuration générique de la version 3 inclut à la fois la configuration de signature d'origine et la dernière configuration de signature en rotation. Une extension du schéma de signature v4 a été créée, qui inclut des blocs d'informations de signature supplémentaires pour chacune des configurations de signature du bloc v3.1.

Validation

Pour tester votre implémentation de la version 3.1, exécutez les tests CTS PkgInstallSignatureVerificationTest.java dans cts/hostsidetests/appsecurity/src/android/appsecurity/cts/.

Pour en savoir plus sur les tests, consultez la section Vérification de la version 3.