Schema di firma dell'APK v3.1

Panoramica

Android 13 supporta APK Signature Scheme v3.1, un miglioramento rispetto all'APK Signature Scheme v3 esistente. Lo schema v3.1 risolve alcuni dei problemi noti dello schema di firma APK v3 relativi alla rotazione. In particolare, lo schema di firma v3.1 supporta il targeting della versione dell'SDK, che consente la rotazione di indirizzare una versione successiva della piattaforma.

Lo schema di firma v3.1 utilizza un ID di blocco non riconosciuto su Android 12 o versioni precedenti. Pertanto, la piattaforma applica il seguente comportamento del firmatario:

  • I dispositivi che eseguono Android 13 o versioni successive utilizzano il firmatario ruotato nel blocco v3.1.
  • I dispositivi che eseguono versioni precedenti di Android ignorano il firmatario ruotato e utilizzano invece il firmatario originale nel blocco v3.

Le app che non hanno ancora ruotato la chiave di firma non richiedono alcuna azione aggiuntiva. Ogni volta che queste app scelgono di ruotare, il sistema applica lo schema di firma v3.1 per impostazione predefinita.

blocco firma v3.1

Il blocco di firma v3.1 avrà gli stessi contenuti del blocco di firma v3, ma con il nuovo ID di blocco queste firme verranno riconosciute solo sui dispositivi con Android 13 e versioni successive. Ciò consente alle app di ruotare in modo sicuro le proprie chiavi di firma senza doversi preoccupare degli APK multi-target poiché il firmatario originale può essere utilizzato per firmare l'APK nel blocco di firma v3 e il firmatario ruotato nel blocco di firma v3.1. Ciò consente inoltre alla piattaforma di riutilizzare tutti i codici di verifica esistenti per il blocco di firma v3 durante la verifica di una firma v3.1.

Per impostazione predefinita, la libreria apksig utilizzerà il blocco di firma v3.1 ogni volta che nella configurazione di firma vengono forniti una chiave ruotata e un lignaggio. Se il minSdkVersion di un'app è inferiore ad Android 13 e viene utilizzata una chiave ruotata, è necessario specificare anche la chiave di firma originale in modo che possa essere utilizzata per firmare l'APK nel blocco di firma v3. Questo è simile al comportamento attuale in cui è richiesto il firmatario originale se l'APK ha come target una versione precedente ad Android 9.

Per supportare la rotazione delle chiavi mirate a partire da una particolare versione dell'SDK, la libreria apksig esporrà nuove API che consentiranno di impostare una versione minima dell'SDK per la rotazione Se viene specificata una versione dell'SDK inferiore ad Android 13 come versione minima per il supporto della rotazione, allora la versione v3 originale verrà utilizzato il blocco. Il blocco di firma v3.1 viene utilizzato solo in presenza di rotazione in cui la versione minima dell'SDK per la rotazione è impostata su Android 13 e versioni successive. Il blocco di firma v3 avrà un nuovo attributo per la protezione dall'eliminazione della versione minima dell'SDK con rotazione.

L'APK include il lignaggio Valore della versione rotazione-min-sdk blocco firma v3 blocco firma v3.1
NO Predefinito o qualsiasi valore (rappresentato dalla x di seguito) Firmato con il firmatario originale, destinato ad Android 9 e versioni successive Non presente
Predefinito Firmato con il firmatario originale, destinato ad Android da 9 a 12L Firmato con firmatario ruotato, destinato ad Android 13 e versioni successive
x < 33 (Android 13) Firmato con firmatario ruotato, destinato ad Android 9 e versioni successive Non presente
x >= 33 (Android 13) Firmato con il firmatario originale, destinato ad Android 9 - ( x -1) Firmato con firmatario ruotato, target x+

Problemi legati alla rotazione

Nella piattaforma sono stati risolti i seguenti problemi relativi alla rotazione:

Correzioni per Android 12

  • La piattaforma concederebbe un'autorizzazione di firma a un'app richiedente solo se l'attuale firmatario dell'app rientra nella linea di firma o è l'attuale firmatario dell'altra app; ciò impedisce di concedere un'autorizzazione di firma a un'app richiedente se le due app seguono le migliori pratiche per le chiavi di firma e ruotano su chiavi di firma diverse.
  • La funzionalità di rollback dell'APK della piattaforma non poteva eseguire il rollback di un APK la cui chiave di firma era appena stata ruotata a meno che la chiave precedente nella derivazione di firma non avesse la capacità di rollback, ma questa capacità vanifica lo scopo della rotazione in quanto consente a un nuovo aggiornamento del pacchetto di essere firmato dal chiave di firma precedente e ripristino della chiave ruotata.
  • Un APK firmato solo con la chiave ruotata e successivamente aggiornato con un APK firmato con la chiave originale e la chiave ruotata nel lignaggio mostrerà solo la chiave ruotata nel lignaggio sui dispositivi con Android 11 e versioni precedenti.

Correzioni per Android 11

  • PackageManager#checkSignatures non è stato aggiornato correttamente per verificare le chiavi di firma originali di due pacchetti. Ciò interrompeva la strumentazione per le app che utilizzavano una chiave di firma ruotata con l'APK di strumentazione che utilizzava la chiave di firma originale.
  • I pacchetti con un sharedUserId condividono la loro derivazione di firma. Ogni volta che un'app con una derivazione di firma aggiornata viene installata o aggiornata in un sharedUiserId , la derivazione di quell'app ha sostituito la derivazione condivisa per sharedUserId (ovvero, se la derivazione di firma di un'app era A -> B e un'app viene aggiornata in sharedUserId con la derivazione B -> C, la derivazione sharedUserId verrebbe sostituita con B -> C). Allo stesso modo, le funzionalità di un firmatario precedente nella derivazione non potevano essere aggiornate a meno che la derivazione della firma non venisse modificata.

integrazione v4

Lo schema di firma v4 utilizza la configurazione di firma fornita ad apksigner; nel caso di più configurazioni di firma fornite per la rotazione, viene utilizzata l'ultima configurazione di firma ruotata. Prima dell'introduzione della versione 3.1, la versione 3 includeva solo l'ultima configurazione di firma ruotata, quindi la versione 4 era in grado di utilizzare questa configurazione così com'è; con questo lo schema di firma v4 è stato in grado di supportare la rotazione poiché utilizzava la chiave di firma ruotata nel suo SigningInfo. Sebbene SigningInfo v4 non includa l'intera derivazione della firma, è in grado di estrarla dal blocco di firma v3 per consentire alla piattaforma l'accesso alla derivazione per eventuali query di firma. Quando si utilizza la versione 3.1 per indirizzare la rotazione per la versione di rotazione-min-sdk fornita, la configurazione v3 generica includerà sia la configurazione di firma originale sia l'ultima configurazione di firma ruotata. È stata creata un'estensione dello schema di firma v4 che include blocchi aggiuntivi di informazioni sulla firma per ciascuna delle configurazioni di firma del blocco v3.1.

Validazione

Per testare la tua implementazione della v3.1, esegui i test CTS PkgInstallSignatureVerificationTest.java in cts/hostsidetests/appsecurity/src/android/appsecurity/cts/ .

Per ulteriori informazioni sui test, consulta la sezione di verifica nella versione v3.