Firma della domanda

La firma dell'applicazione consente agli sviluppatori di identificare l'autore dell'applicazione e di aggiornare la propria applicazione senza creare interfacce e autorizzazioni complicate. Ogni applicazione eseguita sulla piattaforma Android deve essere firmata dallo sviluppatore . Le applicazioni che tentano di installare senza essere firmate verranno rifiutate da Google Play o dal programma di installazione del pacchetto sul dispositivo Android.

Su Google Play, la firma dell'applicazione unisce la fiducia che Google ha con lo sviluppatore e la fiducia che lo sviluppatore ha con la sua applicazione. Gli sviluppatori sanno che la loro applicazione viene fornita, non modificata, al dispositivo Android; e gli sviluppatori possono essere ritenuti responsabili del comportamento della loro applicazione.

Su Android, la firma dell'applicazione è il primo passaggio per inserire un'applicazione nella relativa sandbox dell'applicazione. Il certificato dell'applicazione firmato definisce quale ID utente è associato a quale applicazione; applicazioni diverse vengono eseguite con ID utente diversi. La firma dell'applicazione garantisce che un'applicazione non possa accedere a nessun'altra applicazione se non tramite IPC ben definito.

Quando un'applicazione (file APK) viene installata su un dispositivo Android, Package Manager verifica che l'APK sia stato correttamente firmato con il certificato incluso in quell'APK. Se il certificato (o, più precisamente, la chiave pubblica nel certificato) corrisponde alla chiave utilizzata per firmare qualsiasi altro APK sul dispositivo, il nuovo APK ha la possibilità di specificare nel manifest che condividerà un UID con l'altro in modo simile APK firmati.

Le domande possono essere firmate da una terza parte (OEM, operatore, mercato alternativo) o autofirmate. Android fornisce la firma del codice utilizzando certificati autofirmati che gli sviluppatori possono generare senza assistenza o autorizzazione esterna. Le domande non devono essere firmate da un'autorità centrale. Android attualmente non esegue la verifica CA per i certificati delle applicazioni.

Le applicazioni sono anche in grado di dichiarare autorizzazioni di sicurezza a livello di protezione della firma, limitando l'accesso solo alle applicazioni firmate con la stessa chiave mantenendo distinti UID e Sandbox delle applicazioni. Una relazione più stretta con un'applicazione sandbox condivisa è consentita tramite la funzionalità UID condiviso in cui due o più applicazioni firmate con la stessa chiave sviluppatore possono dichiarare un UID condiviso nel proprio manifest.

Schemi di firma APK

Android supporta tre schemi di firma delle applicazioni:

Per la massima compatibilità, firma le applicazioni con tutti gli schemi, prima con v1, poi v2 e poi v3. I dispositivi Android 7.0+ e versioni successive installano le app firmate con schemi v2+ più rapidamente rispetto a quelle firmate solo con lo schema v1. Le piattaforme Android precedenti ignorano le firme v2+ e quindi necessitano che le app contengano le firme v1.

Firma JAR (schema v1)

La firma dell'APK fa parte di Android sin dall'inizio. Si basa su JAR firmato . Per i dettagli sull'utilizzo di questo schema, consulta la documentazione di Android Studio sulla firma dell'app .

Le firme v1 non proteggono alcune parti dell'APK, come i metadati ZIP. Il verificatore APK deve elaborare molte strutture di dati non attendibili (non ancora verificate) e quindi eliminare i dati non coperti dalle firme. Questo offre una superficie di attacco considerevole. Inoltre, il verificatore APK deve decomprimere tutte le voci compresse, consumando più tempo e memoria. Per risolvere questi problemi, Android 7.0 ha introdotto APK Signature Scheme v2.

Schema firma APK v2 e v3 (schema v2+)

I dispositivi con Android 7.0 e versioni successive supportano lo schema di firma APK v2 (schema v2) e versioni successive. (Lo schema v2 è stato aggiornato a v3 in Android 9 per includere informazioni aggiuntive nel blocco di firma, ma per il resto funziona allo stesso modo.) Il contenuto dell'APK viene sottoposto a hash e firmato, quindi il blocco di firma dell'APK risultante viene inserito nell'APK. Per i dettagli sull'applicazione dello schema v2+ a un'app, vedere Schema firma APK v2 .

Durante la convalida, lo schema v2+ tratta il file APK come un BLOB ed esegue il controllo della firma sull'intero file. Qualsiasi modifica all'APK, comprese le modifiche ai metadati ZIP, invalida la firma dell'APK. Questa forma di verifica APK è sostanzialmente più veloce e consente il rilevamento di più classi di modifiche non autorizzate.

Il nuovo formato è compatibile con le versioni precedenti, quindi gli APK firmati con il nuovo formato di firma possono essere installati su dispositivi Android meno recenti (che semplicemente ignorano i dati aggiuntivi aggiunti all'APK), purché anche questi APK siano firmati v1.

Processo di verifica della firma APK

Figura 1. Processo di verifica della firma APK

L'hash dell'intero file dell'APK viene verificato rispetto alla firma v2+ archiviata nell'APK Signing Block. L'hash copre tutto tranne l'APK Signing Block, che contiene la firma v2+. Qualsiasi modifica all'APK al di fuori dell'APK Signing Block invalida la firma v2+ dell'APK. Anche gli APK con firma v2+ spogliata vengono rifiutati, perché la loro firma v1 specifica che l'APK è stato firmato v2, il che fa sì che Android 7.0 e versioni successive si rifiutino di verificare gli APK utilizzando le loro firme v1.

Per i dettagli sul processo di verifica della firma APK, vedere la sezione Verifica di APK Signature Scheme v2.