Controllo di accesso discrezionale (DAC)

Gli oggetti e i servizi del file system aggiunti alla build richiedono spesso ID univoci separati, noti come ID Android (AID). Attualmente, molte risorse come file e servizi utilizzano gli AID di base (definiti da Android) inutilmente; in molti casi è invece possibile utilizzare gli AID OEM (definiti dall'OEM).

Le versioni precedenti di Android (Android 7.x e abbassare) ha esteso il meccanismo di AIDS utilizzando un dispositivo specifico android_filesystem_config.h file per specificare le funzionalità del filesystem e / o personalizzati OEM AIDS. Tuttavia, questo sistema non era intuitivo in quanto non supportava l'uso di bei nomi per gli AID OEM, richiedendo di specificare il numero grezzo per i campi utente e gruppo senza un modo per associare un nome descrittivo all'AID numerico.

Le versioni più recenti di Android (Android 8.0 e successive) supportano un nuovo metodo per estendere le capacità del filesystem. Questo nuovo metodo supporta quanto segue:

  • Più percorsi di origine per i file di configurazione (abilita configurazioni di build estensibili).
  • Controllo dell'integrità in fase di costruzione dei valori di OEM AID.
  • Generazione di un'intestazione AID OEM personalizzata che può essere utilizzata nei file di origine secondo necessità.
  • Associazione di un nome descrittivo con il valore effettivo di OEM AID. Supporta argomenti stringa non numerici per utente e gruppo, ad esempio "pippo" invece di "2901".

Ulteriori miglioramenti includono la rimozione delle android_ids[] matrice da system/core/libcutils/include/private/android_filesystem_config.h . Questa matrice esiste attualmente in Bionic come matrice completamente privata generata, con funzioni di accesso via getpwnam() e getgrnam() . (Questo ha l'effetto collaterale di produrre binari stabili come coadiuvanti fondamentali sono modificate.) Per gli utensili e un file README con maggiori dettagli, vedere build/make/tools/fs_config .

Aggiunta di ID Android (AID)

Android 8.0 rimosso le android_ids[] di matrice dal progetto open source Android (AOSP). Tutti i nomi AID-friendly sono invece generati dal system/core/libcutils/include/private/android_filesystem_config.h file di intestazione quando si generano le Bionic android_ids[] array. Qualsiasi define corrispondenza AID_* viene prelevato dal utensili e * diventa il nome minuscolo.

Per esempio, in private/android_filesystem_config.h :

#define AID_SYSTEM 1000

diventa:

  • Nome amichevole: sistema
  • uid: 1000
  • gid: 1000

Per aggiungere un nuovo aiuto nucleo AOSP, è sufficiente aggiungere il #define al android_filesystem_config.h file di intestazione. L'AID verrà generato al momento della compilazione e reso disponibile alle interfacce che utilizzano argomenti utente e gruppo. Gli strumenti convalidano che il nuovo AID non rientra nelle gamme APP o OEM; rispetta anche le modifiche a tali intervalli e dovrebbe riconfigurarsi automaticamente in caso di modifiche o nuovi intervalli riservati dall'OEM.

Configurazione degli AID

Per attivare il nuovo meccanismo di AIDS, insieme TARGET_FS_CONFIG_GEN nel BoardConfig.mk file. Questa variabile contiene un elenco di file di configurazione, consentendo di aggiungere file secondo necessità.

Per convenzione, i file di configurazione utilizzare il nome config.fs , ma in pratica è possibile utilizzare qualsiasi nome. config.fs file sono in formato ini Python ConfigParser e includono una sezione tappi (per configurare le funzionalità del file system) e una sezione AIDS (per la configurazione OEM AIDS).

Configurazione della sezione tappi

I supporti sezione tappi di impostazione capacità del file system sul filesystem oggetti all'interno del build (il filesystem stesso deve anche supportare questa funzionalità).

Perché l'esecuzione di un servizio stabile come root in Android provoca un Compatibility Test Suite (CTS) fallimento, i requisiti precedenti per mantenere una capacità durante l'esecuzione di un processo o un servizio in esame la creazione di capacità quindi utilizzando setuid / setgid ad una vera e propria AID per l'esecuzione. Con le maiuscole, puoi saltare questi requisiti e fare in modo che il kernel lo faccia per te. Quando il controllo è consegnato al main() , il processo ha già le capacità di cui ha bisogno in modo che il servizio può utilizzare un utente non root e del gruppo (questo è il modo preferito per l'avvio dei servizi privilegiati).

La sezione delle maiuscole utilizza la seguente sintassi:

Sezione Valore Definizione
[path] Il percorso del filesystem da configurare. Un percorso che termina con / è considerato una directory, altrimenti è un file.

È un errore di specificare più sezioni con lo stesso [path] in file diversi. Nelle versioni Python <= 3.2, lo stesso file può contenere sezioni che sovrascrivono la sezione precedente; in Python 3.2, è impostato sulla modalità rigorosa.
mode Modalità file ottale Una modalità file ottale valida di almeno 3 cifre. Se viene specificato 3, è preceduto da uno 0, altrimenti la modalità viene utilizzata così com'è.
user AID_<utente> O il C define un valido aiuto o il nome descrittivo (ad esempio sia AID_RADIO e radio sono accettabili). Per definire un AID personalizzata, vedere Configurazione della sezione AID .
group AID_<gruppo> Uguale all'utente.
caps tappo* Il nome, come dichiarato nel bionic/libc/kernel/uapi/linux/capability.h senza lo CAP_ . Caso misto consentito. I cappucci possono anche essere il grezzo:
  • binario (0b0101)
  • ottale (0455)
  • intero (42)
  • esadecimale (0xFF)
Separare più maiuscole utilizzando spazi bianchi.

Per un esempio di utilizzo, vedere Utilizzando le funzionalità di file system .

Configurazione della sezione AIUTI

La sezione AID contiene gli AID OEM e utilizza la seguente sintassi:

Sezione Valore Definizione
[AID_<name>] Il <name> può contenere caratteri nel set maiuscole, numeri e trattini. La versione minuscola viene utilizzata come nome descrittivo. Il file di intestazione generato per l'inclusione di codice utilizza l'esatto AID_<name> .

È un errore di specificare più sezioni con lo stesso AID_<name> (case insensitive con gli stessi vincoli come [path] ).

<name> deve iniziare con un nome di partizione per garantire che non è così in conflitto con fonti diverse.
value <numero> Una stringa numerica in stile C valida (esadecimale, ottale, binaria e decimale).

È un errore specificare più sezioni con la stessa opzione di valore.

Opzioni di valore deve essere specificato nel campo corrispondente alla partizione utilizzata in <name> . L'elenco delle partizioni validi e le gamme corrispondenti è definito in system/core/libcutils/include/private/android_filesystem_config.h . Le opzioni sono:
  • Partizione fornitore
    • AID_OEM_RESERVED_START(2900) - AID_OEM_RESERVED_END(2999)
    • AID_OEM_RESERVED_2_START(5000) - AID_OEM_RESERVED_2_END(5999)
  • Partizione di sistema
    • AID_SYSTEM_RESERVED_START(6000) - AID_SYSTEM_RESERVED_END(6499)
  • Partizione ODM
    • AID_ODM_RESERVED_START(6500) - AID_ODM_RESERVED_END(6999)
  • Partizione del prodotto
    • AID_PRODUCT_RESERVED_START(7000) - AID_PRODUCT_RESERVED_END(7499)
  • Partizione System_ext
    • AID_SYSTEM_EXT_RESERVED_START(7500) - AID_SYSTEM_EXT_RESERVED_END(7999)

Per esempi di utilizzo, vedere i nomi SOCCORSO Definizione OEM e Utilizzando OEM AIDS .

Esempi di utilizzo

Gli esempi seguenti descrivono in dettaglio come definire e utilizzare un AID OEM e come abilitare le funzionalità del filesystem. Nomi OEM SOCCORSO ([nome AID_]) devono iniziare con un nome di partizione, ad esempio "vendor_" per garantire che non siano in conflitto con i futuri nomi AOSP o altre partizioni.

Definizione dei nomi di OEM AID

Per definire un aiuto OEM, creare un config.fs file e impostare il valore AID. Ad esempio, in device/x/y/config.fs , impostare la seguente:

[AID_VENDOR_FOO]
value: 2900

Dopo aver creato il file, impostare la TARGET_FS_CONFIG_GEN variabile e punto ad esso in BoardConfig.mk . Ad esempio, nel device/x/y/BoardConfig.mk , impostare il seguente:

TARGET_FS_CONFIG_GEN += device/x/y/config.fs

Il tuo AID personalizzato ora può essere consumato dal sistema in generale su una nuova build.

Utilizzo di AID OEM

Per utilizzare un AID OEM, nel codice C, includere i oemaids_headers nel Makefile associati e aggiungere #include "generated_oem_aid.h" , quindi iniziare a utilizzare gli identificatori dichiarati. Per esempio, in my_file.c , aggiungere la seguente:

#include "generated_oem_aid.h"
…

If (ipc->uid == AID_VENDOR_FOO) {
  // Do something
...

Nel vostro associato Android.bp file, aggiungere il seguente:

header_libs: ["oemaids_headers"],

Se stai usando un Android.mk di file, aggiungere il seguente:

LOCAL_HEADER_LIBRARIES := oemaids_headers

Uso di nomi amichevoli

In Android 9, puoi utilizzare il nome descrittivo per qualsiasi interfaccia che supporti i nomi AID. Per esempio:

  • In un chown comando in some/init.rc :
    chown vendor_foo /vendor/some/vendor_foo/file
    
  • In un service in some/init.rc :
    service vendor_foo /vendor/bin/foo_service
        user vendor_foo
        group vendor_foo
    

Poiché la mappatura interna da nome descrittivo per uid viene eseguita da /vendor/etc/passwd e /vendor/etc/group , la partizione fornitore deve essere montata.

Associazione di nomi amichevoli

Android 9 include il supporto per l'associazione di un nome descrittivo al valore effettivo di OEM AID. È possibile utilizzare argomenti stringa non numerici per l'utente e di gruppo, vale a dire "vendor_ pippo" invece di "2901".

Conversione da AID a nomi amichevoli

Per OEM AIDS , 8.x Android richiesto l'utilizzo di oem_#### con getpwnam e funzioni simili, come pure in luoghi che le ricerche maniglia tramite getpwnam (come init script). In Android 9, è possibile utilizzare i getpwnam e getgrnam amici in Bionic per la conversione da Android ID (AIDS) ai nomi amichevoli e viceversa.

Utilizzo delle funzionalità del file system

Per abilitare le funzionalità di file system, creare una sezione di tappi nel config.fs file. Ad esempio, nel device/x/y/config.fs , aggiungere la seguente sezione:

[system/bin/foo_service]
mode: 0555
user: AID_VENDOR_FOO
group: AID_SYSTEM
caps: SYS_ADMIN | SYS_NICE

Dopo aver creato il file, impostare il TARGET_FS_CONFIG_GEN a punto a tale file in BoardConfig.mk . Ad esempio, nel device/x/y/BoardConfig.mk , impostare il seguente:

TARGET_FS_CONFIG_GEN += device/x/y/config.fs

Quando il servizio vendor_ foo viene eseguito, si inizia con capacità CAP_SYS_ADMIN e CAP_SYS_NICE senza setuid e setgid chiamate. Inoltre, il vendor_ foo policy SELinux di servizio non ha più bisogno capacità di setuid e setgid e può essere eliminato.

Configurazione delle sostituzioni (Android 6.x-7.x)

Android 6.0 rilocato fs_config e definizioni struttura associata ( system/core/include/private/android_filesystem_config.h ) al system/core/libcutils/fs_config.c dove potrebbero essere aggiornate o sostituite da file binari installati in /system/etc/fs_config_dirs e /system/etc/fs_config_files . L'utilizzo di regole di corrispondenza e analisi separate per directory e file (che potrebbero utilizzare espressioni glob aggiuntive) ha consentito ad Android di gestire directory e file in due tabelle diverse. Definizioni di strutture in system/core/libcutils/fs_config.c non solo ha permesso la lettura runtime di directory e file, ma il padrone di casa potrebbe utilizzare gli stessi file durante il tempo di costruzione per le immagini filesystem costrutto come ${OUT}/system/etc/fs_config_dirs e ${OUT}/system/etc/fs_config_files .

Sebbene il metodo di override per estendere il filesystem sia stato sostituito dal sistema di configurazione modulare introdotto in Android 8.0, se lo si desidera, è ancora possibile utilizzare il vecchio metodo. Le sezioni seguenti descrivono in dettaglio come generare e includere i file di sovrascrittura e configurare il filesystem.

Generazione di file di sovrascrittura

È possibile generare i binari file allineate /system/etc/fs_config_dirs e /system/etc/fs_config_files utilizzando l' fs_config_generate strumento di build/tools/fs_config . Lo strumento utilizza una libcutils funzione di libreria ( fs_config_generate() ) per gestire i requisiti DAC in un buffer e definisce regole per un include file istituzionalizzare le regole DAC.

Ad uso, creare un file in includono device/ vendor / device /android_filesystem_config.h che agisce come l'override. Il file deve utilizzare la structure fs_path_config formato definito nel system/core/include/private/android_filesystem_config.h con le seguenti inizializzazioni di struttura per directory e file simbolico:

  • Per le directory, utilizzare android _device _dirs[] .
  • Per i file, utilizzare android _device _files[] .

Quando non si utilizza android_device_dirs[] e android_device_files[] , è possibile definire NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_DIRS e NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_FILES (vedere l' esempio di seguito). È inoltre possibile specificare il file di override utilizzando TARGET_ANDROID_FILESYSTEM_CONFIG_H nella configurazione della scheda, con un nome base forzata di android_filesystem_config.h .

Compresi i file di sostituzione

Per includere i file, in modo che PRODUCT_PACKAGES comprende fs_config_dirs e / o fs_config_files in modo che possa installare al /system/etc/fs_config_dirs e /system/etc/fs_config_files , rispettivamente. Le ricerche sistema di generazione personalizzata android_filesystem_config.h a $(TARGET_DEVICE_DIR) , dove BoardConfig.mk esiste. Se questo file esiste altrove, insieme variabile bordo config TARGET_ANDROID_FILESYSTEM_CONFIG_H a punto in quella posizione.

Configurazione del filesystem

Per configurare il filesystem in Android 6.0 e versioni successive:

  1. Creare il $(TARGET_DEVICE_DIR)/android_filesystem_config.h file.
  2. Aggiungere le fs_config_dirs e / o fs_config_files al PRODUCT_PACKAGES nel file di configurazione della scheda (ad esempio, $(TARGET_DEVICE_DIR)/device.mk ).

Esempio di sostituzione

Questo esempio mostra una patch per l'override del system/bin/glgps demone per aggiungere il supporto di blocco scia nel device/ vendor / device directory. Tieni a mente quanto segue:

  • Ogni voce della struttura è la modalità, l'uid, il gid, le capacità e il nome. system/core/include/private/android_filesystem_config.h è incluso automaticamente per fornire le #defines manifesto ( AID_ROOT , AID_SHELL , CAP_BLOCK_SUSPEND ).
  • I android_device_files[] sezione presenta l'azione per l'accesso a sopprimere system/etc/fs_config_dirs quando non specificato, che serve come una protezione aggiuntiva DAC per mancanza di contenuti per le sostituzioni di directory. Tuttavia, questa è una protezione debole; se qualcuno ha il controllo su /system , che in genere può fare quello che vogliono.
diff --git a/android_filesystem_config.h b/android_filesystem_config.h
new file mode 100644
index 0000000..874195f
--- /dev/null
+++ b/android_filesystem_config.h
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ * implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+/* This file is used to define the properties of the filesystem
+** images generated by build tools (eg: mkbootfs) and
+** by the device side of adb.
+*/
+
+#define NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_DIRS
+/* static const struct fs_path_config android_device_dirs[] = { }; */
+
+/* Rules for files.
+** These rules are applied based on "first match", so they
+** should start with the most specific path and work their
+** way up to the root. Prefixes ending in * denotes wildcard
+** and will allow partial matches.
+*/
+static const struct fs_path_config android_device_files[] = {
+  { 00755, AID_ROOT, AID_SHELL, (1ULL << CAP_BLOCK_SUSPEND),
"system/bin/glgps" },
+#ifdef NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_DIRS
+  { 00000, AID_ROOT, AID_ROOT, 0, "system/etc/fs_config_dirs" },
+#endif
+};


diff --git a/device.mk b/device.mk
index 0c71d21..235c1a7 100644
--- a/device.mk
+++ b/device.mk
@@ -18,7 +18,8 @@ PRODUCT_PACKAGES := \
     libwpa_client \
     hostapd \
     wpa_supplicant \
-    wpa_supplicant.conf
+    wpa_supplicant.conf \
+    fs_config_files

 ifeq ($(TARGET_PREBUILT_KERNEL),)
 ifeq ($(USE_SVELTE_KERNEL), true)

Migrazione di filesystem da versioni precedenti

Durante la migrazione di filesystem da Android 5.x e versioni precedenti, tieni presente che Android 6.x

  • Rimuove alcune inclusioni, strutture e definizioni in linea.
  • Richiede un riferimento a libcutils invece di eseguire direttamente dal system/core/include/private/android_filesystem_config.h . Produttore del dispositivo eseguibili privati che dipendono system/code/include/private_filesystem_config.h per le strutture di file o directory o fs_config devono aggiungere libcutils dipendenze di librerie.
  • Richiede produttore del dispositivo copie private branch del system/core/include/private/android_filesystem_config.h con contenuti extra su obiettivi esistenti per passare al device/ vendor / device /android_filesystem_config.h .
  • Si riserva il diritto di applicare SELinux controlli di accesso obbligatorio (MAC) ai file di configurazione sul sistema di destinazione, le implementazioni che includono gli eseguibili di destinazione personalizzati utilizzando fs_config() deve garantire l'accesso.