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 incoraggia fortemente la revisione del codice sorgente sia manuale che automatizzata.

  • Segui le linee guida complete sulla sicurezza quando conduci revisioni per garantire la copertura. Utilizzare 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 di 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 Android supporta molti disinfettanti LLVM, come AddressSanitizer e UnfineBehaviorSanitizer , che possono essere utilizzati per l'analisi di runtime di problemi relativi alla memoria. In combinazione con il fuzzing, supportato in Android tramite libFuzzer , i disinfettanti possono scoprire casi limite insoliti che richiedono ulteriori indagini.
  • Un valutatore della sicurezza esperto dovrebbe esaminare il codice a rischio più elevato, come criptovalute, elaborazione dei pagamenti ed elaborazione delle PII.

Test automatizzati

I test automatizzati possono aiutare a rilevare un’ampia gamma di problemi di sicurezza e dovrebbero essere eseguiti regolarmente.

  • Esegui regolarmente la versione più recente di CTS durante tutto il processo di sviluppo per rilevare tempestivamente i problemi e ridurre i tempi di correzione. Android utilizza CTS come parte dell'integrazione continua nel nostro processo di compilazione automatizzata, che viene creata più volte al giorno.
  • Automatizza i test di sicurezza delle interfacce, inclusi i test con input non validi (test fuzz). Il sistema di compilazione di Android supporta libFuzzer per la scrittura di test fuzz.

Scansione delle vulnerabilità

La scansione delle vulnerabilità può aiutare 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 affrontare queste vulnerabilità e prevenire i rischi per utenti e dispositivi.

  • Esegui la scansione di tutte le app preinstallate utilizzando uno strumento di scansione delle vulnerabilità delle app riconosciuto nel settore e risolvi le vulnerabilità rilevate.

Applicazioni potenzialmente dannose

È importante assicurarsi che le app preinstallate sul tuo dispositivo non siano applicazioni potenzialmente dannose (PHA). Sei responsabile del comportamento di tutte le app incluse sui tuoi dispositivi. Prima del lancio del dispositivo, scansiona tutte le app precaricate per individuare eventuali vulnerabilità.

Per ulteriori informazioni sui PHA e su come Google li sta combattendo nel Play Store, consulta la documentazione per gli sviluppatori di Google Play Protect .

Installazione e autorizzazioni dell'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 ad autorizzazioni o privilegi non necessari. Le autorizzazioni dell'app sono descritte in AndroidManifest.xml .

  • Non concedere autorizzazioni o privilegi non necessari alle app preinstallate. Esamina attentamente le app con privilegi di sistema poiché potrebbero avere autorizzazioni molto sensibili.
  • Assicurati che tutte le autorizzazioni richieste siano pertinenti e necessarie per la funzionalità di quella specifica app.
  • Assicurati che vi sia la divulgazione dell'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 a scansionare tutti gli URL di download delle app di aggiornamento automatico e di installazione con l'API Navigazione sicura di Google prima di fornire app al 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 si seleziona una chiave da utilizzare per firmare le app, è importante considerare se un'app sarà disponibile solo su un singolo dispositivo o comune su più dispositivi.

  • Assicurati che le app non siano firmate con una chiave pubblicamente nota, come 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 l'app può accedere alle autorizzazioni di firma della piattaforma, che sono molto potenti e destinate ad essere utilizzate solo dai componenti del sistema operativo. Le app di sistema dovrebbero utilizzare autorizzazioni privilegiate.
  • Assicurati che le app con lo stesso nome di pacchetto non siano firmate con chiavi diverse. Ciò si verifica spesso quando si crea un'app per dispositivi diversi, soprattutto quando si utilizza la chiave della piattaforma. Se l'app è indipendente dal dispositivo, utilizza la stessa chiave su tutti i dispositivi. Se l'app è specifica del dispositivo, crea nomi di pacchetto univoci per dispositivo e chiave.

Isolare app e processi

Il modello sandboxing di Android fornisce ulteriore sicurezza per app e processi se utilizzati correttamente.

Isolare i processi root

I processi root sono l'obiettivo 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. Ove possibile, utilizza un normale processo Android anziché un processo root. Se un processo deve essere eseguito come root su un dispositivo, documenta il processo in una richiesta di funzionalità AOSP in modo che possa essere esaminato pubblicamente.
  • Ove possibile, il codice root dovrebbe essere isolato dai dati non attendibili e accessibile tramite comunicazione interprocesso (IPC). Ad esempio, riduci la funzionalità root a un piccolo servizio accessibile tramite Binder ed esponi il servizio con l'autorizzazione della 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 di uso generale, come una Java VM).

Isolamento delle app di sistema

In generale, le app preinstallate non devono essere eseguite con l'identificatore univoco del sistema condiviso (UID). Se è necessario che un'app utilizzi l'UID condiviso del sistema o un altro servizio privilegiato (ad esempio, il telefono), l'app non deve esportare servizi, ricevitori di trasmissione o fornitori di contenuti a cui possono accedere app di terze parti installate dagli utenti .

  • Assicurarsi che i dispositivi eseguano il codice minimo necessario come sistema. Ove possibile, utilizza un processo Android con il proprio UID anziché riutilizzare l'UID di sistema.
  • Ove possibile, il codice di sistema dovrebbe essere isolato dai dati non attendibili ed esporre IPC solo ad altri processi attendibili.
  • I processi di sistema non devono essere in ascolto su un socket di rete. Questo è un requisito del CTS.

Processi isolanti

Android Application Sandbox fornisce alle app un'aspettativa di isolamento da altri processi nel sistema, inclusi processi root e debugger. A meno che il debug non sia specificamente abilitato dall'app e dall'utente, nessuna app dovrebbe violare tale aspettativa.

  • Assicurati che i processi root non accedano ai dati all'interno delle cartelle di dati delle singole app, a meno che non utilizzino un metodo di debug Android documentato.
  • Assicurarsi che i processi root non accedano alla memoria delle app, a meno che non si utilizzi 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.