Sandbox dell'applicazione

La piattaforma Android sfrutta la protezione basata sugli utenti Linux per identificare e isolare le risorse dell'app. Ciò isola le app le une dalle altre e protegge le app e il sistema da app dannose. Per fare ciò, Android assegna un ID utente univoco (UID) a ciascuna applicazione Android e la esegue nel proprio processo.

Android utilizza l'UID per impostare una sandbox dell'applicazione a livello di kernel. Il kernel impone la sicurezza tra le app e il sistema a livello di processo tramite funzionalità Linux standard come ID utente e gruppo assegnati alle app. Per impostazione predefinita, le app non possono interagire tra loro e hanno accesso limitato al sistema operativo. Se l'app A tenta di eseguire operazioni dannose, ad esempio leggere i dati dell'applicazione B o chiamare il telefono senza autorizzazione, le viene impedito di farlo perché non dispone dei privilegi utente predefiniti appropriati. Il sandbox è semplice, verificabile e basato su una separazione utente dei processi e dei permessi dei file vecchia di decenni in stile UNIX.

Poiché l'Application Sandbox si trova nel kernel, questo modello di sicurezza si estende sia al codice nativo che alle applicazioni del sistema operativo. Tutto il software sopra il kernel, come le librerie del sistema operativo, il framework dell'applicazione, il runtime dell'applicazione e tutte le applicazioni, vengono eseguiti all'interno dell'Application Sandbox. Su alcune piattaforme, gli sviluppatori sono vincolati a uno specifico framework di sviluppo, set di API o linguaggio. Su Android non esistono restrizioni su come può essere scritta un'applicazione necessarie per garantire la sicurezza; a questo proposito, il codice nativo è sandboxed quanto il codice interpretato.

Protezioni

In genere, per uscire dall'Application Sandbox in un dispositivo correttamente configurato, è necessario compromettere la sicurezza del kernel Linux. Tuttavia, analogamente ad altre funzionalità di sicurezza, le protezioni individuali che implementano la sandbox dell'applicazione non sono invulnerabili, quindi una difesa approfondita è importante per evitare che singole vulnerabilità causino la compromissione del sistema operativo o di altre app.

Android si basa su una serie di protezioni per applicare la sandbox dell'applicazione. Queste implementazioni sono state introdotte nel tempo e hanno rafforzato in modo significativo il sandbox di controllo degli accessi discrezionali (DAC) originale basato su UID. Le versioni precedenti di Android includevano le seguenti protezioni:

  • In Android 5.0, SELinux forniva la separazione obbligatoria del controllo di accesso (MAC) tra il sistema e le app. Tuttavia, tutte le app di terze parti venivano eseguite nello stesso contesto SELinux, quindi l'isolamento tra le app veniva applicato principalmente dall'UID DAC.
  • In Android 6.0, il sandbox SELinux è stato esteso per isolare le app oltre il confine per utente fisico. Inoltre, Android imposta anche valori predefiniti più sicuri per i dati delle applicazioni: per le app con targetSdkVersion >= 24 , le autorizzazioni DAC predefinite sulla home directory di un'app sono cambiate da 751 a 700. Ciò ha fornito valori predefiniti più sicuri per i dati delle app private (sebbene le app possano sovrascrivere queste impostazioni predefinite) .
  • In Android 8.0, tutte le app erano impostate per essere eseguite con un filtro seccomp-bpf che limitava le chiamate di sistema consentite alle app, rafforzando così il confine tra app e kernel.
  • In Android 9 tutte le app non privilegiate con targetSdkVersion >= 28 devono essere eseguite in sandbox SELinux individuali, fornendo MAC in base all'app. Questa protezione migliora la separazione delle app, impedisce l'override delle impostazioni predefinite sicure e (soprattutto) impedisce alle app di rendere accessibile il proprio mondo di dati.
  • In Android 10 le app hanno una visione grezza limitata del filesystem, senza accesso diretto a percorsi come /sdcard/DCIM. Tuttavia, le app mantengono l'accesso non elaborato completo ai percorsi specifici del pacchetto, come restituito da qualsiasi metodo applicabile, come Context.getExternalFilesDir() .

Linee guida per la condivisione di file

Impostare i dati delle app come accessibili a tutto il mondo è una pratica di sicurezza inadeguata. L'accesso è concesso a tutti e non è possibile limitare l'accesso solo ai destinatari previsti. Questa pratica ha portato a fughe di divulgazione di informazioni e confuse vulnerabilità, ed è un obiettivo preferito per il malware che prende di mira le app con dati sensibili (come i client di posta elettronica). In Android 9 e versioni successive, la condivisione di file in questo modo è esplicitamente vietata per le app con targetSdkVersion>=28 .

Invece di rendere i dati delle app accessibili a tutti, utilizza le seguenti linee guida quando condividi file:

  • Se la tua app deve condividere file con un'altra app, utilizza un provider di contenuti . I fornitori di contenuti condividono i dati con la granularità adeguata e senza i numerosi svantaggi delle autorizzazioni UNIX accessibili a livello mondiale (per i dettagli, fare riferimento a Nozioni di base sui fornitori di contenuti ).
  • Se la tua app contiene file che dovrebbero essere effettivamente accessibili a tutti (come le foto), devono essere specifici del supporto (solo foto, video e file audio) e archiviati utilizzando la classe MediaStore . (Per ulteriori dettagli su come aggiungere un elemento multimediale, vedere Accedere ai file multimediali dall'archivio condiviso .)

L'autorizzazione di runtime di archiviazione controlla l'accesso alle raccolte fortemente tipizzate tramite MediaStore . Per accedere a file con tipizzazione debole come PDF e la classe MediaStore.Downloads , le app devono utilizzare intent come l'intento ACTION_OPEN_DOCUMENT .

Per abilitare il comportamento di Android 10, utilizza l'attributo manifest requestLegacyExternalStorage e segui le best practice per le autorizzazioni dell'app .

  • Il valore predefinito del flag manifest è true per le app destinate ad Android 9 (e versioni precedenti).
  • Il valore predefinito è false per le app destinate ad Android 10. Per disattivare temporaneamente la visualizzazione filtrata dello spazio di archiviazione nelle app destinate ad Android 10, imposta il valore del flag manifest su true .
  • Utilizzando autorizzazioni limitate, il programma di installazione inserisce nella whitelist le app consentite per l'archiviazione non sandbox. Le app non autorizzate sono sandbox.