Schema di firma dell'APK v3.1

Panoramica

Android 13 supporta lo schema di firma dell'APK v3.1, un miglioramento dello schema di firma dell'APK v3 esistente. Lo schema v3.1 risolve alcuni dei problemi noti relativi alla rotazione dello schema di firma dell'APK v3. In particolare, lo schema di firma v3.1 supporta il targeting della versione dell'SDK, che consente di scegliere come target una release successiva della piattaforma.

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

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

Le app di cui non è stata ancora ruotata la chiave di firma non richiedono alcun'altra azione. Ogni volta che queste app scelgono di ruotare, il sistema applica lo schema di firma v3.1 per impostazione predefinita.

Blocco di firma v3.1

Il blocco di firma v3.1 avrà gli stessi contenuti del blocco di firma v3, ma con il nuovo ID blocco queste firme verranno riconosciute solo sui dispositivi con Android 13 e versioni successive. In questo modo, le app possono ruotare in sicurezza le proprie chiavi di firma senza doversi preoccupare degli APK multitarget, 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. In questo modo, la piattaforma può anche 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 della firma viene fornita una chiave e una sequenza di rotazione. Se la versione minSdkVersion di un'app è precedente ad Android 13 e viene utilizzata una chiave ruotata, deve essere specificata 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 il firmatario originale è obbligatorio se l'APK ha come target una versione precedente ad Android 9.

Per supportare la rotazione delle chiavi di destinazione a partire da una determinata 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 precedente ad Android 13 come versione minima per il supporto della rotazione, verrà utilizzato il blocco v3 originale. Il blocco di firma v3.1 viene utilizzato solo in presenza di rotazione se 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 dello stripping della versione minima dell'SDK.

L'APK include Lineage Valore di rotation-min-sdk-version Blocco di firma v3 Blocco di firma v3.1
No Valore predefinito o qualsiasi valore (rappresentato da x di seguito) Firmato con il firmatario originale, targeting Android 9 e versioni successive Non presente
Predefinito Firmato con il firmatario originale, con target Android 9 fino a 12L Firmato con firmatario ruotato, targeting Android 13 e versioni successive
x < 33 (Android 13) Firmato con firmatario ruotato, targeting Android 9 e versioni successive Non presente
x >= 33 (Android 13) Firmato con il firmatario originale, targeting Android 9 - (x-1) Firmato con firmatario ruotato, targeting x+

Problemi relativi alla rotazione

I seguenti problemi relativi alla rotazione sono stati risolti nella piattaforma:

Correzioni di Android 12

  • La piattaforma concede un'autorizzazione di firma a un'app richiedente solo se il firmatario corrente di una delle app fa parte della sequenza di firma o è il firmatario corrente dell'altra app. In questo modo si impedisce di concedere un'autorizzazione di firma a un'app richiedente se le due app seguono le best practice per le chiavi di firma e passano a chiavi di firma diverse.
  • La funzionalità di rollback dell'APK della piattaforma non è riuscita a eseguire il rollback di un APK di cui è stata appena eseguita la rotazione della chiave di firma, a meno che la chiave precedente nella derivazione della firma non avesse la funzionalità di rollback, ma questa funzionalità vanifica lo scopo della rotazione in quanto consente di firmare un nuovo aggiornamento del pacchetto con la chiave di firma precedente e di eseguire il rollback 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 nella cronologia mostrerà solo la chiave ruotata nella cronologia sui dispositivi con Android 11 e versioni precedenti.

Correzioni di Android 11

  • PackageManager#checkSignatures non è stato aggiornato correttamente per controllare le chiavi di firma originali di due pacchetti. Ciò ha causato un malfunzionamento della misurazione per le app che utilizzano una chiave di firma ruotata con l'APK di misurazione che utilizza la chiave di firma originale.
  • I pacchetti in un sharedUserId condividono la loro linea di firma. Ogni volta che un'app con un'origine della firma aggiornata viene installata o aggiornata in un sharedUiserId, l'origine dell'app sostituisce l'origine condivisa per il sharedUserId (ovvero, se l'origine della firma di un'app fosse A -> B e un'app viene aggiornata nel sharedUserId con l'origine B -> C, l'origine del sharedUserId verrà sostituita con B -> C). Analogamente, le funzionalità di un firmatario precedente nella linea di successione non potevano essere aggiornate a meno che la linea di successione della firma non fosse modificata.

Integrazione di v4

Lo schema di firma v4 utilizza la configurazione di firma fornita ad apksigner. Nel caso in cui siano fornite più configurazioni di firma per la rotazione, viene utilizzata la configurazione di firma ruotata più recente. Prima dell'introduzione della versione 3.1, la versione 3 includeva solo questa configurazione di firma ruotata più recente, pertanto la versione 4 poteva utilizzarla così com'è. Con questo, lo schema di firma della versione 4 è stato in grado di supportare la rotazione poiché utilizzava la chiave di firma ruotata in SigningInfo. Sebbene SigningInfo 4 non includa la sequenza di firme completa, è in grado di estrarla dal blocco di firma 3 per consentire alla piattaforma di accedere alla sequenza per eventuali query sulla firma. Quando viene utilizzata la versione 3.1 per la rotazione del target per la versione minima dell'SDK di rotazione fornita, la configurazione generica della versione 3 includerà sia la configurazione di firma originale sia la configurazione di firma ruotata più recente. È stata creata un'estensione dello schema di firma v4 che include ulteriori blocchi di informazioni sulla firma per ciascuna delle configurazioni di firma del blocco v3.1.

Convalida

Per testare l'implementazione della versione 3.1, esegui i PkgInstallSignatureVerificationTest.java test CTS in cts/hostsidetests/appsecurity/src/android/appsecurity/cts/.

Per ulteriori informazioni sui test, consulta la sezione Verifica nella versione 3.