Controllo dell'accesso discrezionale (DAC)

Gli oggetti del file system e i servizi aggiunti alla build spesso richiedono ID univoci, noti come ID Android (AID). Attualmente, molte risorse come file e servizi usano inutilmente AID principali (definiti da Android); in molti in questi casi, puoi usare AID OEM (definiti OEM).

Le versioni precedenti di Android (Android 7.x e versioni precedenti) estendevano gli AID meccanismo di attenzione utilizzando un parametro android_filesystem_config.h specifico per dispositivo per specificare funzionalità del file system e/o AID OEM personalizzati. Tuttavia, questo non era intuitivo perché non supportava l'uso di nomi accattivanti per gli AID OEM, richiedere di specificare un valore numerico non elaborato per i campi utente e gruppo senza per associare un nome semplice all'AID numerico.

Le versioni più recenti di Android (Android 8.0 e versioni successive) supportano un nuovo metodo per l'estensione delle funzionalità del file system. Questo nuovo metodo supporta seguenti:

  • Più posizioni di origine per i file di configurazione (abilita l'estensione configurazioni di build).
  • Controllo dell'integrità in fase di build dei valori AID OEM.
  • Generazione di un'intestazione AID OEM personalizzata che può essere utilizzata nei file di origine come necessaria.
  • Associazione di un nome descrittivo con il valore effettivo dell'AID OEM. Supporta argomenti stringa non numerici per utente e gruppo, ad esempio "foo" anziché "2901".

Ulteriori miglioramenti includono la rimozione dell'URL android_ids[] array da system/core/libcutils/include/private/android_filesystem_config.h. Questo ora esiste in Bionic come array generato completamente privato, con con getpwnam() e getgrnam(). (Ciò ha l'effetto collaterale della produzione di file binari stabili quando vengono modificati gli AID fondamentali). Per e un file README con ulteriori dettagli, consulta build/make/tools/fs_config.

Aggiungi ID Android (AID)

Android 8.0 ha rimosso l'array android_ids[] da Android un progetto open source (AOSP). Tutti i nomi idonei per l'AID vengono invece generati system/core/libcutils/include/private/android_filesystem_config.h di intestazione durante la generazione dell'array Bionic android_ids[]. Qualsiasi La define corrispondente a AID_* viene rilevata dagli strumenti e * diventa il nome in minuscolo.

Ad esempio, in private/android_filesystem_config.h:

#define AID_SYSTEM 1000

Diventa:

  • Nome semplice: system
  • UID: 1000
  • gid: 1000

Per aggiungere un nuovo AOSP Core AID, aggiungi semplicemente #define al File di intestazione android_filesystem_config.h. L'AID è generate al momento della creazione e rese disponibili alle interfacce che utilizzano argomenti. Lo strumento convalida che il nuovo AID non sia presente nell'APP o nell'OEM intervalli; rispetta anche le modifiche a questi intervalli e dovrebbe riconfigurarla in caso di modifiche o nuovi intervalli prenotati dall'OEM.

Configura AID

Per abilitare il nuovo meccanismo di AID, imposta TARGET_FS_CONFIG_GEN nel BoardConfig.mk file. Questa variabile contiene un elenco di configurazioni di file YAML, consentendoti di aggiungerli in base alle tue esigenze.

Per convenzione, i file di configurazione utilizzano il nome config.fs, ma in puoi usare qualsiasi nome. config.fs file si trovano in Python Formato ConfigParser e includi una sezione in maiuscolo (per la configurazione funzionalità di sistema) e una sezione AID (per la configurazione degli AID OEM).

Configurare la sezione delle maiuscole

La sezione delle maiuscole supporta l'impostazione file funzionalità di sistema sugli oggetti di file system all'interno della build (il file system deve supportare anche questa funzionalità).

Poiché l'esecuzione di un servizio stabile come root in Android provoca un Suite di test di compatibilità (Compatibility Test Suite, CTS) errore, i precedenti requisiti per conservare una funzionalità durante l'esecuzione di processo o servizio prevedeva l'impostazione di funzionalità e poi l'utilizzo setuid/setgid a un AID adeguato per la pubblicazione. Con le maiuscole, puoi saltare questi requisiti e lasciare che il kernel lo faccia al posto tuo. Quando il controllo è assegnato a main(), il tuo processo ha già le capacità necessarie in modo che il servizio possa utilizzare un utente e un gruppo non root (è la soluzione per avviare i servizi con privilegi).

La sezione sulle maiuscole utilizza la seguente sintassi:

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

È un errore specificare più sezioni con lo stesso [path] in file diversi. Nelle versioni Python <= 3.2, lo stesso file può contenere sezioni che sostituiscono la sezione precedente; in Python 3.2, è impostata la modalità con restrizioni.
mode Modalità file ottale Una modalità file ottale valida di almeno 3 cifre. Se viene specificato 3, preceduto da uno 0, altrimenti viene utilizzata la modalità così com'è.
user AID_<utente> C define per un AID valido o il nome descrittivo (ad esempio, sono accettati sia AID_RADIO sia radio). A un AID personalizzato, consulta la sezione Configurazione sezione AID.
group AID_<gruppo> Come l'utente.
caps berretto* Il nome dichiarato in bionic/libc/kernel/uapi/linux/capability.h senza il CAP_ principale. Sono consentiti lettere maiuscole e minuscole. I limiti possono essere i dati non elaborati:
  • binario (0b0101)
  • ottale (0455)
  • int (42)
  • esadecimale (0xFF)
di Gemini Advanced. Separa più maiuscole utilizzando gli spazi vuoti.

Per un esempio di utilizzo, consulta la sezione Utilizzo di funzionalità di sistema.

Configura la sezione AID

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

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

È un errore specificare più sezioni con lo stesso AID_<name> (senza distinzione tra maiuscole e minuscole con gli stessi vincoli di [path]).

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

Specificare più sezioni con la stessa opzione di valore è un errore.

Le opzioni per il valore devono essere specificate nell'intervallo corrispondente alla partizione utilizzata in <name>. L'elenco di partizioni valide e le relative parti intervalli sono definiti in system/core/libcutils/include/private/android_filesystem_config.h. Le opzioni sono:
  • Partizione del 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 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, consulta la sezione Definizione dell'OEM Nomi AID e Utilizzo di AID OEM.

Esempi di utilizzo

I seguenti esempi illustrano in dettaglio come definire e utilizzare un AID OEM e come abilitare funzionalità del file system. Nomi AID OEM ([AID_name]) deve iniziare con un nome della partizione come "vendor_" per garantire che non entrino in conflitto con Nomi AOSP o altre partizioni.

Definisci i nomi AID OEM

Per definire un AID OEM, crea un file config.fs e imposta il valore AID. Ad esempio, in device/x/y/config.fs, imposta il valore seguenti:

[AID_VENDOR_FOO]
value: 2900

Dopo aver creato il file, imposta la variabile TARGET_FS_CONFIG_GEN e indicala in BoardConfig.mk. Ad esempio, nel device/x/y/BoardConfig.mk, imposta quanto segue:

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

Ora il tuo AID personalizzato può essere utilizzato dal sistema in generale su una nuova build.

Utilizza AID OEM

Per utilizzare un AID OEM, nel codice C includi il oemaids_headers nella documentazione Makefile e aggiungere #include "generated_oem_aid.h", quindi iniziare a utilizzare il file o identificatori univoci. Ad esempio, in my_file.c, aggiungi quanto segue:

#include "generated_oem_aid.h"
…

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

Nel file Android.bp associato, aggiungi quanto segue:

header_libs: ["oemaids_headers"],

Se utilizzi un file Android.mk, aggiungi quanto segue:

LOCAL_HEADER_LIBRARIES := oemaids_headers

Usa nomi descrittivi

In Android 9, puoi utilizzare il nome descrittivo per che supporta i nomi AID. Ad esempio:

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

Poiché la mappatura interna dal nome semplice allo uid viene eseguita /vendor/etc/passwd e /vendor/etc/group, il fornitore la partizione <start>.

Associa nomi descrittivi

Android 9 include il supporto per l'associazione di nome descrittivo con il valore effettivo dell'AID OEM. Puoi usare una stringa non numerica argomenti per utente e gruppo, ovvero "vendor_foo" anziché "2901".

Converti da AID a nome descrittivo

Per AID OEM, Android 8.x richiede l'utilizzo di oem_#### con getpwnam e funzioni simili, come molto bene nelle posizioni che gestiscono le ricerche con getpwnam (come init script). In Android 9, puoi usa getpwnam e getgrnam amici in Bionic per convertendo gli ID Android (AID) in nomi semplici e viceversa.

Utilizza le funzionalità del file system

Per abilitare le funzionalità del file system, crea una sezione con maiuscole nella config.fs. Ad esempio, nel device/x/y/config.fs, aggiungi 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, imposta TARGET_FS_CONFIG_GEN in modo che punti a quel file in BoardConfig.mk. Ad esempio, nel device/x/y/BoardConfig.mk, imposta quanto segue:

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

Quando viene eseguito, il servizio vendor_foo viene avviato con funzionalità CAP_SYS_ADMIN e CAP_SYS_NICE senza chiamate setuid e setgid. Inoltre, Il criterio SELinux del servizio vendor_foo non è più richiede le funzionalità setuid e setgid e può essere eliminati.

Configurazione degli override (Android 6.x-7.x)

Android 6.0 ha spostato fs_config e struttura associata definizioni (system/core/include/private/android_filesystem_config.h) per system/core/libcutils/fs_config.c dove potrebbero essere aggiornati con override dai file binari installati in /system/etc/fs_config_dirs e /system/etc/fs_config_files. Utilizzo della corrispondenza e dell'analisi separate regole per directory e file (che potrebbero utilizzare espressioni glob aggiuntive) consente ad Android di gestire directory e file in due tabelle diverse. Le definizioni della struttura in system/core/libcutils/fs_config.c non sono consentiva solo la lettura in fase di runtime di directory e file, ma l'host poteva utilizzare gli stessi file in fase di compilazione per creare immagini del file system ${OUT}/system/etc/fs_config_dirs e ${OUT}/system/etc/fs_config_files.

Il metodo di override dell'estensione del file system è stato sostituito da il sistema di configurazione modulare introdotto in Android 8.0, è comunque possibile usare , se lo desideri. Le seguenti sezioni descrivono nel dettaglio come generare e includere sovrascrivere i file e configurare il file system.

Genera file di override

Puoi generare file binari allineati /system/etc/fs_config_dirs e /system/etc/fs_config_files utilizzando Strumento fs_config_generate in build/tools/fs_config. La utilizza una funzione di libreria libcutils (fs_config_generate()) per gestire i requisiti del DAC in un buffer e definisce le regole per un file di inclusione al fine di istituzionalizzare le regole DAC.

Per utilizzarlo, crea un file di inclusione in device/vendor/device/android_filesystem_config.h che funge da override. Il file deve utilizzare la proprietà Formato structure fs_path_config definito in system/core/include/private/android_filesystem_config.h con le seguenti inizializzazioni della struttura per i simboli di directory e file:

  • Per le directory, usa android_device_dirs[].
  • Per i file, usa android_device_files[].

Quando non usi android_device_dirs[] e android_device_files[], puoi definire NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_DIRS e NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_FILES (vedi il esempio di seguito). Puoi anche specificare l'override file utilizzando TARGET_ANDROID_FILESYSTEM_CONFIG_H nella lavagna con un basename applicato android_filesystem_config.h.

Includi file di override

Per includere i file, assicurati che PRODUCT_PACKAGES includa fs_config_dirs e/o fs_config_files in modo che possa installarle in /system/etc/fs_config_dirs e /system/etc/fs_config_files. Il sistema di compilazione cerca personalizzato android_filesystem_config.h in $(TARGET_DEVICE_DIR), dove esiste BoardConfig.mk. Se questo file esiste altrove, imposta la variabile di configurazione della scheda TARGET_ANDROID_FILESYSTEM_CONFIG_H per puntare a quella posizione.

Configurare il file system

Per configurare il file system in Android 6.0 e versioni successive:

  1. Crea $(TARGET_DEVICE_DIR)/android_filesystem_config.h .
  2. Aggiungi fs_config_dirs e/o fs_config_files a PRODUCT_PACKAGES nel file di configurazione della lavagna (ad es. $(TARGET_DEVICE_DIR)/device.mk).

Esempio di override

Questo esempio mostra una patch per eseguire l'override di system/bin/glgps per aggiungere il supporto dei wakelock nella Directory device/vendor/device. Mantieni il tieni presente quanto segue:

  • Ogni voce della struttura indica modalità, uid, gid, capacità e il nome. system/core/include/private/android_filesystem_config.h è incluso automaticamente per fornire il manifest #defines (AID_ROOT, AID_SHELL, CAP_BLOCK_SUSPEND).
  • La sezione android_device_files[] include un'azione per Se non specifichi l'accesso a system/etc/fs_config_dirs, che funge da ulteriore protezione DAC per la mancanza di contenuti per la directory override. Tuttavia, si tratta di una protezione debole; se qualcuno ha il controllo /system, in genere può fare tutto ciò che vuole.
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 file system
+** 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)

Esegui la migrazione dei file system da release precedenti

Quando esegui la migrazione dei file system da Android 5.x e versioni precedenti, tieni presente che Android 6.x

  • Rimuove alcune include, strutture e definizioni incorporate.
  • Richiede un riferimento a libcutils anziché essere eseguito direttamente da system/core/include/private/android_filesystem_config.h. Eseguibili privati del produttore del dispositivo che dipendono da system/code/include/private_filesystem_config.h per il file o strutture di directory o fs_config devono aggiungere libcutils delle dipendenze di libreria.
  • Richiede copie del ramo privato del produttore del dispositivo system/core/include/private/android_filesystem_config.h con contenuti aggiuntivi sui target esistenti da spostare device/vendor/device/android_filesystem_config.h.
  • Si riserva il diritto di applicare i controlli di accesso obbligatori (MAC) di SELinux a di configurazione automatica sul sistema di destinazione, implementazioni che includono gli eseguibili target che utilizzano fs_config() devono garantire l'accesso.