Questa sezione contiene consigli per garantire la sicurezza delle app sui dispositivi Android.
Revisione del codice sorgente
La revisione del codice sorgente può rilevare un'ampia gamma di problemi di sicurezza, inclusi quelli identificati in questo documento. Android consiglia vivamente di eseguire revisioni del codice sorgente sia manuali che automatiche.
- Segui le linee guida complete sulla sicurezza durante le revisioni per garantire la copertura. Utilizza gli standard interni o esterni pertinenti per garantire revisioni coerenti e complete.
- Esegui un linter, ad esempio il linter 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 off-by-one.
- Il sistema di compilazione di Android supporta molti dei sanificatori LLVM, come AddressSanitizer e UndefinedBehaviorSanitizer, che possono essere utilizzati per l'analisi in fase di runtime dei problemi relativi alla memoria. In combinazione con il fuzzing, supportato in Android tramite libFuzzer, i sanificatori possono scoprire casi limite insoliti che richiedono ulteriori indagini.
- Un valutatore della sicurezza esperto deve esaminare il codice a rischio più elevato, come la crittografia, l'elaborazione dei pagamenti e l'elaborazione dei dati PII.
Test automatici
I test automatici possono aiutare a rilevare un'ampia gamma di problemi di sicurezza e devono essere eseguiti regolarmente.
- Esegui regolarmente l'ultima versione di CTS durante il processo di sviluppo per rilevare i problemi in anticipo e ridurre il tempo di correzione. Android utilizza CTS come parte dell'integrazione continua nel nostro processo di compilazione automatico, che viene eseguito più volte al giorno.
- Automatizza i test di sicurezza delle interfacce, inclusi i test con input non validi (fuzz testing). Il sistema di compilazione di Android supporta libFuzzer per la scrittura di test di fuzzing.
Analisi delle vulnerabilità
L'analisi delle vulnerabilità può contribuire a garantire che le app preinstallate siano prive di vulnerabilità di sicurezza note. Il rilevamento avanzato può ridurre il tempo e i costi necessari per risolvere queste vulnerabilità e prevenire i rischi per utenti e dispositivi.
- Analizza tutte le app preinstallate utilizzando uno strumento di analisi 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 applicazioni potenzialmente dannose (PHA). Sei responsabile del comportamento di tutte le app incluse nei tuoi dispositivi. Prima del lancio del dispositivo, analizza tutte le app precaricate per verificare la presenza di vulnerabilità.
Per ulteriori informazioni sulle applicazioni potenzialmente dannose e su come Google le combatte nel Play Store, consulta la documentazione per gli sviluppatori di Google Play Protect.
Installazione e autorizzazioni delle app
Le 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 ad autorizzazioni o privilegi non necessari. Le autorizzazioni app sono descritte in AndroidManifest.xml.
- Non concedere autorizzazioni o privilegi non necessari alle app preinstallate apps. Esamina 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à dell'app specifica.
- Assicurati che sia presente una divulgazione all'utente per tutte le app preinstallate che utilizzano l'autorizzazione
INSTALL_PACKAGES. - Assicurati che lo sviluppatore sia contrattualmente obbligato a non installare app come UID 0.
- Valuta le autorizzazioni dichiarate nel manifest di tutte le app da installare tramite la rete dello sviluppatore.
- Assicurati che lo sviluppatore sia contrattualmente obbligato ad analizzare 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 dei dispositivi 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, ad esempio la chiave dello sviluppatore AOSP.
- Assicurati che le chiavi utilizzate per firmare le app siano gestite in modo coerente con le pratiche standard del settore per la gestione delle chiavi sensibili, incluso un modulo di sicurezza hardware (HSM) che fornisce un accesso limitato e verificabile.
- Assicurati che le app non siano firmate con la chiave della piattaforma. In questo modo, un' app ha accesso alle autorizzazioni di firma della piattaforma, che sono molto potenti e destinate all'uso esclusivo da parte dei componenti del sistema operativo. Le app di sistema devono utilizzare autorizzazioni con privilegi.
- Assicurati che le app con lo stesso nome del pacchetto non siano firmate con chiavi diverse. Questo si verifica spesso quando crei un'app per dispositivi diversi, soprattutto quando utilizzi la chiave della piattaforma. Se l'app è indipendente dal dispositivo, utilizza la stessa chiave su tutti i dispositivi. Se l'app è specifica per il dispositivo, crea nomi di pacchetti univoci per dispositivo e chiave.
Isolare app e processi
Se utilizzato correttamente, il modello di sandbox di Android offre una maggiore sicurezza per app e processi.
Isolare i processi root
I processi root sono il target più frequente degli attacchi di escalation dei privilegi; la riduzione del numero di processi root riduce il rischio di escalation dei privilegi.
- Assicurati che i dispositivi eseguano il codice minimo necessario come root. Se possibile, utilizza un processo Android normale anziché un processo 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.
- Se possibile, il codice root deve essere isolato dai dati non attendibili e accessibile tramite la comunicazione tra processi (IPC). Ad esempio, riduci la funzionalità root a un piccolo servizio accessibile tramite Binder ed esponi il servizio con l'autorizzazione di firma a un'app con privilegi bassi o nulli per gestire il traffico di rete.
- I processi root non devono essere in ascolto su un socket di rete.
- I processi root non devono includere un runtime per uso generico, ad esempio una Java VM.
Isolare le app di sistema
In generale, le app preinstallate non devono essere eseguite con l'identificatore univoco di sistema condiviso (UID). Se è necessario che un'app utilizzi l'UID condiviso del sistema o di un altro servizio con privilegi (ad es. telefono), l'app non deve esportare servizi, broadcast receiver o content provider accessibili 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.
- Se possibile, il codice di sistema deve essere isolato dai dati non attendibili e esporre l'IPC solo ad altri processi attendibili.
- I processi di sistema non devono essere in ascolto su un socket di rete. Questo è un requisito CTS.
Isolare i processi
La sandbox delle applicazioni Android offre alle app un'aspettativa di isolamento da altri processi sul sistema, inclusi processi root e debugger. A meno che il debug non sia specificamente abilitato dall'app e dall'utente, nessuna app deve violare questa aspettativa.
- Assicurati che i processi root non accedano ai dati nelle singole cartelle dei dati delle app, a meno che non utilizzino un metodo di debug Android documentato.
- Assicurati che i processi root non accedano alla memoria delle app, a meno che non utilizzino un metodo di debug Android documentato.
- Assicurati che i dispositivi non includano app che accedano ai dati o alla memoria di altre app o processi.