Android 13 supporta lo schema di firma dell'APK v3.1, un miglioramento rispetto all'esistente schema di firma dell'APK v3. Lo schema v3.1 risolve alcuni dei problemi noti dello schema di firma dell'APK v3 relativi alla rotazione. In particolare, lo schema di firma v3.1 supporta il targeting della versione dell'SDK, che consente la rotazione per il targeting di 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 per cui non è ancora stata eseguita la rotazione della chiave di firma non richiedono alcuna azione aggiuntiva. Ogni volta che queste app scelgono di eseguire la rotazione, il sistema applica lo schema di firma v3.1 per impostazione predefinita.
Blocco di firma v3.1
Il blocco di firma v3.1 ha lo stesso contenuto del blocco di firma v3, ma con il nuovo ID blocco queste firme vengono riconosciute solo sui dispositivi con Android 13 e versioni successive. In questo modo, le app possono ruotare in modo sicuro le 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 utilizza il blocco di firma v3.1 ogni volta che vengono forniti una chiave ruotata e una derivazione nella configurazione di firma. Se il minSdkVersion di un'app è inferiore ad
Android 12 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 comportamento è simile a quello 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 a partire da una determinata versione dell'SDK,
la libreria apksig espone nuove API che consentono
di impostare una versione SDK minima per la rotazione. Se viene specificata una versione SDK inferiore
ad Android 12 come versione minima per il supporto della rotazione, viene utilizzato il blocco v3 originale. Il blocco di firma v3.1 viene utilizzato solo in presenza di rotazione, dove la versione minima dell'SDK per la rotazione è impostata su Android 12 e versioni successive. Il blocco di firma v3 ha un attributo per la protezione
dall'eliminazione della versione minima dell'SDK.
| L'APK include la tracciabilità | Valore di rotation-min-sdk-version | v3 signing block | v3.1 signing block |
|---|---|---|---|
| No | Valore predefinito o qualsiasi valore (rappresentato da x di seguito) | Firmato con il firmatario originale, con target Android 9 e versioni successive | Non presente |
| Sì | Predefinito | Firmato con il firmatario originale, con target Android 9 fino a 12L | Firmato con un firmatario ruotato, con target Android 12 e versioni successive |
| Sì | x < 33 (Android 13) | Firmata con il firmatario ruotato, con target Android 9 e versioni successive | Non presente |
| Sì | x >= 33 (Android 13) | Firmato con il firmatario originale, con target 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 attuale di una delle app fa parte della genealogia di firma o è il firmatario attuale dell'altra app. In questo modo, si impedisce la concessione di 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 genealogia 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 aggiornato successivamente con un APK firmato con la chiave originale e la chiave ruotata nella genealogia mostra solo la chiave ruotata nella genealogia sui dispositivi con Android 11 e versioni precedenti.
Correzioni di Android 11
PackageManager#checkSignaturesnon è stato aggiornato correttamente per controllare le chiavi di firma originali di due pacchetti. Ciò ha interrotto l'instrumentation per le app che utilizzano una chiave di firma ruotata con l'APK di instrumentation che utilizza la chiave di firma originale.- I pacchetti in un
sharedUserIdcondividono la stessa genealogia di firma. Ogni volta che un'app con una genealogia di firma aggiornata viene installata o aggiornata in unsharedUiserIdla genealogia di quell'app sostituisce la genealogia condivisa per ilsharedUserId(ovvero, se la genealogia di firma di un'app fosse A -> B e un'app viene aggiornata nelsharedUserIdcon la genealogia B -> C, la genealogia delsharedUserIdverrebbe sostituita con B -> C). Allo stesso modo, le funzionalità di un firmatario precedente nella lignaggio non potevano essere aggiornate a meno che non fosse stata modificata la lignaggio della firma.
Integrazione della versione 4
Lo schema di firma v4 utilizza la configurazione di firma fornita ad apksigner. In 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 questa ultima configurazione di firma ruotata, quindi la versione 4 poteva utilizzare questa configurazione così com'è; con questo, lo schema di firma v4 era in grado di supportare la rotazione perché utilizzava la chiave di firma ruotata nel relativo SigningInfo. Sebbene SigningInfo v4 non includa la tracciabilità completa della firma, è in grado di estrarla dal blocco di firma v3 per consentire alla piattaforma di accedere alla tracciabilità per qualsiasi query di firma. Quando viene utilizzata la versione 3.1 per il targeting della rotazione per la versione minima dell'SDK di rotazione fornita, la configurazione generica v3 include sia la configurazione di firma originale sia quella di firma ruotata più recente. È stata creata un'estensione dello schema di firma v4 che include blocchi di informazioni di firma aggiuntivi per ciascuna delle configurazioni di firma del blocco v3.1.
Convalida
Per testare l'implementazione della versione 3.1, esegui i test CTS PkgInstallSignatureVerificationTest.java in cts/hostsidetests/appsecurity/src/android/appsecurity/cts/.
Per saperne di più sui test, consulta la sezione Verifica in v3.