Questa sezione contiene consigli per garantire la sicurezza delle app sui dispositivi Android.
Revisione del codice sorgente
La revisione del codice sorgente può rilevare una vasta gamma di problemi di sicurezza, inclusi quelli identificati in questo documento. Android incoraggia vivamente la revisione sia manuale che automatica del codice sorgente.
- Segui le linee guida di sicurezza complete quando esegui le revisioni per garantire la copertura. Utilizza standard interni o esterni pertinenti per garantire revisioni coerenti e complete.
- Esegui un lint, ad esempio il lint di Android Studio, su tutto il codice dell'app utilizzando l'SDK Android e correggi eventuali problemi identificati.
- Analizza il codice nativo utilizzando uno strumento automatico in grado di rilevare problemi di gestione della memoria, come overflow del buffer ed errori di tipo off-by-one.
- Il sistema di build di Android supporta molti dei programmi di sanitizzazione LLVM, come AddressSanitizer e UndefinedBehaviorSanitizer, che possono essere utilizzati per l'analisi di runtime dei problemi relativi alla memoria. Se abbinati al fuzzing, supportato in Android tramite libFuzzer, i disinfettanti possono rilevare casi limite insoliti che richiedono ulteriori indagini.
- Un valutatore della sicurezza esperto deve esaminare il codice a rischio più elevato, ad esempio la crittografia, l'elaborazione dei pagamenti e l'elaborazione delle PII.
Test automatici
I test automatici possono contribuire a rilevare una vasta gamma di problemi di sicurezza e devono essere eseguiti regolarmente.
- Esegui regolarmente la versione più recente di CTS durante il processo di sviluppo per rilevare tempestivamente i problemi e ridurre i tempi di correzione. Android utilizza CTS nell'ambito dell'integrazione continua nel nostro processo di compilazione automatica, che esegue build più volte al giorno.
- Automatizza i test di sicurezza delle interfacce, inclusi i test con input con formato non corretto (fuzz test). Il sistema di compilazione di Android supporta libFuzzer per la scrittura di test di fuzz.
Analisi delle vulnerabilità
La ricerca di vulnerabilità può contribuire ad assicurare che le app preinstallate siano prive di vulnerabilità di sicurezza note. Il rilevamento avanzato può ridurre i tempi e i costi necessari per risolvere queste vulnerabilità e prevenire i rischi per gli utenti e i dispositivi.
- Esegui la scansione di tutte le app preinstallate utilizzando uno strumento di scansione delle vulnerabilità delle app riconosciuto dal settore e risolvi le vulnerabilità rilevate.
Applicazioni potenzialmente dannose
È importante assicurarsi che le app preinstallate sul dispositivo non siano app potenzialmente dannose (PHA). Sei responsabile del comportamento di tutte le app incluse nei tuoi dispositivi. Prima del lancio del dispositivo, controlla la presenza di vulnerabilità in tutte le app preinstallate.
Per ulteriori informazioni sulle app con malware e su come Google le combatte nel Play Store, consulta la documentazione per gli sviluppatori di Google Play Protect.
Installazione e autorizzazioni delle app
Autorizzazioni eccessive per le app preinstallate possono creare un rischio per la sicurezza. Limita le app preinstallate alle autorizzazioni minime necessarie e assicurati che non abbiano accesso a autorizzazioni o privilegi non necessari. Le autorizzazioni delle app sono descritte in AndroidManifest.xml.
- Non concedere autorizzazioni o privilegi non necessari alle app preinstallate. Controlla attentamente le app con privilegi di sistema, in quanto possono avere autorizzazioni molto sensibili.
- Assicurati che tutte le autorizzazioni richieste siano pertinenti e necessarie per la funzionalità di quella specifica app.
- Assicurati che sia presente un'informativa per gli utenti per tutte le app preinstallate che utilizzano l'autorizzazione
INSTALL_PACKAGES
. - Assicurati che lo sviluppatore abbia l'obbligo contrattuale di non installare app come UID 0.
- Valutare le autorizzazioni dichiarate nel manifest di tutte le app da installare tramite la rete dello sviluppatore.
- Assicurati che lo sviluppatore abbia l'obbligo contrattuale di eseguire la scansione di tutti gli URL di download delle app di aggiornamento automatico e di installazione con l'API Google Safe Browsing prima di pubblicare le app sul dispositivo.
Firma dell'app
Le firme delle app svolgono un ruolo importante nella sicurezza del dispositivo e vengono utilizzate per i controlli delle autorizzazioni e gli aggiornamenti software. Quando selezioni una chiave da utilizzare per la firma delle app, è importante considerare se un'app è disponibile solo su un singolo dispositivo o è comune a più dispositivi.
- Assicurati che le app non siano firmate con una chiave nota pubblicamente, come la chiave dello sviluppatore AOSP.
- Assicurati che le chiavi utilizzate per firmare le app siano gestite in modo coerente con le pratiche standard di settore per la gestione delle chiavi sensibili, incluso un modulo di sicurezza hardware (HSM) che fornisca accesso limitato e verificabile.
- Assicurati che le app non siano firmate con la chiave della piattaforma. In questo modo, un'app ottiene l'accesso alle autorizzazioni di firma della piattaforma, che sono molto potenti e destinate solo all'utilizzo da parte dei componenti del sistema operativo. Le app di sistema devono utilizzare autorizzazioni privilegiate.
- Assicurati che le app con lo stesso nome del pacchetto non siano firmate con chiavi diverse. Questo accade spesso quando si crea un'app per dispositivi diversi, soprattutto se si utilizza la chiave della piattaforma. Se l'app è indipendente dal dispositivo, utilizza la stessa chiave su tutti i dispositivi. Se l'app è specifica per dispositivo, crea nomi di pacchetti univoci per dispositivo e chiave.
Isolare app e processi
Il modello di sandboxing di Android offre una maggiore sicurezza per app e processi se utilizzato correttamente.
Isolare i processi di root
I processi di root sono il bersaglio più frequente degli attacchi di escalation dei privilegi. Ridurre il numero di processi di root riduce il rischio di escalation dei privilegi.
- Assicurati che i dispositivi eseguano il codice minimo necessario come utente root. Se possibile, utilizza un normale processo Android anziché un processo di root. Se un processo deve essere eseguito come root su un dispositivo, documentalo in una richiesta di funzionalità AOSP in modo che possa essere esaminato pubblicamente.
- Ove possibile, il codice principale deve essere isolato dai dati non attendibili e acceduto tramite la comunicazione interprocessuale (IPC). Ad esempio, riduci la funzionalità di root a un piccolo servizio accessibile tramite Binder ed esponi il servizio con autorizzazione di firma a un'app con privilegi ridotti o nulli per gestire il traffico di rete.
- I processi di root non devono ascoltare su una socket di rete.
- I processi di root non devono includere un runtime generico, ad esempio una VM Java.
Isolare le app di sistema
In genere, le app preinstallate non devono essere eseguite con l'identificatore univoco (UID) del sistema condiviso. Se è necessario che un'app utilizzi l'UID condiviso del sistema o di un altro servizio privilegiato (ad es. lo smartphone), l'app non deve esportare servizi, ricevitori di trasmissione o fornitori di contenuti a cui è possibile accedere da app di terze parti installate dagli utenti.
- Assicurati che i dispositivi eseguano il codice minimo necessario come sistema. Se possibile, utilizza un processo Android con il proprio UID anziché riutilizzare l'UID di sistema.
- Ove possibile, il codice di sistema deve essere isolato dai dati non attendibili e deve esporre l'IPC solo ad altri processi attendibili.
- I processi di sistema non devono ascoltare su una socket di rete. Questo è un requisito CTS.
Isolare i processi
La sandbox delle app Android prevede l'isolamento delle app da altri processi del sistema, inclusi i processi di root e i debugger. A meno che il debug non sia abilitato specificamente dall'app e dall'utente, nessuna app dovrebbe violare questa aspettativa.
- Assicurati che i processi di root non accedano ai dati all'interno delle singole cartelle dei dati delle app, a meno che non venga utilizzato un metodo di debug di Android documentato.
- Assicurati che i processi di root non accedano alla memoria delle app, a meno che non utilizzi un metodo di debug di Android documentato.
- Assicurati che i dispositivi non includano app che accedono ai dati o alla memoria di altre app o altri processi.