Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.

Control de acceso discrecional (DAC)

Los objetos y servicios del sistema de archivos que se agregan a la compilación con frecuencia necesitan ID únicos y separados, conocidos como ID de Android (AID). Actualmente, muchos recursos, como archivos y servicios, utilizan AID básicos (definidos por Android) innecesariamente; en muchos casos, puede utilizar AID OEM (definidos por OEM) en su lugar.

Las versiones anteriores de Android (Android 7.x y bajar) extendieron el mecanismo de SIDA utilizando un dispositivo específico android_filesystem_config.h archivo para especificar las capacidades del sistema de archivos y / o al OEM SIDA. Sin embargo, este sistema no era intuitivo ya que no admitía el uso de nombres agradables para los AID de OEM, lo que requería que especificara el número sin procesar para los campos de usuario y grupo sin una forma de asociar un nombre descriptivo con el AID numérico.

Las versiones más recientes de Android (Android 8.0 y superior) admiten un nuevo método para ampliar las capacidades del sistema de archivos. Este nuevo método tiene soporte para lo siguiente:

  • Varias ubicaciones de origen para archivos de configuración (habilita configuraciones de compilación extensibles).
  • Comprobación de la cordura en el tiempo de construcción de los valores de OEM AID.
  • Generación de un encabezado OEM AID personalizado que se puede usar en archivos fuente según sea necesario.
  • Asociación de un nombre descriptivo con el valor real de AID OEM. Admite argumentos de cadena no numéricos para el usuario y el grupo, es decir, "foo" en lugar de "2901".

Las mejoras adicionales incluyen la eliminación de los android_ids[] matriz de system/core/libcutils/include/private/android_filesystem_config.h . Esta matriz ahora existe en Bionic como una matriz generada totalmente privado, con descriptores de acceso a través de getpwnam() y getgrnam() . (Esto tiene el efecto secundario de producir binarios estables como el SIDA núcleo se modifican.) Para las herramientas, y un archivo README con más detalles, referirse a build/make/tools/fs_config .

Agregar ID de Android (AID)

Android 8.0 eliminado los android_ids[] matriz del proyecto de código abierto Android (AOSP). Todos los nombres de AID-amigable en cambio se generan a partir de la system/core/libcutils/include/private/android_filesystem_config.h archivo de cabecera cuando se generan las Bionic android_ids[] array. Cualquier define a juego AID_* es recogido por el utillaje y * se convierte en el nombre en minúsculas.

Por ejemplo, en private/android_filesystem_config.h :

#define AID_SYSTEM 1000

Se convierte en:

  • Nombre descriptivo: sistema
  • uid: 1000
  • gid: 1000

Para añadir una nueva ayuda núcleo AOSP, sólo tiene que añadir el #define a la android_filesystem_config.h archivo de cabecera. La AID se generará en la compilación y estará disponible para las interfaces que utilizan argumentos de usuario y grupo. Las herramientas validan que el nuevo AID no está dentro de los rangos de APP o OEM; también respeta los cambios en esos rangos y debería reconfigurarse automáticamente en los cambios o nuevos rangos reservados por el OEM.

Configuración de AID

Para habilitar el nuevo mecanismo de SIDA, juego TARGET_FS_CONFIG_GEN en el BoardConfig.mk archivo. Esta variable contiene una lista de archivos de configuración, lo que le permite agregar archivos según sea necesario.

Por convención, los archivos de configuración de utilizar el nombre config.fs , pero en la práctica se puede utilizar cualquier nombre. config.fs archivos están en el formato del ini Python ConfigParser e incluyen una sección de tapones (para la configuración de las capacidades del sistema de archivos) y una sección de SIDA (para la configuración de OEM SIDA).

Configurar la sección de mayúsculas

Los soportes de sección tapas de ajuste de las capacidades del sistema de archivos en el sistema de archivos de objetos dentro de la construcción (el sistema de archivos en sí también debe ser compatible con esta funcionalidad).

Debido a la ejecución de un servicio estable como root en Android hace que una prueba de compatibilidad Suite (CTS) fracaso, requisitos previos para retener una capacidad mientras se ejecuta un proceso o servicio implicado la creación de capacidades a continuación, utilizando setuid / setgid a una ayuda adecuada para funcionar. Con mayúsculas, puede omitir estos requisitos y hacer que el kernel lo haga por usted. Cuando el control se transfiere a main() , el proceso ya tiene las capacidades que necesita para que su servicio puede utilizar un usuario no root y el grupo (esta es la forma preferida para iniciar los servicios privilegiados).

La sección de mayúsculas utiliza la siguiente sintaxis:

Sección Valor Definición
[path] La ruta del sistema de archivos para configurar. Una ruta que termina en / se considera un directorio, de lo contrario es un archivo.

Es un error especificar varias secciones con el mismo [path] en diferentes archivos. En las versiones de Python <= 3.2, el mismo archivo puede contener secciones que anulan la sección anterior; en Python 3.2, está configurado en modo estricto.
mode Modo de archivo octal Un modo de archivo octal válido de al menos 3 dígitos. Si se especifica 3, se le antepone un 0; de lo contrario, el modo se usa tal cual.
user AID_ <usuario> O bien el C define para una ayuda válida o el nombre descriptivo (por ejemplo, tanto AID_RADIO y radio son aceptables). Para definir una ayuda personalizada, consulte Configuración de la sección de AYUDA .
group AID_ <grupo> Igual que el usuario.
caps gorra* El nombre que se declara en bionic/libc/kernel/uapi/linux/capability.h sin anteponer CAP_ . Se permite el caso mixto. Las tapas también pueden ser crudas:
  • binario (0b0101)
  • octal (0455)
  • int (42)
  • hexadecimal (0xFF)
Separe varias mayúsculas con espacios en blanco.

Para un ejemplo de uso, consulte Uso de las capacidades del sistema de archivos .

Configuración de la sección AID

La sección AID contiene AID OEM y utiliza la siguiente sintaxis:

Sección Valor Definición
[AID_<name>] El <name> puede contener caracteres del conjunto de mayúsculas, números y guiones bajos. La versión en minúsculas se utiliza como nombre descriptivo. El archivo de cabecera generado para su inclusión código utiliza la exacta AID_<name> .

Es un error especificar varias secciones con el mismo AID_<name> (mayúsculas y minúsculas con las mismas restricciones que [path] ).

<name> debe comenzar con un nombre de partición para asegurarse de que no entre en conflicto con las diferentes fuentes.
value <número> Una cadena de números de estilo C válida (hexadecimal, octal, binario y decimal).

Es un error especificar varias secciones con la misma opción de valor.

Opciones de valor deben ser especificados en el rango correspondiente a la partición utilizado en <name> . La lista de las particiones válidas y sus rangos correspondientes se define en system/core/libcutils/include/private/android_filesystem_config.h . Las opciones son:
  • Partición de proveedor
    • AID_OEM_RESERVED_START (2900) - AID_OEM_RESERVED_END (2999)
    • AID_OEM_RESERVED_2_START (5000) - AID_OEM_RESERVED_2_END (5999)
  • Partición del sistema
    • AID_SYSTEM_RESERVED_START (6000) - AID_SYSTEM_RESERVED_END (6499)
  • Partición ODM
    • AID_ODM_RESERVED_START (6500) - AID_ODM_RESERVED_END (6999)
  • Partición de producto
    • AID_PRODUCT_RESERVED_START (7000) - AID_PRODUCT_RESERVED_END (7499)
  • Partición System_ext
    • AID_SYSTEM_EXT_RESERVED_START (7500) - AID_SYSTEM_EXT_RESERVED_END (7999)

Para ver ejemplos de uso, consulte nombres AID Definición de OEM y Uso de OEM SIDA .

Ejemplos de uso

Los siguientes ejemplos detallan cómo definir y usar un AID OEM y cómo habilitar las capacidades del sistema de archivos. Nombres OEM AID ([nombre AID_]) deben comenzar con un nombre de partición como "vendor_" para asegurarse de que no entren en conflicto con los futuros nombres AOSP u otras particiones.

Definición de nombres de OEM AID

Para definir un AID OEM, crear un config.fs archivo y establecer el valor de la AID. Por ejemplo, en device/x/y/config.fs , establecer lo siguiente:

[AID_VENDOR_FOO]
value: 2900

Después de crear el archivo, establecer el TARGET_FS_CONFIG_GEN variable y el punto de que en BoardConfig.mk . Por ejemplo, en device/x/y/BoardConfig.mk , ajustar los siguientes:

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

Su AID personalizado ahora puede ser consumido por el sistema en general en una nueva construcción.

Uso de AID de OEM

Para utilizar un AID OEM, en el código C, incluyen los oemaids_headers en su Makefile asociado, y añadir #include "generated_oem_aid.h" , a continuación, comenzar a utilizar los identificadores declarados. Por ejemplo, en my_file.c , añada la siguiente:

#include "generated_oem_aid.h"
…

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

En su asociado Android.bp archivo, añada la siguiente:

header_libs: ["oemaids_headers"],

Si estás usando una Android.mk archivo, a continuación, añadir lo siguiente:

LOCAL_HEADER_LIBRARIES := oemaids_headers

Usar nombres amigables

En Android 9, puede usar el nombre descriptivo para cualquier interfaz que admita nombres AID. Por ejemplo:

  • En un chown mando en some/init.rc :
    chown vendor_foo /vendor/some/vendor_foo/file
    
  • En un service en some/init.rc :
    service vendor_foo /vendor/bin/foo_service
        user vendor_foo
        group vendor_foo
    

Debido a que el mapeo interno de nombre amigable para uid se realiza por /vendor/etc/passwd y /vendor/etc/group , la partición vendedor debe ser montado.

Asociación de nombres descriptivos

Android 9 incluye soporte para asociar un nombre descriptivo con el valor real de AID OEM. Se puede utilizar argumentos de cadena no numéricos de usuario y de grupo, es decir, "foo vendor_" en lugar de "2901".

Conversión de AID a nombres descriptivos

Para OEM SIDA , 8.x Android requiere el uso de oem_#### con getpwnam y funciones similares, así como en lugares que las búsquedas a través de la manija getpwnam (tales como init guiones). En Android 9, puede utilizar los getpwnam y getgrnam amigos en biónico para la conversión de los ID de Android (SIDA) a nombres descriptivos y viceversa.

Usar las capacidades del sistema de archivos

Para activar las funciones del sistema de archivos, crear una sección de gorras al config.fs archivo. Por ejemplo, en device/x/y/config.fs , añadir la siguiente sección:

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

Después de crear el archivo, establecer el TARGET_FS_CONFIG_GEN a punto para ese archivo en BoardConfig.mk . Por ejemplo, en device/x/y/BoardConfig.mk , ajustar los siguientes:

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

Cuando el servicio vendor_ foo es ejecutado, se inicia con capacidades CAP_SYS_ADMIN y CAP_SYS_NICE sin setuid y setgid llamadas. Además, el vendor_ foo política de SELinux de servicio ya no necesita una capacidad setuid y setgid y se puede eliminar.

Configuración de anulaciones (Android 6.x-7.x)

Android 6.0 reubicado fs_config y definiciones de estructuras asociadas ( system/core/include/private/android_filesystem_config.h ) al system/core/libcutils/fs_config.c donde podrían ser actualizados o anulados por los archivos binarios instalados en /system/etc/fs_config_dirs y /system/etc/fs_config_files . El uso de reglas independientes de comparación y análisis para directorios y archivos (que podrían usar expresiones globales adicionales) permitió a Android manejar directorios y archivos en dos tablas diferentes. Definiciones de la estructura de system/core/libcutils/fs_config.c no sólo permitió la lectura en tiempo de ejecución de directorios y archivos, pero el anfitrión podría utilizar los mismos archivos durante el tiempo de construcción de imágenes del sistema de archivos de constructos como ${OUT}/system/etc/fs_config_dirs y ${OUT}/system/etc/fs_config_files .

Si bien el método de anulación para extender el sistema de archivos ha sido reemplazado por el sistema de configuración modular introducido en Android 8.0, aún puede usar el método anterior si lo desea. Las siguientes secciones detallan cómo generar e incluir archivos de reemplazo y configurar el sistema de archivos.

Generando archivos de anulación

Puede generar los archivos binarios alineados /system/etc/fs_config_dirs y /system/etc/fs_config_files utilizando el fs_config_generate herramienta en la build/tools/fs_config . La herramienta utiliza un libcutils función de biblioteca ( fs_config_generate() ) para gestionar los requisitos del CAD en un búfer y define reglas para un archivo de inclusión de institucionalizar las reglas DAC.

Para su uso, cree un archivo adentro incluyen device/ vendor / device /android_filesystem_config.h que actúa como la anulación. El archivo debe utilizar la structure fs_path_config formato definido en el system/core/include/private/android_filesystem_config.h con las siguientes inicializaciones estructura de directorios y archivos símbolos:

  • Para los directorios, utilice android _device _dirs[] .
  • Para los archivos, utilice android _device _files[] .

Cuando no utilice android_device_dirs[] y android_device_files[] , puede definir NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_DIRS y NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_FILES (véase el ejemplo a continuación). También puede especificar el archivo de desbloqueo mediante TARGET_ANDROID_FILESYSTEM_CONFIG_H en la configuración de la tarjeta, con un nombre base forzada de android_filesystem_config.h .

Incluyendo archivos de anulación

Para incluir archivos, asegúrese de que PRODUCT_PACKAGES incluye fs_config_dirs y / o fs_config_files para que pueda instalarlos en /system/etc/fs_config_dirs y /system/etc/fs_config_files , respectivamente. El sistema busca la acumulación de encargo android_filesystem_config.h en $(TARGET_DEVICE_DIR) , donde BoardConfig.mk existe. Si este archivo existe en otros lugares, conjunto de variables de configuración de tablero de TARGET_ANDROID_FILESYSTEM_CONFIG_H a punto a esa ubicación.

Configurar el sistema de archivos

Para configurar el sistema de archivos en Android 6.0 y superior:

  1. Crear el $(TARGET_DEVICE_DIR)/android_filesystem_config.h archivo.
  2. Añadir los fs_config_dirs y / o fs_config_files a PRODUCT_PACKAGES en la junta fichero de configuración (por ejemplo, $(TARGET_DEVICE_DIR)/device.mk ).

Ejemplo de anulación

Este ejemplo muestra un parche para anular el system/bin/glgps demonio para añadir soporte de bloqueo de activación en el device/ vendor / device directorio. Tenga en cuenta lo siguiente:

  • Cada entrada de estructura es el modo, uid, gid, capacidades y el nombre. system/core/include/private/android_filesystem_config.h se incluye automáticamente para proporcionar los #defines manifiesto ( AID_ROOT , AID_SHELL , CAP_BLOCK_SUSPEND ).
  • Los android_device_files[] sección incluye una acción para suprimir el acceso al system/etc/fs_config_dirs cuando no especificada, que sirve como una protección adicional DAC por falta de contenido para las anulaciones de directorio. Sin embargo, esta es una protección débil; si alguien tiene el control sobre /system , que pueden hacer lo que quieran normalmente.
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)

Migrar sistemas de archivos de versiones anteriores

Al migrar sistemas de archivos desde Android 5.xy versiones anteriores, tenga en cuenta que Android 6.x

  • Elimina algunas inclusiones, estructuras y definiciones en línea.
  • Requiere una referencia a libcutils en lugar de ejecutar directamente de system/core/include/private/android_filesystem_config.h . Fabricante del dispositivo ejecutables privadas que dependen de system/code/include/private_filesystem_config.h para las estructuras de archivo o directorio o fs_config deben añadir libcutils dependencias de bibliotecas.
  • Requiere fabricante del dispositivo copias de las ramas privado del system/core/include/private/android_filesystem_config.h con contenido extra sobre los objetivos existentes a medida que device/ vendor / device /android_filesystem_config.h .
  • Se reserva el derecho de aplicar controles de acceso obligatorios SELinux (MAC) a los archivos de configuración en el sistema de destino, las implementaciones que incluyen los ejecutables de destino personalizadas utilizando fs_config() debe garantizar el acceso.