Contrôle d'accès discrétionnaire (DAC)

Les objets et services du système de fichiers ajoutés à la construction nécessitent fréquemment des identifiants distincts et uniques, appelés identifiants Android (AID). Actuellement, de nombreuses ressources telles que les fichiers et les services utilisent inutilement des AID de base (définis par Android) ; dans de nombreux cas, vous pouvez utiliser à la place des AID OEM (définis par l'OEM).

Les versions antérieures d'Android (Android 7.x et inférieur) ont étendu le mécanisme à l' aide d' un dispositif AIDs spécifique android_filesystem_config.h fichier pour spécifier les capacités du système de fichiers et / ou sur commande OEM AIDs. Cependant, ce système n'était pas intuitif car il ne prenait pas en charge l'utilisation de noms agréables pour les AID OEM, vous obligeant à spécifier le numérique brut pour les champs utilisateur et groupe sans moyen d'associer un nom convivial à l'AID numérique.

Les versions plus récentes d'Android (Android 8.0 et versions ultérieures) prennent en charge une nouvelle méthode d'extension des capacités du système de fichiers. Cette nouvelle méthode prend en charge les éléments suivants :

  • Plusieurs emplacements source pour les fichiers de configuration (permet des configurations de construction extensibles).
  • Vérification de l'intégrité au moment de la construction des valeurs OEM AID.
  • Génération d'un en-tête OEM AID personnalisé pouvant être utilisé dans les fichiers source selon les besoins.
  • Association d'un nom convivial avec la valeur OEM AID réelle. Prend en charge les arguments de chaîne non numériques pour l'utilisateur et le groupe, c'est-à-dire "foo" au lieu de "2901".

D' autres améliorations comprennent la suppression des android_ids[] gamme de system/core/libcutils/include/private/android_filesystem_config.h . Ce tableau existe maintenant dans Bionic comme tableau généré entièrement privé, avec accesseurs via getpwnam() et getgrnam() . (Cela a pour effet secondaire de produire des binaires stables en tant qu'aides de base sont modifiés.) Pour l' outillage , et un fichier README avec plus de détails, reportez - vous à la build/make/tools/fs_config .

Ajout d'identifiants Android (AID)

Android 8.0 enlevé les android_ids[] tableau de l'Android Open Source Project (AOSP de). Tous les noms de l' AID sont plutôt amical générés à partir du system/core/libcutils/include/private/android_filesystem_config.h fichier d' en- tête lors de la génération Bionic android_ids[] tableau. Toute define correspondant AID_* est repris par l'outillage et * devient le nom minuscule.

Par exemple, dans private/android_filesystem_config.h :

#define AID_SYSTEM 1000

Devient:

  • Nom convivial : système
  • uid : 1000
  • gid: 1000

Pour ajouter une nouvelle aide à noyau PSBA, ajoutez simplement le #define au android_filesystem_config.h fichier d' en- tête. L'AID sera généré lors de la construction et mis à la disposition des interfaces qui utilisent des arguments d'utilisateur et de groupe. L'outillage valide que le nouvel AID n'est pas dans les plages APP ou OEM ; il respecte également les modifications apportées à ces plages et devrait se reconfigurer automatiquement sur les modifications ou les nouvelles plages réservées aux OEM.

Configuration des AID

Pour activer le nouveau mécanisme AIDs, ensemble TARGET_FS_CONFIG_GEN dans le BoardConfig.mk fichier. Cette variable contient une liste de fichiers de configuration, vous permettant d'ajouter des fichiers selon vos besoins.

Par convention, les fichiers de configuration utilisent le nom config.fs , mais dans la pratique , vous pouvez utiliser un nom. config.fs fichiers sont dans le Python ConfigParser le format ini et comprennent une section de bouchons (pour configurer les fonctionnalités du système de fichiers) et une section AIDs (pour la configuration OEM AIDs).

Configuration de la section des majuscules

La section de réglage des plafonds supports capacités du système de fichiers sur le système de fichiers des objets dans la construction (le système de fichiers lui - même doit également prendre en charge cette fonctionnalité).

Parce que l' exécution d' un service stable en tant que root dans Android provoque une suite de setuid setgid tests de compatibilité (CTS) échec, les exigences précédentes pour le maintien d' une capacité lors de l' exécution d' un processus ou service concerné la mise en place des capacités puis en utilisant setuid / setgid à une aide légitime à courir. Avec les majuscules, vous pouvez ignorer ces exigences et laisser le noyau le faire pour vous. Lorsque le contrôle est remis à main() , votre processus a déjà les capacités dont il a besoin pour que votre service peut utiliser un utilisateur non root et le groupe (ce qui est le moyen privilégié pour le démarrage des services privilégiés).

La section des majuscules utilise la syntaxe suivante :

Section Valeur Définition
[path] Le chemin du système de fichiers à configurer. Un chemin se terminant par / est considéré comme un répertoire, sinon c'est un fichier.

Il est une erreur de spécifier plusieurs sections avec le même [path] dans des fichiers différents. Dans les versions Python <= 3.2, le même fichier peut contenir des sections qui remplacent la section précédente ; dans Python 3.2, il est défini en mode strict.
mode Mode de fichier octal Un mode de fichier octal valide d'au moins 3 chiffres. Si 3 est spécifié, il est préfixé par un 0, sinon le mode est utilisé tel quel.
user AID_<utilisateur> Soit le C define par un AID valide ou le nom convivial (par exemple , à la fois AID_RADIO et la radio sont acceptables). Pour définir une AIDE personnalisée, consultez la section Configuration de l' AID .
group AID_<groupe> Identique à l'utilisateur.
caps casquette* Le nom déclaré dans bionic/libc/kernel/uapi/linux/capability.h sans le CAP_ . Cas mixte autorisé. Les bouchons peuvent aussi être le brut :
  • binaire (0b0101)
  • octal (0455)
  • int (42)
  • hexadécimal (0xFF)
Séparez plusieurs majuscules à l'aide d'espaces.

Pour un exemple d'utilisation, voir Utiliser les fonctionnalités du système de fichiers .

Configuration de la section AID

La section AID contient des AID OEM et utilise la syntaxe suivante :

Section Valeur Définition
[AID_<name>] Le <name> peut contenir des caractères dans le jeu en majuscules, chiffres et caractères de soulignement. La version minuscule est utilisée comme nom convivial. Le fichier d' en- tête généré pour l' inclusion de code utilise exactement AID_<name> .

Il est une erreur de spécifier plusieurs sections avec le même AID_<name> (insensible à la casse avec les mêmes contraintes que [path] ).

<name> doit commencer par un nom de partition pour vous assurer qu'il ne sont pas en conflit avec d' autres sources.
value <nombre> Une chaîne de nombres de style C valide (hex, octal, binaire et décimal).

C'est une erreur de spécifier plusieurs sections avec la même option de valeur.

Options de valeur doit être spécifiée dans la plage correspondant à la partition utilisée dans <name> . La liste des partitions valides et leurs plages correspondantes est définie dans le system/core/libcutils/include/private/android_filesystem_config.h . Les options sont :
  • Partition du fournisseur
    • AID_OEM_RESERVED_START(2900) - AID_OEM_RESERVED_END(2999)
    • AID_OEM_RESERVED_2_START(5000) - AID_OEM_RESERVED_2_END(5999)
  • Partition système
    • AID_SYSTEM_RESERVED_START(6000) - AID_SYSTEM_RESERVED_END(6499)
  • Partition ODM
    • AID_ODM_RESERVED_START(6500) - AID_ODM_RESERVED_END(6999)
  • Partition de produit
    • AID_PRODUCT_RESERVED_START(7000) - AID_PRODUCT_RESERVED_END(7499)
  • Partition System_ext
    • AID_SYSTEM_EXT_RESERVED_START(7500) - AID_SYSTEM_EXT_RESERVED_END(7999)

Pour des exemples d'utilisation, voir Définition OEM noms de l' AID et l' aide OEM SIDA .

Exemples d'utilisation

Les exemples suivants expliquent comment définir et utiliser un OEM AID et comment activer les capacités du système de fichiers. Noms OEM AID ([nom AID_]) doivent commencer par un nom de partition tel que « vendor_ » pour assurer qu'ils ne sont pas incompatibles avec les futurs noms de PSBA ou d' autres partitions.

Définition des noms OEM AID

Pour définir un OEM AID, créez un config.fs fichier et définir la valeur de l' AID. Par exemple, dans l' device/x/y/config.fs , définir les paramètres suivants:

[AID_VENDOR_FOO]
value: 2900

Après avoir créé le fichier, définissez la TARGET_FS_CONFIG_GEN variable et pointez dans BoardConfig.mk . Par exemple, dans l' device/x/y/BoardConfig.mk , définir les paramètres suivants:

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

Votre AID personnalisé peut désormais être utilisé par le système dans son ensemble sur une nouvelle version.

Utilisation des aides OEM

Pour utiliser un OEM AID, dans votre code C, inclure les oemaids_headers dans votre Makefile associé, et ajouter #include "generated_oem_aid.h" , puis commencer à utiliser les identificateurs déclarés. Par exemple, dans my_file.c , ajouter ce qui suit:

#include "generated_oem_aid.h"
…

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

Dans votre associé Android.bp fichier, ajoutez ce qui suit:

header_libs: ["oemaids_headers"],

Si vous utilisez un Android.mk fichier, puis ajoutez ce qui suit:

LOCAL_HEADER_LIBRARIES := oemaids_headers

Utiliser des noms conviviaux

Dans Android 9, vous pouvez utiliser le nom convivial pour toute interface prenant en charge les noms AID. Par exemple:

  • Dans une chown commande dans some/init.rc :
    chown vendor_foo /vendor/some/vendor_foo/file
    
  • Dans un service de dans some/init.rc :
    service vendor_foo /vendor/bin/foo_service
        user vendor_foo
        group vendor_foo
    

Parce que la mise en correspondance interne du nom convivial à uid est effectuée par /vendor/etc/passwd et /vendor/etc/group , la partition fournisseur doit être monté.

Associer des noms conviviaux

Android 9 inclut la prise en charge de l'association d'un nom convivial à la valeur OEM AID réelle. Vous pouvez utiliser des arguments de chaîne non numériques pour l' utilisateur et le groupe, à savoir « vendor_ foo » au lieu de « 2901 ».

Conversion d'AID en noms conviviaux

Pour OEM AIDs , Android 8.x nécessaire l'utilisation de oem_#### avec getpwnam et des fonctions similaires, ainsi que dans des endroits via la poignée lookups getpwnam (comme init des scripts). Dans Android 9, vous pouvez utiliser les getpwnam et getgrnam amis Bionic pour convertir des ID Android (SIDA) aux noms sympathiques et vice versa.

Utilisation des capacités du système de fichiers

Pour activer les fonctionnalités système de fichiers, créer une section bouchons dans le config.fs fichier. Par exemple, dans l' device/x/y/config.fs , ajoutez la section suivante:

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

Après avoir créé le fichier, définissez le TARGET_FS_CONFIG_GEN pour pointer vers ce fichier dans BoardConfig.mk . Par exemple, dans l' device/x/y/BoardConfig.mk , définir les paramètres suivants:

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

Lorsque le service vendor_ foo est exécuté, il commence avec des capacités CAP_SYS_ADMIN et CAP_SYS_NICE sans setuid et setgid appels. De plus, la vendor_ foo capacité politique de services SELinux n'a plus besoin setuid et setgid et peut être supprimé.

Configuration des dérogations (Android 6.x-7.x)

Android 6.0 relocalisé fs_config et définitions de structure associées ( system/core/include/private/android_filesystem_config.h ) au system/core/libcutils/fs_config.c où ils pourraient être mis à jour ou remplacés par des fichiers binaires installés dans /system/etc/fs_config_dirs et /system/etc/fs_config_files . L'utilisation de règles de correspondance et d'analyse séparées pour les répertoires et les fichiers (qui pourraient utiliser des expressions glob supplémentaires) a permis à Android de gérer les répertoires et les fichiers dans deux tables différentes. Définitions structure system/core/libcutils/fs_config.c non seulement permis la lecture d'exécution des répertoires et des fichiers, mais l'hôte peut utiliser les mêmes fichiers durant la compilation d'images de système de fichiers de construction telle que ${OUT}/system/etc/fs_config_dirs et ${OUT}/system/etc/fs_config_files .

Bien que la méthode de remplacement d'extension du système de fichiers ait été remplacée par le système de configuration modulaire introduit dans Android 8.0, vous pouvez toujours utiliser l'ancienne méthode si vous le souhaitez. Les sections suivantes détaillent comment générer et inclure des fichiers de remplacement et configurer le système de fichiers.

Génération de fichiers de remplacement

Vous pouvez générer les fichiers binaires alignés /system/etc/fs_config_dirs et /system/etc/fs_config_files à l' aide de l' fs_config_generate outil de build/tools/fs_config . L'outil utilise une libcutils fonction de bibliothèque ( fs_config_generate() ) pour gérer les exigences du CAD dans un tampon règles et définit un fichier d' inclusion pour institutionnaliser les règles du CAD.

Pour l' utiliser, créer un fichier à inclure dans le device/ vendor / device /android_filesystem_config.h qui agit comme le remplacement. Le fichier doit utiliser la structure fs_path_config de system/core/include/private/android_filesystem_config.h structure fs_path_config format défini dans le system/core/include/private/android_filesystem_config.h avec les initialisations de structure suivante pour les symboles de répertoires et de fichiers:

  • Pour les répertoires, utilisez android _device _dirs[] .
  • Pour les fichiers, utilisez android _device _files[] .

Lorsque vous n'utilisez android_device_dirs[] et android_device_files[] , vous pouvez définir NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_DIRS et NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_FILES (voir l' exemple ci - dessous). Vous pouvez également spécifier le fichier override à partir TARGET_ANDROID_FILESYSTEM_CONFIG_H dans la configuration de la carte, avec une basename forcée de android_filesystem_config.h .

Y compris les fichiers de remplacement

Pour inclure des fichiers, assurez -vous que PRODUCT_PACKAGES comprend fs_config_dirs et / ou fs_config_files afin qu'il puisse les installer dans /system/etc/fs_config_dirs et /system/etc/fs_config_files , respectivement. Le système recherche de construction custom android_filesystem_config.h en $(TARGET_DEVICE_DIR) , où BoardConfig.mk existe. Si ce fichier existe ailleurs, un ensemble de variables config de la carte TARGET_ANDROID_FILESYSTEM_CONFIG_H pour pointer vers cet endroit.

Configuration du système de fichiers

Pour configurer le système de fichiers sous Android 6.0 et versions ultérieures :

  1. Créez le $(TARGET_DEVICE_DIR)/android_filesystem_config.h fichier.
  2. Ajouter les fs_config_dirs et / ou fs_config_files à PRODUCT_PACKAGES dans le fichier de configuration de la carte (par exemple, $(TARGET_DEVICE_DIR)/device.mk ).

Exemple de remplacement

Cet exemple montre un patch pour des raisons impérieuses du system/bin/glgps démon pour ajouter le support de verrouillage de réveil dans le device/ vendor / device répertoire. Gardez ce qui suit à l'esprit :

  • Chaque entrée de structure est le mode, l'uid, le gid, les capacités et le nom. system/core/include/private/android_filesystem_config.h est automatiquement inclus pour fournir les #defines manifestes ( AID_ROOT , AID_SHELL , CAP_BLOCK_SUSPEND ).
  • Les android_device_files[] section comprend une action d'accès au suppress system/etc/fs_config_dirs lorsque non spécifié, qui sert une protection supplémentaire du CAD par manque de contenu pour les remplacements d'annuaire. Cependant, il s'agit d'une protection faible; si quelqu'un a le contrôle /system , ils peuvent généralement faire tout ce qu'ils veulent.
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)

Migration de systèmes de fichiers à partir de versions antérieures

Lors de la migration de systèmes de fichiers à partir d'Android 5.x et versions antérieures, gardez à l'esprit qu'Android 6.x

  • Supprime certaines inclusions, structures et définitions en ligne.
  • Nécessite une référence à libcutils au lieu de courir directement à partir du system/core/include/private/android_filesystem_config.h . Executables privé du fabricant de périphériques qui dépendent du system/code/include/private_filesystem_config.h pour le fichier ou répertoire des structures ou fs_config doivent ajouter libcutils dépendances bibliothèque.
  • Nécessite un périphérique fabricant copie privée du branche system/core/include/private/android_filesystem_config.h avec du contenu supplémentaire sur les cibles existantes de se déplacer vers le device/ vendor / device /android_filesystem_config.h .
  • Se réserve le droit d'appliquer SELinux obligatoires les contrôles d'accès (MAC) aux fichiers de configuration sur le système cible, les implémentations qui incluent executables cibles personnalisées à l' aide fs_config() doit assurer l' accès.