Best practice per la sicurezza delle app

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 la revisione manuale e automatica del codice sorgente.

  • Segui indicazioni complete sulla sicurezza quando esegui le revisioni per garantire la copertura. Utilizza standard interni o esterni pertinenti per garantire revisioni coerenti e complete.
  • Esegui un linter, ad esempio Android Studio Linter, su tutto il codice dell'app utilizzando l'SDK Android e correggi eventuali problemi identificati.
  • Analizza il codice nativo utilizzando uno strumento automatizzato in grado di rilevare problemi di gestione della memoria, come overflow del buffer ed errori off-by-one.
  • Il sistema di build 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 esperto di valutazione della sicurezza deve esaminare il codice a rischio più elevato, ad esempio crittografia, elaborazione dei pagamenti ed elaborazione dei dati PII.

Test automatici

I test automatizzati 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 necessario per la correzione. Android utilizza CTS nell'ambito dell'integrazione continua nel nostro processo di compilazione automatizzato, che viene eseguito più volte al giorno.
  • Automatizza i test di sicurezza delle interfacce, inclusi i test con input malformati (fuzzing). Il sistema di build di Android supporta libFuzzer per la scrittura di test fuzzing.

Analisi delle vulnerabilità

La scansione delle vulnerabilità può contribuire a garantire 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 utenti e dispositivi.

  • Scansiona 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 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 rilevare eventuali vulnerabilità.

Per ulteriori informazioni sulle app 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

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 dell'app sono descritte nel file AndroidManifest.xml.

  • Non concedere autorizzazioni o privilegi non necessari alle app preinstallate. Esamina attentamente le app con privilegi di sistema, in quanto possono disporre di 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 sia obbligato contrattualmente 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 obbligato contrattualmente a 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 dei dispositivi e vengono utilizzate per controlli delle autorizzazioni e aggiornamenti software. Quando selezioni una chiave da utilizzare per firmare le app, è importante considerare se un'app è disponibile solo su un singolo dispositivo o su più dispositivi.

  • Assicurati che le app non siano firmate con una chiave nota pubblicamente, ad esempio la chiave per sviluppatori 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 controllabile.
  • Assicurati che le app non siano firmate con la chiave della piattaforma. In questo modo, un'app ha accesso alle autorizzazioni con firma della piattaforma, che sono molto potenti e destinate all'uso esclusivo 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. Ciò 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

Il modello di sandboxing di Android fornisce una maggiore sicurezza per app e processi se utilizzato correttamente.

Isolare i processi root

I processi root sono il bersaglio più frequente degli attacchi di escalation dei privilegi; ridurre il 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 una procedura Android normale anziché una procedura 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 root deve essere isolato dai dati non attendibili e accessibile tramite la comunicazione interprocesso (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 generico, ad esempio una VM Java.

Isolare le app di sistema

In generale, 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. telefono), l'app non deve esportare servizi, ricevitori di trasmissioni o fornitori di contenuti a cui possono accedere 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 un proprio UID anziché riutilizzare l'UID di sistema.
  • Ove 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 dell'applicazione Android offre alle app l'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 all'interno delle singole cartelle di 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 accedono ai dati o alla memoria di altre app o processi.