O Google tem o compromisso de promover a igualdade racial para as comunidades negras. Saiba como.

Controle de acesso discricionário (DAC)

Os objetos e serviços do sistema de arquivos adicionados à construção frequentemente precisam de IDs exclusivos e separados, conhecidos como IDs Android (AIDs). Atualmente, muitos recursos, como arquivos e serviços, usam AIDs principais (definidos pelo Android) desnecessariamente; em muitos casos, você pode usar AIDs OEM (definidos pelo OEM).

As versões anteriores do Android (Android 7.x e abaixar) estendeu o mecanismo AIDs usando um específico do dispositivo android_filesystem_config.h arquivo para especificar as capacidades do sistema de arquivos e / ou personalizado OEM SIDA. No entanto, este sistema não era intuitivo, pois não suportava o uso de nomes legais para AIDs OEM, exigindo que você especifique o numérico bruto para os campos de usuário e grupo, sem uma forma de associar um nome amigável ao AID numérico.

As versões mais recentes do Android (Android 8.0 e superior) oferecem suporte a um novo método para estender os recursos do sistema de arquivos. Este novo método tem suporte para o seguinte:

  • Vários locais de origem para arquivos de configuração (permite configurações de construção extensíveis).
  • Verificação de integridade em tempo de construção dos valores de OEM AID.
  • Geração de um cabeçalho OEM AID personalizado que pode ser usado em arquivos de origem conforme necessário.
  • Associação de um nome amigável com o valor real do OEM AID. Suporta argumentos de string não numéricos para usuário e grupo, ou seja, "foo" em vez de "2901".

Melhorias adicionais incluem a remoção dos android_ids[] matriz a partir system/core/libcutils/include/private/android_filesystem_config.h . Esta matriz agora existe no Bionic como uma matriz gerada totalmente particular, com assessores via getpwnam() e getgrnam() . (Isto tem o efeito colateral de produzir binários estáveis como auxiliares de núcleo são modificados.) Para ferramentas, e um ficheiro README com mais detalhes, referem-se a build/make/tools/fs_config .

Adicionar Android IDs (AIDs)

Android 8,0 removidos os android_ids[] matriz do Projecto Open Source Android (AOSP). Todos os nomes amigável-ajuda são em vez gerada a partir do system/core/libcutils/include/private/android_filesystem_config.h arquivo de cabeçalho ao gerar os Bionic android_ids[] matriz. Qualquer define correspondência AID_* é captado pelo ferramental e * torna-se o nome em minúsculas.

Por exemplo, em private/android_filesystem_config.h :

#define AID_SYSTEM 1000

Torna-se:

  • Nome amigável: sistema
  • uid: 1000
  • gid: 1000

Para adicionar uma nova ajuda núcleo AOSP, basta adicionar o #define ao android_filesystem_config.h arquivo de cabeçalho. O AID será gerado na construção e disponibilizado para interfaces que usam argumentos de usuário e grupo. O ferramental valida que o novo AID não está dentro das faixas de APP ou OEM; ele também respeita as alterações nessas faixas e deve reconfigurar automaticamente nas alterações ou em novas faixas reservadas pelo OEM.

Configurando AIDs

Para habilitar o novo mecanismo de SIDA, conjunto TARGET_FS_CONFIG_GEN na BoardConfig.mk arquivo. Esta variável contém uma lista de arquivos de configuração, permitindo que você anexe arquivos conforme necessário.

Por convenção, arquivos de configuração usar o nome config.fs , mas na prática você pode usar qualquer nome. config.fs arquivos estão no formato do ini Python ConfigParser e incluem uma seção tampas (para configurar as capacidades do sistema de arquivos) e uma seção de SIDA (para configurar OEM SIDA).

Configurando a seção de bonés

Os suportes seção tampas de ajuste capacidades do sistema de arquivos no sistema de arquivos objetos dentro da construção (o próprio sistema de arquivos também tem de suportar esta funcionalidade).

Como a execução de um serviço estável como root no Android faz com que a compatibilidade Test Suite (CTS) falha, requisitos prévios para reter uma capacidade durante a execução de um processo ou serviço em causa a criação de capacidades em seguida, usando setuid / setgid para a AID adequada para ser executado. Com maiúsculas, você pode pular esses requisitos e fazer com que o kernel faça isso por você. Quando o controle é entregue a main() , o processo já tem os recursos de que necessita para que o seu serviço pode usar um usuário não-root e grupo (este é o caminho preferido para iniciar os serviços privilegiadas).

A seção de maiúsculas usa a seguinte sintaxe:

Seção Valor Definição
[path] O caminho do sistema de arquivos a ser configurado. Um caminho que termina em / é considerado um diretório, caso contrário, é um arquivo.

É um erro especificar várias seções com a mesma [path] em diferentes arquivos. Nas versões do Python <= 3.2, o mesmo arquivo pode conter seções que substituem a seção anterior; no Python 3.2, é definido para o modo estrito.
mode Modo de arquivo octal Um modo de arquivo octal válido de pelo menos 3 dígitos. Se 3 for especificado, ele será prefixado com 0, caso contrário, o modo será usado como está.
user AID_ <usuário> Quer o C define uma ajuda válida ou o nome amigável (por exemplo, tanto AID_RADIO e radio são aceitáveis). Para definir um AID personalizado, consulte Configurando seção AID .
group AID_ <grupo> Igual ao usuário.
caps boné* O nome, tal como declarado no bionic/libc/kernel/uapi/linux/capability.h sem o primeiro CAP_ . Caso misto permitido. As tampas também podem ser cruas:
  • binário (0b0101)
  • octal (0455)
  • int (42)
  • hex (0xFF)
Separe vários limites usando espaços em branco.

Para um exemplo de uso, consulte Utilizando as capacidades do sistema de arquivos .

Configurando a seção AID

A seção AID contém AIDs OEM e usa a seguinte sintaxe:

Seção Valor Definição
[AID_<name>] O <name> pode conter caracteres no conjunto maiúsculas, números e sublinhados. A versão em minúsculas é usada como nome amigável. O arquivo de cabeçalho gerado para a inclusão de código usa o exato AID_<name> .

É um erro especificar várias seções com a mesma AID_<name> (caso insensível com as mesmas limitações que [path] ).

<name> deve começar com um nome de partição para garantir que ele não entre em conflito com diferentes fontes.
value <número> Uma string de número de estilo C válida (hex, octal, binária e decimal).

É um erro especificar várias seções com a mesma opção de valor.

Opções de valor deve ser especificado no intervalo correspondente a partição usada em <name> . A lista de partições válidas e suas faixas correspondentes é definido no system/core/libcutils/include/private/android_filesystem_config.h . As opções são:
  • Partição de Fornecedor
    • AID_OEM_RESERVED_START (2900) - AID_OEM_RESERVED_END (2999)
    • AID_OEM_RESERVED_2_START (5000) - AID_OEM_RESERVED_2_END (5999)
  • Partição do Sistema
    • AID_SYSTEM_RESERVED_START (6000) - AID_SYSTEM_RESERVED_END (6499)
  • Partição ODM
    • AID_ODM_RESERVED_START (6500) - AID_ODM_RESERVED_END (6999)
  • Partição de Produto
    • AID_PRODUCT_RESERVED_START (7000) - AID_PRODUCT_RESERVED_END (7499)
  • System_ext Partition
    • AID_SYSTEM_EXT_RESERVED_START (7500) - AID_SYSTEM_EXT_RESERVED_END (7999)

Para exemplos de uso, consulte nomes SOCORROS Defining OEM e Usando OEM AIDs .

Exemplos de uso

Os exemplos a seguir detalham como definir e usar um AID OEM e como habilitar os recursos do sistema de arquivos. Nomes OEM SOCORROS ([nome AID_]) deve começar com um nome de partição como "vendor_" para garantir que eles não entrem em conflito com os futuros nomes AOSP ou outras partições.

Definindo nomes de AIDs de OEM

Para definir uma ajuda OEM, criar um config.fs arquivo e defina o valor AID. Por exemplo, no device/x/y/config.fs , definir o seguinte:

[AID_VENDOR_FOO]
value: 2900

Depois de criar o arquivo, defina o TARGET_FS_CONFIG_GEN variável e apontá-la para BoardConfig.mk . Por exemplo, no device/x/y/BoardConfig.mk , definir o seguinte:

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

Seu AID personalizado agora pode ser consumido pelo sistema como um todo em uma nova construção.

Usando AIDs OEM

Para usar uma ajuda OEM, em seu código C, incluem os oemaids_headers em seu Makefile associado e adicionar #include "generated_oem_aid.h" , em seguida, começar a usar os identificadores declarados. Por exemplo, em my_file.c , adicione a seguinte:

#include "generated_oem_aid.h"
…

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

Em sua associada Android.bp arquivo, adicione o seguinte:

header_libs: ["oemaids_headers"],

Se você estiver usando uma Android.mk arquivo, em seguida, adicione o seguinte:

LOCAL_HEADER_LIBRARIES := oemaids_headers

Usando nomes amigáveis

No Android 9, você pode usar o nome amigável para qualquer interface que ofereça suporte a nomes de AID. Por exemplo:

  • Em um chown comando em some/init.rc :
    chown vendor_foo /vendor/some/vendor_foo/file
    
  • Em um service em some/init.rc :
    service vendor_foo /vendor/bin/foo_service
        user vendor_foo
        group vendor_foo
    

Uma vez que o mapeamento interno de nome amigável para UID é realizada por /vendor/etc/passwd e /vendor/etc/group , a partição do vendedor deve ser montado.

Associando nomes amigáveis

O Android 9 inclui suporte para associar um nome amigável ao valor real do OEM AID. Você pode usar argumentos de string não-numéricos para usuário e grupo, ou seja, "vendor_ foo" em vez de "2901".

Conversão de AID em nomes amigáveis

Para OEM AIDs , 8.x Android necessário o uso de oem_#### com getpwnam e funções similares, bem em lugares que consultas de manuseio de via getpwnam (como init de scripts). Em Android 9, você pode usar os getpwnam e getgrnam amigos em Bionic para a conversão de IDs Android (SIDA) para nomes amigáveis e vice-versa.

Usando recursos do sistema de arquivos

Para ativar os recursos do sistema de arquivos, criar uma seção bonés no config.fs arquivo. Por exemplo, no device/x/y/config.fs , adicionar a secção seguinte:

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

Depois de criar o arquivo, defina o TARGET_FS_CONFIG_GEN para apontar para esse arquivo no BoardConfig.mk . Por exemplo, no device/x/y/BoardConfig.mk , definir o seguinte:

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

Quando o serviço vendor_ foo é executado, ele começa com capacidades CAP_SYS_ADMIN e CAP_SYS_NICE sem setuid e setgid chamadas. Além disso, o vendor_ foo política SELinux de serviço não precisa mais capacidade de setuid e setgid e pode ser excluído.

Configurando substituições (Android 6.x-7.x)

Android 6.0 realocado fs_config e definições de estrutura associados ( system/core/include/private/android_filesystem_config.h ) para system/core/libcutils/fs_config.c onde poderiam ser atualizados ou substituídos por arquivos binários instalados em /system/etc/fs_config_dirs e /system/etc/fs_config_files . O uso de regras de correspondência e análise separadas para diretórios e arquivos (que podem usar expressões glob adicionais) permitiu ao Android lidar com diretórios e arquivos em duas tabelas diferentes. Definições de estrutura no system/core/libcutils/fs_config.c não só permitiu a leitura em tempo de execução de diretórios e arquivos, mas o anfitrião poderia usar os mesmos arquivos durante o tempo de compilação para imagens do sistema de arquivos construto como ${OUT}/system/etc/fs_config_dirs e ${OUT}/system/etc/fs_config_files .

Embora o método de substituição de estender o sistema de arquivos tenha sido substituído pelo sistema de configuração modular introduzido no Android 8.0, você ainda pode usar o método antigo, se desejar. As seções a seguir detalham como gerar e incluir arquivos de substituição e configurar o sistema de arquivos.

Gerando arquivos de substituição

Você pode gerar os alinhados binários arquivos /system/etc/fs_config_dirs e /system/etc/fs_config_files usando o fs_config_generate ferramenta na build/tools/fs_config . A ferramenta usa um libcutils função de biblioteca ( fs_config_generate() ) para gerenciar os requisitos do CAD em um buffer e define regras para um arquivo de inclusão para institucionalizar as regras do CAD.

Para usar, criar um arquivo de inclusão no device/ vendor / device /android_filesystem_config.h que atua como a substituição. O arquivo deve usar a structure fs_path_config formato definido no system/core/include/private/android_filesystem_config.h com os seguintes inicializações estrutura para arquivos e diretórios símbolos:

  • Para diretórios, use android _device _dirs[] .
  • Para arquivos, use android _device _files[] .

Quando não estiver usando android_device_dirs[] e android_device_files[] , você pode definir NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_DIRS e NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_FILES (veja o exemplo abaixo). Você também pode especificar o arquivo de substituição usando TARGET_ANDROID_FILESYSTEM_CONFIG_H na configuração da placa, com um nome base forçado de android_filesystem_config.h .

Incluindo arquivos de substituição

Para incluir arquivos, garantir que PRODUCT_PACKAGES inclui fs_config_dirs e / ou fs_config_files para que ele possa instalá-los para /system/etc/fs_config_dirs e /system/etc/fs_config_files , respectivamente. As pesquisas sistema de compilação para o costume de android_filesystem_config.h em $(TARGET_DEVICE_DIR) , onde BoardConfig.mk existe. Se esse arquivo existir em outros lugares, conjunto de variáveis bordo de configuração TARGET_ANDROID_FILESYSTEM_CONFIG_H para apontar para esse local.

Configurando o sistema de arquivos

Para configurar o sistema de arquivos no Android 6.0 e superior:

  1. Criar o $(TARGET_DEVICE_DIR)/android_filesystem_config.h arquivo.
  2. Adicione os fs_config_dirs e / ou fs_config_files para PRODUCT_PACKAGES no arquivo de configuração da placa (por exemplo, $(TARGET_DEVICE_DIR)/device.mk ).

Exemplo de substituição

Este exemplo mostra um patch para substituir o system/bin/glgps daemon para adicionar suporte de bloqueio de acionamento no device/ vendor / device diretório. Lembre-se do seguinte:

  • Cada entrada da estrutura é o modo, uid, gid, capacidades e o nome. system/core/include/private/android_filesystem_config.h está incluído automaticamente para fornecer os #defines manifestos ( AID_ROOT , AID_SHELL , CAP_BLOCK_SUSPEND ).
  • Os android_device_files[] secção inclui uma acção de acesso ao suprimir system/etc/fs_config_dirs quando não especificado, que serve como uma protecção adicional para o DAC falta de conteúdo para substituições de directório. No entanto, esta é uma proteção fraca; se alguém tem controle sobre /system , que normalmente pode fazer o que quiserem.
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)

Migrando sistemas de arquivos de versões anteriores

Ao migrar sistemas de arquivos do Android 5.x e anteriores, lembre-se de que o Android 6.x

  • Remove algumas inclusões, estruturas e definições embutidas.
  • Requer uma referência para libcutils em vez de correr directamente do system/core/include/private/android_filesystem_config.h . Fabricante do dispositivo executáveis privadas que dependem de system/code/include/private_filesystem_config.h para as estruturas de arquivos ou diretórios ou fs_config deve adicionar libcutils dependências da biblioteca.
  • Requer fabricante do dispositivo do ramo privado cópias do system/core/include/private/android_filesystem_config.h com conteúdo extra em metas existentes para se deslocar para device/ vendor / device /android_filesystem_config.h .
  • Reserva-se o direito de aplicar SELinux controles de acesso obrigatórios (Mac) para arquivos de configuração no sistema de destino, implementações que incluem personalizados executáveis destino usando fs_config() deve garantir o acesso.