Dopo aver integrato il livello base della funzionalità SELinux e analizzati in modo approfondito i risultati, puoi aggiungere impostazioni delle norme personalizzate per le tue personalizzazioni per il sistema operativo Android. Queste norme devono comunque Rispettare il Programma di compatibilità Android. e non devono rimuovere le impostazioni predefinite di SELinux.
I produttori non devono rimuovere il criterio SELinux esistente. Altrimenti, rischiano di interrompere l'implementazione di Android SELinux e le sue disciplinare. Sono incluse le applicazioni di terze parti che probabilmente dovranno essere per renderli conformi e operativi. Le domande di partecipazione non devono richiedere per continuare a funzionare sui dispositivi abilitati per SELinux.
Quando inizi a personalizzare SELinux, ricordati di:
- Scrivi criterio SELinux per tutti i nuovi daemon
- Utilizza i domini predefiniti ove appropriato
- Assegna un dominio a qualsiasi processo generato come servizio
init
- Acquisisci familiarità con le macro prima di scrivere i criteri
- Invia le modifiche al criterio principale ad AOSP
Ricorda di non:
- Crea criterio incompatibile
- Consenti la personalizzazione dei criteri relativi agli utenti finali
- Consenti personalizzazioni dei criteri MDM
- Spaventare gli utenti con violazioni delle norme
- Aggiungi backdoor
Consulta la sezione Funzionalità di sicurezza del kernel dell' Android documento di definizione della compatibilità per requisiti specifici.
SELinux utilizza un approccio con whitelist, il che significa che tutti gli accessi devono essere consentito nel criterio. Poiché la piattaforma SELinux predefinita di Android supporta già Android Open Source Project, non è necessario modificare le impostazioni SELinux in alcun modo. Se personalizzi le impostazioni di SELinux, fare molta attenzione a non danneggiare le applicazioni esistenti. Per iniziare:
- Utilizza la Android più recente del kernel.
- Adotta principio del privilegio minimo.
- Gestisci solo le tue aggiunte ad Android. Il criterio predefinito funziona con l'API di Android Open Source il codebase del progetto automaticamente.
- Compartimentare i componenti software in moduli che conducono attività di machine learning.
- Creare criteri SELinux che isolano queste attività da attività non correlate funzioni.
- Inserisci questi criteri in file
*.te
(l'estensione per SELinux file di origine dei criteri) all'interno/device/manufacturer/device-name/sepolicy
e usa le variabiliBOARD_SEPOLICY
per includerle la tua build. - All'inizio, imposta i nuovi domini come permissivi. Questo viene fatto utilizzando un modello permissivo
dichiarazione nel file
.te
del dominio. - Analizza i risultati e perfeziona le tue definizioni di dominio.
- Rimuovi la dichiarazione permissiva quando non vengono visualizzati ulteriori rifiuti in userdebug le build.
Dopo aver integrato la modifica del criterio SELinux, aggiungi un passaggio alla per garantire la compatibilità con SELinux in futuro. In un ideale il processo di sviluppo software, il criterio SELinux cambia solo quando il software le modifiche al modello e non l'implementazione effettiva.
Quando inizi a personalizzare SELinux, verifica innanzitutto le tue aggiunte ad Android. Se hai aggiunto un componente che esegue una nuova funzione, assicurati che il componente soddisfa i criteri di sicurezza di Android, nonché qualsiasi criterio associato creato all'OEM, prima di attivare la modalità di applicazione forzata.
Per evitare inutili problemi, è meglio esagerare e sovracompatibile che troppo restrittiva e incompatibile, il che si traduce in le funzioni del dispositivo. Al contrario, se le tue modifiche saranno vantaggiose per altri, invia le modifiche al criterio SELinux predefinito come patch. Se la patch è applicata al criterio di sicurezza predefinito, non dovrai apportare questa modifica con ogni nuova release di Android.
Esempi di dichiarazioni relative alle norme
SELinux si basa su L4 per computer e, di conseguenza, supporta una serie di macro per risparmiare tempo.
Nell'esempio seguente, a tutti i domini viene concesso l'accesso in lettura o
scrittura in /dev/null
e lettura da /dev/zero
.
# Allow read / write access to /dev/null allow domain null_device:chr_file { getattr open read ioctl lock append write}; # Allow read-only access to /dev/zero allow domain zero_device:chr_file { getattr open read ioctl lock };
La stessa istruzione può essere scritta con SELinux *_file_perms
macro (abbreviazione):
# Allow read / write access to /dev/null allow domain null_device:chr_file rw_file_perms; # Allow read-only access to /dev/zero allow domain zero_device:chr_file r_file_perms;
Norma di esempio
Ecco un esempio completo di criteri per DHCP, che esaminiamo di seguito:
type dhcp, domain; permissive dhcp; type dhcp_exec, exec_type, file_type; type dhcp_data_file, file_type, data_file_type; init_daemon_domain(dhcp) net_domain(dhcp) allow dhcp self:capability { setgid setuid net_admin net_raw net_bind_service }; allow dhcp self:packet_socket create_socket_perms; allow dhcp self:netlink_route_socket { create_socket_perms nlmsg_write }; allow dhcp shell_exec:file rx_file_perms; allow dhcp system_file:file rx_file_perms; # For /proc/sys/net/ipv4/conf/*/promote_secondaries allow dhcp proc_net:file write; allow dhcp system_prop:property_service set ; unix_socket_connect(dhcp, property, init) type_transition dhcp system_data_file:{ dir file } dhcp_data_file; allow dhcp dhcp_data_file:dir create_dir_perms; allow dhcp dhcp_data_file:file create_file_perms; allow dhcp netd:fd use; allow dhcp netd:fifo_file rw_file_perms; allow dhcp netd:{ dgram_socket_class_set unix_stream_socket } { read write }; allow dhcp netd:{ netlink_kobject_uevent_socket netlink_route_socket netlink_nflog_socket } { read write };
Analizziamo l'esempio:
Nella prima riga, la dichiarazione del tipo, il daemon DHCP eredita
criterio di sicurezza di base (domain
). Dall'istruzione precedente
esempi, DHCP può leggere e scrivere su /dev/null
.
Nella seconda riga, DHCP è identificato come dominio permissivo.
Nella riga init_daemon_domain(dhcp)
, il criterio indica che il protocollo DHCP è
generato da init
e può comunicare con questo dispositivo.
Nella riga net_domain(dhcp)
, il criterio consente a DHCP di utilizzare
funzionalità di rete comuni del dominio net
, come la lettura
scrittura di pacchetti TCP, comunicazione su socket e gestione di DNS
richieste.
Nella riga allow dhcp proc_net:file write;
, il criterio indica
DHCP può scrivere su file specifici in /proc
. Questa riga mostra
L'etichettatura granulare dei file di SELinux. Usa l'etichetta proc_net
per limitare l'accesso in scrittura solo ai file in /proc/sys/net
.
L'ultimo blocco dell'esempio che inizia con
allow dhcp netd:fd use;
mostra in che modo le applicazioni possono essere autorizzate
interagiscono tra loro. Il criterio indica che DHCP e netd possono comunicare con
tramite descrittori di file, file FIFO, socket per datagrammi e flussi UNIX
prese di corrente. Il protocollo DHCP può eseguire operazioni di lettura e scrittura solo sui socket datagrammi e su UNIX.
e non aprirli né crearli.
Controlli disponibili
Classe | Autorizzazione |
---|---|
file |
ioctl read write create getattr setattr lock relabelfrom relabelto append unlink link rename execute swapon quotaon mounton |
directory |
add_name remove_name reparent search rmdir open audit_access execmod |
presa |
ioctl read write create getattr setattr lock relabelfrom relabelto append bind connect listen accept getopt setopt shutdown recvfrom sendto recv_msg send_msg name_bind |
filesystem |
mount remount unmount getattr relabelfrom relabelto transition associate quotamod quotaget |
di elaborazione |
fork transition sigchld sigkill sigstop signull signal ptrace getsched setsched getsession getpgid setpgid getcap setcap share getattr setexec setfscreate noatsecure siginh setrlimit rlimitinh dyntransition setcurrent execmem execstack execheap setkeycreate setsockcreate |
sicurezza |
compute_av compute_create compute_member check_context load_policy compute_relabel compute_user setenforce setbool setsecparam setcheckreqprot read_policy |
funzionalità |
chown dac_override dac_read_search fowner fsetid kill setgid setuid setpcap linux_immutable net_bind_service net_broadcast net_admin net_raw ipc_lock ipc_owner sys_module sys_rawio sys_chroot sys_ptrace sys_pacct sys_admin sys_boot sys_nice sys_resource sys_time sys_tty_config mknod lease audit_write audit_control setfcap |
ALTRO |
E MOLTO ALTRO |
regole non consentire mai
Le regole neverallow
di SELinux vietano un comportamento che non dovrebbe mai verificarsi.
Con i test di compatibilità,
Le regole di SELinux neverallow
vengono ora applicate a tutti i dispositivi.
Le seguenti linee guida hanno lo scopo di aiutare i produttori a evitare errori
relative a neverallow
regole durante la personalizzazione. I numeri delle regole
qui utilizzati corrispondono ad Android 5.1 e sono soggetti a modifica in base alla release.
Regola 48: neverallow { domain -debuggerd -vold -dumpstate
-system_server } self:capability sys_ptrace;
Vedi la pagina man di ptrace
. sys_ptrace
consente di ptrace
qualsiasi processo, il che consente una grande
controllo su altri processi e dovrebbero appartenere esclusivamente al sistema designato
descritti nella regola. La necessità di questa funzionalità indica spesso
la presenza di qualcosa che non sia destinato alle build rivolte all'utente
una funzionalità non necessaria. Rimuovi il componente non necessario.
Regola 76: neverallow { domain -appdomain -dumpstate
-shell -system_server -zygote } { file_type -system_file -exec_type }:file execute;
Questa regola ha lo scopo di impedire l'esecuzione di un codice arbitrario sul sistema.
Nello specifico, afferma che viene eseguito solo il codice su /system
,
che consente garanzie di sicurezza grazie a meccanismi come l'Avvio verificato.
Spesso, la soluzione migliore quando si verifica un problema con questo
La regola neverallow
consiste nello spostare il codice in questione nello
/system
partizione.
Personalizzazione di SEPolicy in Android 8.0 e versioni successive
Questa sezione fornisce le linee guida per i criteri SELinux del fornitore in Android 8.0 e in alto, inclusi dettagli su SEPolicy di Android Open Source Project (AOSP) e SEPolicy. Per ulteriori informazioni su come viene mantenuto il criterio SELinux compatibili tra le partizioni e le versioni Android, vedi Compatibilità.
Posizionamento del criterio
In Android 7.0 e versioni precedenti, i produttori di dispositivi potevano aggiungere criteri
BOARD_SEPOLICY_DIRS
, incluse le norme volte ad aumentare le norme AOSP
su diversi tipi di dispositivi. In Android 8.0 e versioni successive, l'aggiunta di un criterio a
BOARD_SEPOLICY_DIRS
posiziona il criterio solo nel fornitore
dell'immagine.
In Android 8.0 e versioni successive, il criterio è presente in AOSP nelle seguenti posizioni:
- system/sepolicy/public. Include il criterio esportato per l'utilizzo
delle norme specifiche del fornitore. È tutto sotto controllo con Android 8.0
infrastruttura di compatibilità.
Le norme pubbliche devono essere applicate a tutte le release, quindi puoi includere
qualsiasi elemento
/public
nel tuo criterio personalizzato. Per questo motivo, il tipo di criterio che può essere inserito in/public
è maggiore limitato. Questo è l'API dei criteri esportate della piattaforma: qualsiasi cosa che con l'interfaccia tra/system
e/vendor
appartiene qui. - system/sepolicy/private. Include i criteri necessari per il funzionamento dell'immagine di sistema, ma di quale criterio relativo all'immagine del fornitore non ne sono a conoscenza.
- system/sepolicy/vendor. Include i criteri per i componenti
essere presenti in
/vendor
, ma essere presenti nell'albero principale della piattaforma (non specifiche del dispositivo). Questo è un artefatto del sistema di compilazione distinzione tra dispositivi e componenti globali; concettualmente si tratta di un parte dei criteri specifici per dispositivo descritti di seguito. - device/manufacturer/device-name/sepolicy. Include criteri specifici per i dispositivi. Include anche le personalizzazioni del dispositivo per che in Android 8.0 e versioni successive corrisponde al criterio relativo ai componenti sull'immagine del fornitore.
In Android 11 e versioni successive, le partizioni di system_ext e prodotto possono includere anche specifici per la partizione. anche system_ext e norme dei prodotti sono suddivisi in pubbliche e private e i fornitori possono utilizzare system_ext come il criterio di sistema.
SYSTEM_EXT_PUBLIC_SEPOLICY_DIRS
. Include il criterio esportato per da usare nelle norme specifiche del fornitore. Installato nella partizione system_ext.SYSTEM_EXT_PRIVATE_SEPOLICY_DIRS
. Include le norme necessarie per il funzionamento dell'immagine system_ext, ma di quale immagine del fornitore delle norme non dovrebbero esserne a conoscenza. Installato nella partizione system_ext.PRODUCT_PUBLIC_SEPOLICY_DIRS
. Include il criterio esportato per da usare nelle norme specifiche del fornitore. Installato nella partizione prodotto.PRODUCT_PRIVATE_SEPOLICY_DIRS
. Include i criteri necessari per il funzionamento dell'immagine prodotto, ma di quali norme relative alle immagini del fornitore non dovrebbero esserne a conoscenza. Installato nella partizione prodotto.
Scenari dei criteri supportati
Sui dispositivi che verranno lanciati con Android 8.0 e versioni successive, l'immagine del fornitore deve funzionare con l'immagine di sistema OEM e l'immagine di sistema AOSP di riferimento fornita da Google (e passa il CTS su questa immagine di riferimento). Questi requisiti assicurano la separazione tra il framework e il codice del fornitore. Questi dispositivi supportano i seguenti scenari.
estensioni solo immagini del fornitore
Esempio: aggiunta di un nuovo servizio a vndservicemanager
che supporta i processi a partire dall'immagine del fornitore.
Come nel caso dei dispositivi che vengono lanciati con le versioni precedenti di Android, aggiungi elementi
personalizzazione in
device/manufacturer/device-name/sepolicy
.
Nuove norme che regolano il modo in cui i componenti del fornitore interagiscono (solo) con un altro fornitore
componenti devono includere tipi presenti solo
device/manufacturer/device-name/sepolicy
.
Il criterio qui scritto consente il funzionamento del codice sul fornitore e non verrà aggiornato
di un OTA solo framework e saranno presenti nel criterio combinato su un dispositivo
con l'immagine di sistema AOSP di riferimento.
il supporto dell'immagine del fornitore con AOSP
Esempio: aggiungere una nuova procedura (registrata con
hwservicemanager
dall'immagine del fornitore) che implementa una
HAL definito da AOSP.
Come per i dispositivi che vengono lanciati con le versioni precedenti di Android, esegui
personalizzazione specifica del dispositivo
device/manufacturer/device-name/sepolicy
.
Il criterio esportato come parte di system/sepolicy/public/
è disponibile
per l'uso e viene spedito come previsto dalle norme per i fornitori. Tipi e attributi di
possono essere usate in nuove regole che dettano le interazioni con i nuovi
i bit specifici del fornitore, fatti salvi i neverallow
limitazioni. Come nel caso del solo fornitore, le nuove norme non verranno aggiornate
nell'ambito di un'agenzia di viaggi online esclusiva e sarà presente nelle norme combinate su una
dispositivo con l'immagine di sistema AOSP di riferimento.
Estensioni solo per immagini di sistema
Esempio: aggiunta di un nuovo servizio (registrato con servicemanager) accessibile solo da altri processi dall'immagine di sistema.
Aggiungi questo criterio a system/sepolicy/private
. Puoi aggiungere altri
processi o oggetti per abilitare la funzionalità in un'immagine di sistema partner, a condizione
non hanno bisogno di interagire
con i nuovi componenti dell'immagine del fornitore,
(nello specifico, questi processi o oggetti devono funzionare completamente senza criterio
l'immagine del fornitore). Il criterio esportato da system/sepolicy/public
è
proprio come per le estensioni
disponibili solo per le immagini dei fornitori. Queste norme sono
parte dell'immagine di sistema e potrebbe essere aggiornata
come OTA solo del framework, ma
non essere presenti quando si utilizza l'immagine di sistema AOSP di riferimento.
immagine del fornitore estensioni che gestiscono componenti AOSP estesi
Esempio: un nuovo HAL non AOSP per l'utilizzo da parte di client estesi che esistono anche nell'immagine di sistema AOSP (come un system_server esteso).
I criteri per l'interazione tra il sistema e il fornitore devono essere inclusi nella
device/manufacturer/device-name/sepolicy
fornita nella partizione del fornitore.
Questo è simile allo scenario di cui sopra, in cui viene aggiunto il supporto delle immagini del fornitore
con l'immagine AOSP di riferimento, ad eccezione dei componenti AOSP modificati
richiedono criteri aggiuntivi per funzionare correttamente con il resto del sistema
(che va bene purché abbiano ancora il tipo AOSP pubblico
etichette).
Criteri per l'interazione dei componenti AOSP pubblici con l'opzione "Solo immagine di sistema"
le estensioni devono essere in system/sepolicy/private
.
immagine di sistema Estensioni che accedono solo alle interfacce AOSP
Esempio:un nuovo processo di sistema non AOSP deve accedere a un HAL su su cui si basa AOSP.
È un processo simile al system-image-only
di estensione, ad eccezione del fatto che i nuovi componenti di sistema possono interagire
system/vendor
. Il criterio per il nuovo componente del sistema deve
vai in system/sepolicy/private
, il che è accettabile a condizione che
attraverso un’interfaccia già definita da AOSP in
system/sepolicy/public
(ovvero i tipi e gli attributi richiesti per
funzionalità sono presenti). Sebbene il criterio possa essere incluso nel report
non potrà utilizzare altri criteri system/sepolicy/private
tipi o modifiche (in qualsiasi modo che possa influire sulle norme) in seguito a un'applicazione
aggiornamento. Le norme possono essere modificate nell'ambito di un'agenzia di viaggi online esclusiva, ma non saranno
presente quando si utilizza un'immagine di sistema AOSP (che non avrà il nuovo sistema
).
immagine del fornitore estensioni che pubblicano nuovi componenti di sistema
Esempio:aggiunta di un nuovo HAL non AOSP da utilizzare in un processo client senza un analogo AOSP (e quindi richiede un proprio dominio).
Simili alle estensioni AOSP
Ad esempio, i criteri per le interazioni tra il sistema e il fornitore devono
device/manufacturer/device-name/sepolicy
la directory spedita nella partizione del fornitore
(per assicurarti che il criterio del sistema non sia a conoscenza dei dettagli specifici del fornitore). Tu
puoi aggiungere nuovi tipi pubblici che estendono il criterio
system/sepolicy/public
; questa operazione va eseguita in aggiunta
criterio AOSP esistente, ovvero non rimuovere il criterio pubblico AOSP. Il nuovo pubblico
tipi possono quindi essere utilizzati per il criterio in system/sepolicy/private
e in
device/manufacturer/device-name/sepolicy
.
Tieni presente che ogni aggiunta a system/sepolicy/public
comporta
complessità, esponendo una nuova garanzia di compatibilità che deve essere monitorata in un
di mapping e che è soggetto ad altre restrizioni. Solo nuovi tipi e
le regole di autorizzazione corrispondenti possono essere aggiunte in system/sepolicy/public
;
e altre dichiarazioni relative alle norme non sono supportati. Inoltre, le nuove
i tipi pubblici non possono essere utilizzati per etichettare direttamente gli oggetti nel
/vendor
criterio.
Scenari delle norme non supportati
I dispositivi che vengono lanciati con Android 8.0 e versioni successive non supportano quanto segue lo scenario delle norme e i relativi esempi.
Aggiuntivo estensioni a immagine di sistema che richiedono l'autorizzazione ai nuovi componenti immagine del fornitore dopo un' OTA basata solo sul framework
Esempio : un nuovo processo di sistema non AOSP, che richiede una dominio, viene aggiunto nella prossima release di Android e deve accedere a un nuovo non AOSP HAL.
Simile a
nuovo
(non AOSP) interazione tra sistemi e componenti del fornitore, tranne il nuovo sistema
viene introdotto in un
OTA solo framework. Il nuovo tipo potrebbe essere aggiunto al criterio in
system/sepolicy/public
, le norme esistenti relative ai fornitori non sono a conoscenza
del nuovo tipo, in quanto monitora solo le norme pubbliche del sistema Android 8.0.
AOSP gestisce tutto questo esponendo le risorse fornite dal fornitore tramite un attributo (ad es.
hal_foo
), ma le estensioni dei partner attributi non lo sono
supportato in system/sepolicy/public
, questo metodo non è disponibile per
criteri dei fornitori. L'accesso deve essere fornito da un tipo pubblico esistente in precedenza.
Esempio : una modifica a un processo di sistema (AOSP o non AOSP) deve cambiare la modalità di interazione con i nuovi componenti non AOSP del fornitore.
Il criterio nell'immagine di sistema deve essere scritto all'insaputa di specifiche
personalizzazioni dei fornitori. Le politiche relative a interfacce specifiche in AOSP sono quindi
esposti tramite attributi in system/sepolicy/public, in modo che i criteri del fornitore
attivare i criteri di sistema futuri che utilizzano questi attributi. Tuttavia,
le estensioni degli attributi in system/sepolicy/public
non sono
supportato, quindi tutti i criteri che determinano l'interazione tra i componenti di sistema
con nuovi componenti del fornitore (e che non sono già gestiti dagli attributi
presente in AOSP system/sepolicy/public
) deve essere in
device/manufacturer/device-name/sepolicy
.
Ciò significa che i tipi di sistema
non possono cambiare
l'accesso consentito ai tipi di fornitori nell'ambito di un'agenzia di viaggi online basata solo su framework.