Nell'ambito del modello di sicurezza di Android, Android utilizza Security-Enhanced Linux (SELinux) per applicare il controllo dell'accesso obbligatorio (MAC) a tutti i processi, anche a quelli in esecuzione con i privilegi di root/superutente (funzionalità Linux). Molte aziende e organizzazioni hanno contribuito all'implementazione di SELinux in Android. Con SELinux, Android può proteggere e limitare meglio i servizi di sistema, controllare l'accesso ai dati delle applicazioni e ai log di sistema, ridurre gli effetti del software dannoso e proteggere gli utenti da potenziali difetti nel codice sui dispositivi mobili.
SELinux si basa sul principio di rifiuto predefinito: tutto ciò che non è esplicitamente consentito viene rifiutato. SELinux può operare in due modalità globali:
- Modalità Permissive, in cui i rifiuti di autorizzazione vengono registrati, ma non applicati.
- Modalità di applicazione, in cui i rifiuti delle autorizzazioni vengono registrati e applicati.
Android include SELinux in modalità di applicazione e un corrispondente criterio di sicurezza che funziona per impostazione predefinita in AOSP. In modalità di applicazione forzata, le azioni non consentite vengono impedite e tutti i tentativi di violazione vengono registrati dal kernel in dmesg
e logcat
. Durante lo sviluppo, devi
utilizzare questi errori per perfezionare il software e le norme SELinux prima di applicarle. Per maggiori dettagli, consulta Implementazione di SELinux.
SELinux supporta anche una modalità per dominio permissiva in cui è possibile impostare come permissivi determinati domini (processi) e il resto del sistema in modalità di applicazione globale. Un dominio è semplicemente un'etichetta che identifica un processo o un insieme di processi nel criterio di sicurezza, in cui tutti i processi etichettati con lo stesso dominio vengono trattati in modo identico dal criterio di sicurezza. La modalità permissiva per dominio consente l'applicazione incrementale di SELinux a una parte sempre maggiore del sistema e allo sviluppo di criteri per i nuovi servizi (mantenendo attivo il resto del sistema).
Sfondo
Il modello di sicurezza di Android si basa in parte sul concetto di sandbox per le applicazioni. Ogni applicazione viene eseguita nella propria sandbox. Prima di Android 4.3, queste sandbox erano definite dalla creazione di un UID Linux univoco per ogni applicazione al momento dell'installazione. Android 4.3 e versioni successive utilizzano SELinux per definire ulteriormente i confini della sandbox applicazioni Android.
In Android 5.0 e versioni successive, SELinux viene applicato completamente, sulla base della release permissiva di Android 4.3 e dell'applicazione parziale di Android 4.4.
Con questa modifica, Android è passato dall'applicazione delle norme a un insieme limitato di domini fondamentali (installd
, netd
, vold
e zygote
) a tutti i domini (più di 60). Nello specifico:
- Tutto è in modalità di applicazione in Android 5.x e versioni successive.
- Nel dominio
init
non devono essere eseguite altre procedure oltre ainit
. - Qualsiasi rifiuto generico (per
block_device
,socket_device
,default_service
) indica che il dispositivo ha bisogno di un dominio speciale.
Android 6.0 ha reso più sicuro il sistema riducendo la permissività delle nostre norme per includere un migliore isolamento tra gli utenti, il filtraggio IOCTL, una minore minaccia dei servizi esposti, un ulteriore rafforzamento dei domini SELinux e un accesso /proc
estremamente limitato.
Android 7.0 ha aggiornato la configurazione di SELinux per bloccare ulteriormente la sandbox dell'applicazione e ridurre la superficie di attacco. Questa release ha anche suddiviso lo stack mediaserver monolitico in processi più piccoli per ridurre l'ambito delle relative autorizzazioni. Per maggiori dettagli, consulta Proteggere Android con più difese del kernel di Linux e Migliorare la sicurezza dello stack multimediale.
Android 8.0 ha aggiornato SELinux in modo che funzioni con Treble, che separa il codice del fornitore di livello inferiore dal framework di sistema Android. Questa release ha aggiornato il criterio SELinux per consentire ai produttori di dispositivi e ai fornitori di SOC di aggiornare le proprie parti del criterio, creare le proprie immagini (vendor.img
, boot.img
e così via) e poi aggiornarle indipendentemente dalla piattaforma o viceversa.
Sebbene sia possibile avere una versione della piattaforma (framework) superiore/più recente in esecuzione sul dispositivo, il caso opposto non è supportato; le immagini del fornitore (vendor.img/odm.img
) non possono avere una versione più recente della piattaforma (system.img
). Pertanto, una versione più recente della piattaforma potrebbe introdurre problemi di compatibilità con SELinux perché il criterio SELinux della piattaforma è di una versione più recente rispetto alle parti SELinux del fornitore del criterio. Il modello Android 8.0 fornisce un metodo per mantenere la compatibilità al fine di evitare OTA simultanee non necessarie.
Risorse aggiuntive
Per assistenza nella creazione di criteri SELinux utili, consulta le seguenti risorse.
- Il notebook SELinux, un riferimento aggiornato per SELinux. Questo documento contiene ulteriori dettagli sul linguaggio dei criteri, sul significato di ciascuna delle parole chiave e su come vengono calcolati i contesti di sicurezza.
- Guida illustrata alla applicazione dei criteri SELinux
- Miglioramenti alla sicurezza per Linux
- Android con funzionalità di sicurezza avanzate (SE): introduzione di MAC flessibile ad Android
- Implementazione di SELinux come modulo di sicurezza Linux
- Configurazione del criterio SELinux