Controle de acesso discricionário (DAC, na sigla em inglês)

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

Versões anteriores do Android (Android 7.x e anteriores) estendevam os AIDs mecanismo usando um android_filesystem_config.h específico do dispositivo para especificar recursos do sistema de arquivos e/ou AIDs personalizados do OEM. No entanto, não era intuitivo, porque não suportava o uso de bons nomes para AIDs de OEM, exigindo que você especifique o numérico bruto para campos de usuário e grupo sem um de associar um nome amigável ao AID numérico.

Versões mais recentes do Android (Android 8.0 e posteriores) oferecem suporte a um novo método para e ampliar os recursos do sistema de arquivos. Esse novo método tem suporte para seguintes:

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

Outras melhorias incluem a remoção do android_ids[]. matriz de system/core/libcutils/include/private/android_filesystem_config.h. Isso agora existe no Bionic como uma matriz gerada totalmente privada, com acessores com getpwnam() e getgrnam(). Isso tem o efeito colateral de produzir binários estáveis à medida que os AIDs do núcleo são modificados.) Para de código aberto e um arquivo README com mais detalhes, consulte build/make/tools/fs_config:

Adicionar IDs do Android (AIDs)

O Android 8.0 removeu a matriz android_ids[] do Android Open Source Project (AOSP) Todos os nomes compatíveis com AID são gerados system/core/libcutils/include/private/android_filesystem_config.h arquivo principal ao gerar a matriz android_ids[] Bionic. Qualquer um A define correspondente ao AID_* é selecionada pelas ferramentas e * se torna o nome em letras minúsculas.

Por exemplo, em private/android_filesystem_config.h:

#define AID_SYSTEM 1000

O resultado é:

  • Nome amigável: system
  • UID: 1000
  • gid: 1.000

Para adicionar um novo AID principal do AOSP, basta adicionar o #define ao Arquivo principal android_filesystem_config.h. O AID é geradas na criação e disponibilizadas para interfaces que usam usuários e grupos . As ferramentas validam que o novo AID não está no app ou OEM. intervalos ela também respeita as mudanças nesses intervalos e deve identificar reconfigurar após mudanças ou novos intervalos reservados para OEM.

Configurar AIDs

Para ativar o novo mecanismo de AIDs, defina TARGET_FS_CONFIG_GEN na arquivo BoardConfig.mk. Essa variável contém uma lista de configurações arquivos, permitindo que você os anexe conforme necessário.

Por convenção, os arquivos de configuração usam o nome config.fs, mas em você pode usar qualquer nome. config.fs arquivos estão no Python ConfigParser ini format e inclui uma seção em letras maiúsculas (para configurar o arquivo recursos do sistema) e uma seção de AIDs (para configurar AIDs de OEM).

Configurar a seção de limites

A seção de limites permite a configuração arquivo recursos do sistema em objetos do sistema de arquivos na versão (o sistema de arquivos também precisa oferecer suporte para essa funcionalidade).

Como executar um serviço estável como raiz no Android faz com que uma Conjunto de teste de compatibilidade (CTS) os requisitos anteriores para manter uma capacidade durante a execução ou serviço envolvia a configuração de recursos e o uso setuid/setgid para um AID adequado para ser executado. Com letras maiúsculas, você podem ignorar esses requisitos e fazer com que o kernel faça isso por você. Quando o controle é transferido para main(), seu processo já tem os recursos necessidades para que seu serviço possa usar um usuário e um grupo não raiz (essa é a preferência para iniciar serviços privilegiados).

A seção sobre limites 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 dir, caso contrário, é um arquivo.

É um erro especificar várias seções com o mesmo [path] em arquivos diferentes. Nas versões 3.2 e anteriores do Python, a o mesmo arquivo pode conter seções que substituem a seção anterior. em Python 3.2, ele está no modo estrito.
mode Modo de arquivo octal Um modo de arquivo octal válido de pelo menos três dígitos. Se 3 for especificado, será prefixado com 0. O modo else é usado no estado em que se encontra.
user AID_<usuário> O C define para um AID válido ou o nome amigável Por exemplo, AID_RADIO e radio são aceitáveis. Para definir um AID personalizado, consulte Como configurar a seção AID.
group AID_<grupo> Igual ao usuário.
caps limite* O nome declarado em bionic/libc/kernel/uapi/linux/capability.h sem o CAP_ inicial. É permitido usar letras maiúsculas e minúsculas. Bonés também podem ser bruto:
  • binário (0b0101)
  • octal (0455)
  • int (42)
  • hexadecimal (0xFF)
. Separe várias letras usando espaços em branco.

Para um exemplo de uso, consulte Como usar o arquivo recursos do sistema operacional.

Configurar a seção AID

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

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

É um erro especificar várias seções com o mesmo AID_<name> (não diferencia maiúsculas de minúsculas com as mesmas restrições [path]).

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

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

As opções de valor precisam ser especificadas no intervalo correspondente à partição usado em <name>. A lista de partições válidas e as intervalos são definidos em system/core/libcutils/include/private/android_filesystem_config.h. As opções são:
  • Partição do 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 produtos
    • AID_PRODUCT_RESERVED_START(7000) - AID_PRODUCT_RESERVED_END(7499)
  • Partição System_ext
    • AID_SYSTEM_EXT_RESERVED_START(7500) – AID_SYSTEM_EXT_RESERVED_END(7999)

Para exemplos de uso, consulte Como definir OEMs Nomes de AID e Como usar AIDs de OEM.

Exemplos de uso

Os exemplos a seguir mostram como definir e usar um AID do OEM e como ativar os recursos do sistema de arquivos. Nomes de AIDs de OEM ([AID_name]) precisa começar com nome da partição, como "vendor_" para garantir que não entrem em conflito com futuras Nomes do AOSP ou outras partições.

Definir nomes de AIDs de OEM

Para definir um AID de OEM, crie um arquivo config.fs e configure o valor AID. Por exemplo, em device/x/y/config.fs, defina o seguintes:

[AID_VENDOR_FOO]
value: 2900

Depois de criar o arquivo, defina a variável TARGET_FS_CONFIG_GEN e apontá-lo em BoardConfig.mk. Por exemplo, em device/x/y/BoardConfig.mk, defina o seguinte:

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

Agora, seu AID personalizado pode ser consumido pelo sistema em um novo build.

Usar AIDs de OEM

Para usar um AID do OEM, inclua o oemaids_headers no seu código C no código Makefile, adicionar #include "generated_oem_aid.h" e começar a usar o identificadores. Por exemplo, em my_file.c, adicione o seguinte:

#include "generated_oem_aid.h"
…

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

No seu arquivo Android.bp associado, adicione o seguinte:

header_libs: ["oemaids_headers"],

Se você estiver usando um arquivo Android.mk, adicione o seguinte:

LOCAL_HEADER_LIBRARIES := oemaids_headers

Use nomes intuitivos.

No Android 9, você pode usar o nome amigável para qualquer que dá suporte a nomes de AIDs. Exemplo:

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

Como o mapeamento interno do nome amigável para o uid é executado pelo /vendor/etc/passwd e /vendor/etc/group, o fornecedor precisa ser montada.

Nomes de fácil associação

O Android 9 inclui suporte para associar uma nome amigável com o valor real do AID do OEM. Você pode usar strings não numéricas argumentos para usuário e grupo, ou seja, "vendor_foo" em vez de "2901".

Converter de AID em nomes intuitivos

Para AIDs de OEM, o Android 8.x exigia o uso de oem_#### com getpwnam e funções semelhantes, conforme bem em lugares que processam pesquisas com getpwnam (como init). No Android 9, você pode use os amigos getpwnam e getgrnam no Bionic para conversão de IDs do Android (AIDs) para nomes intuitivos e vice-versa.

Usar recursos do sistema de arquivos

Para ativar os recursos do sistema de arquivos, crie uma seção em Caps config.fs. Por exemplo, em device/x/y/config.fs, adicione a seguinte seção:

[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 em BoardConfig.mk. Por exemplo, em device/x/y/BoardConfig.mk, defina o seguinte:

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

Quando o serviço vendor_foo é executado, ele é iniciado com os recursos CAP_SYS_ADMIN e CAP_SYS_NICE sem chamadas setuid e setgid. Além disso, A política de SELinux do serviço vendor_foo não está mais disponível precisa da capacidade setuid e setgid e pode ser excluída.

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

O Android 6.0 realocou o fs_config e a estrutura associada definições (system/core/include/private/android_filesystem_config.h) a system/core/libcutils/fs_config.c onde eles podem ser atualizados ou substituído por arquivos binários instalados em /system/etc/fs_config_dirs e /system/etc/fs_config_files. Uso de correspondência e análise separadas regras para diretórios e arquivos (que podem usar expressões glob adicionais) ativou o Android para lidar com diretórios e arquivos em duas tabelas diferentes. As definições de estrutura em system/core/libcutils/fs_config.c não permitia somente a leitura de diretórios e arquivos em tempo de execução, mas o host podia usar dos mesmos arquivos durante a compilação para criar imagens do sistema de arquivos como ${OUT}/system/etc/fs_config_dirs e ${OUT}/system/etc/fs_config_files

O método de substituição de estender o sistema de arquivos foi substituído pelo com o sistema de configuração modular introduzido no Android 8.0, você ainda pode usar a versão se quiser. As seções a seguir detalham como gerar e incluir substituir arquivos e configurar o sistema de arquivos.

Gerar arquivos de substituição

É possível gerar os arquivos binários alinhados /system/etc/fs_config_dirs e /system/etc/fs_config_files usando o método Ferramenta fs_config_generate em build/tools/fs_config. A ferramenta usa uma função da biblioteca libcutils (fs_config_generate()) para gerenciar os requisitos de DAC em um buffer e define as regras de um arquivo de inclusão para institucionalizar as regras do DAC.

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

  • Para diretórios, use android_device_dirs[].
  • Para arquivos, use android_device_files[].

Quando não usar android_device_dirs[] e android_device_files[], é possível definir NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_DIRS e NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_FILES (consulte a exemplo abaixo). Também é possível especificar arquivo usando TARGET_ANDROID_FILESYSTEM_CONFIG_H no quadro com um nome de base aplicado de android_filesystem_config.h.

Incluir arquivos de substituição

Para incluir arquivos, verifique se PRODUCT_PACKAGES inclui fs_config_dirs e/ou fs_config_files para que ela possa instalá-los em /system/etc/fs_config_dirs e /system/etc/fs_config_files, respectivamente. O sistema de build pesquisas sobre android_filesystem_config.h personalizado em $(TARGET_DEVICE_DIR), em que BoardConfig.mk existe. Se o arquivo já existir em outro lugar, defina a variável de configuração da placa TARGET_ANDROID_FILESYSTEM_CONFIG_H para apontar para esse local.

Configurar o sistema de arquivos

Para configurar o sistema de arquivos no Android 6.0 e versões mais recentes:

  1. Criar o $(TARGET_DEVICE_DIR)/android_filesystem_config.h .
  2. Adicione fs_config_dirs e/ou fs_config_files a 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 para adicionar suporte a wake locks device/vendor/device. Mantenha o o seguinte:

  • Cada entrada da estrutura é o modo, o UID, o gid, os recursos e o nome. system/core/include/private/android_filesystem_config.h é incluído automaticamente para fornecer o manifesto #defines (AID_ROOT, AID_SHELL, CAP_BLOCK_SUSPEND).
  • A seção android_device_files[] inclui uma ação para suprimem o acesso a system/etc/fs_config_dirs quando não especificado, que serve como uma proteção adicional do DAC para a falta de conteúdo no diretório. substituições. No entanto, essa proteção é fraca; se alguém tem controle sobre /system, ela geralmente pode fazer o que quiser.
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)

Migrar sistemas de arquivos de versões anteriores

Ao migrar sistemas de arquivos do Android 5.x e versões anteriores, tenha em mente que Android 6.x

  • Remove alguns inclusões, estruturas e definições inline.
  • Exige uma referência a libcutils em vez de ser executado diretamente de system/core/include/private/android_filesystem_config.h. Executáveis particulares do fabricante do dispositivo que dependem de system/code/include/private_filesystem_config.h para o arquivo ou estruturas de diretórios ou fs_config precisam adicionar libcutils dependências de biblioteca.
  • Requer cópias da ramificação privada do fabricante do dispositivo do system/core/include/private/android_filesystem_config.h com conteúdo extra nas segmentações existentes para mover para device/vendor/device/android_filesystem_config.h.
  • Reserva-se o direito de aplicar os Controles de Acesso Obrigatórios (MAC) do SELinux para de configuração no sistema de destino, implementações que incluem arquivos executáveis de destino usando fs_config() precisam garantir o acesso.