Le funzionalità consentono ai processi Linux di eliminare la maggior parte dei privilegi di tipo root mantenendo il sottoinsieme di privilegi necessari per svolgere la propria funzione. L'implementazione originale delle funzionalità impediva ai processi fork+exec di ereditare le funzionalità, a meno che i file eseguiti non avessero funzionalità di file configurate. Le funzionalità dei file, a loro volta, presentano un rischio per la sicurezza poiché qualsiasi processo che esegue un file con funzionalità dei file può ottenere queste funzionalità.
Le funzionalità ambientali consentono ai servizi di sistema avviati da init di configurare
le funzionalità nei file .rc
, riunendo la configurazione in
un unico file anziché suddividerla nel file
fs_config.c
. Ciò significa che per qualsiasi servizio avviato da
init, puoi utilizzare il file .rc
associato al servizio per
configurare le funzionalità per quel servizio.
Le funzionalità ambientali sono il meccanismo preferito per impostare le funzionalità
per i servizi avviati da init (questo metodo mantiene tutti gli aspetti della configurazione del servizio
in un unico file .rc
). Ti consigliamo di utilizzare le funzionalità ambientali anziché configurare le funzionalità del file system utilizzando la sezione caps nei file config.fs
.
Quando imposti le funzionalità per i servizi non avviati da init,
continua a configurare le funzionalità del file system utilizzando
fs_config.c
.
Attivare le funzionalità ambient
Per attivare le funzionalità ambientali per un determinato servizio, utilizza la parola chiave
capabilities
in init. Per i dettagli sulla lingua
iniziale attuale, consulta il
file README.md di init.
Ad esempio, per attivare le funzionalità ambientali per il servizio AOSP
wificond
, il
file.rc
per il servizio wificond
configura l'utente e i gruppi appropriati e concede al servizio le funzionalità specificate utilizzando la parola chiave capabilities
:
service wificond /system/bin/wificond class main user wifi group wifi net_raw net_admin capabilities NET_RAW NET_ADMIN
Implementazione di riferimento
L'implementazione di riferimento è il kernel comune di Android https://android.googlesource.com/kernel/common/
Patch richieste
Le patch richieste sono state eseguite su tutte le filiali del kernel comune Android pertinenti.
La patch principale per le funzionalità ambientali https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=58319057b7847667f0c9585b9de0e8932b0fdb08 è stata eseguita in:
- android-3.18:
- android-4.1:
È stato eseguito il backporting di una piccola correzione della sicurezza https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=b7f76ea2ef6739ee484a165ffbac98deb855d3d3 in:
- android-3.18:
- android-4.1:
Convalida
I test delle unità Bionic includono test delle unità per le funzionalità ambientali. Inoltre, l'utilizzo della parola chiave "capabilities" in Android init per un servizio e la verifica che il servizio ottenga le funzionalità previste consentirebbe di testare in fase di runtime questa funzionalità.