Esta página aborda como a política do SELinux é criada. A política do SELinux é criada pela combinação da política principal do AOSP (plataforma) e da política específica do dispositivo (fornecedor). O fluxo de criação de políticas do SELinux para o Android 4.4 ao 7.0 mesclou todos os fragmentos de sepolicy e gerou arquivos monolíticos no diretório raiz. Isso significava que os fornecedores de SoC e os fabricantes de ODM modificavam boot.img (para dispositivos não A/B) ou system.img (para dispositivos A/B) sempre que a política era modificada.
No Android 8.0 e versões mais recentes, a política de plataforma e de fornecedor é criada separadamente.
Os SoCs e OEMs podem atualizar as partes da política, criar imagens (como vendor.img e boot.img) e atualizar essas imagens de forma independente das atualizações da plataforma.
No entanto, como os arquivos de política do SELinux modularizados são armazenados em partições /vendor, o processo init precisa ativar as partições system e do fornecedor mais cedo para que possa ler os arquivos do SELinux dessas partições e mesclá-los com os arquivos principais do SELinux no diretório system (antes de carregá-los no kernel).
Arquivos de origem
A lógica para criar o SELinux está nestes arquivos:
-
external/selinux: projeto externo do SELinux, usado para criar utilitários de linha de comando do HOST para compilar políticas e rótulos do SELinux.-
external/selinux/libselinux: o Android usa apenas um subconjunto do projetolibselinuxexterno, além de algumas personalizações específicas do Android. Para mais detalhes, consulteexternal/selinux/README.android. -
external/selinux/libsepol: -
external/selinux/checkpolicy: compilador de políticas do SELinux (executáveis do host:checkpolicy,checkmodule, edispol). Depende delibsepol.
-
-
system/sepolicy: configurações principais da política do SELinux do Android, incluindo contextos e arquivos de política. A lógica principal de criação de sepolicy também está aqui (system/sepolicy/Android.mk).
Para mais detalhes sobre os arquivos em system/sepolicy, consulte
Arquivos principais.
Android 7.x e versões anteriores
Esta seção aborda como a política do SELinux é criada no Android 7.x e versões anteriores.
Processo de build para o Android 7.x e versões anteriores
A política do SELinux é criada combinando a política principal do AOSP com personalizações específicas do dispositivo. A política combinada é transmitida ao compilador de políticas e a vários verificadores. A personalização específica do dispositivo é feita pela variável BOARD_SEPOLICY_DIRS definida no arquivo Boardconfig.mk específico do dispositivo. Essa variável de build global contém uma lista de diretórios que especificam a ordem em que os arquivos de política adicionais devem ser pesquisados.
Por exemplo, um fornecedor de SoC e um ODM podem adicionar um diretório, um para as configurações específicas do SoC e outro para as configurações específicas do dispositivo, para gerar as configurações finais do SELinux para um determinado dispositivo:
BOARD_SEPOLICY_DIRS += device/SoC/common/sepolicyBOARD_SEPOLICY_DIRS += device/SoC/DEVICE/sepolicy
O conteúdo dos arquivos file_contexts em system/sepolicy e BOARD_SEPOLICY_DIRS é concatenado para gerar o file_contexts.bin no dispositivo:

Figura 1. Lógica de criação do SELinux.
O arquivo sepolicy consiste em vários arquivos de origem:
- O texto simples
policy.confé gerado pela concatenação desecurity_classes,initial_sids, arquivos*.te,genfs_contextseport_contextsnessa ordem. - Para cada arquivo (como
security_classes), o conteúdo é a concatenação dos arquivos com o mesmo nome emsystem/sepolicy/eBOARDS_SEPOLICY_DIRS. - O
policy.confé enviado ao compilador do SELinux para verificação de sintaxe e compilado em formato binário comosepolicyno dispositivo.
Figura 2. Arquivo de política do SELinux.
Arquivos do SELinux
Após a compilação, os dispositivos Android que executam a versão 7.x e anteriores geralmente contêm os seguintes arquivos relacionados ao SELinux:
selinux_versionsepolicy: saída binária após combinar arquivos de política (comosecurity_classes,initial_sids, e*.te)file_contextsproperty_contextsseapp_contextsservice_contextssystem/etc/mac_permissions.xml
Para mais detalhes, consulte Implementar o SELinux.
Inicialização do SELinux
Quando o sistema é inicializado, o SELinux está no modo permissivo (e não no modo de restrição). O processo de inicialização executa as seguintes tarefas:
- Carrega arquivos
sepolicydo ramdisk para o kernel usando/sys/fs/selinux/load. - Muda o SELinux para o modo de restrição.
- Executa
re-exec()para aplicar a regra de domínio do SELinux a si mesmo.
Para encurtar o tempo de inicialização, execute o re-exec() no processo init o mais rápido possível.
Android 8.0 e versões mais recentes
No Android 8.0, a política do SELinux é dividida em componentes de plataforma e de fornecedor para permitir atualizações independentes de políticas de plataforma e de fornecedor, mantendo a compatibilidade.
A sepolicy da plataforma é dividida em partes pública e privada para exportar tipos e atributos específicos para os gravadores de políticas do fornecedor. Os tipos/atributos públicos da plataforma têm garantia de serem mantidos como APIs estáveis para uma determinada versão da plataforma. A compatibilidade com tipos/atributos públicos de plataformas anteriores pode ser garantida para várias versões usando arquivos de mapeamento de plataforma.
Processo de build para o Android 8.0
A política do SELinux no Android 8.0 é feita combinando partes de /system e /vendor. A lógica para configurar isso
adequadamente está em
/platform/system/sepolicy/Android.bp.
A política existe nos seguintes locais:
| Local | Contém |
|---|---|
system/sepolicy/public |
API de sepolicy da plataforma |
system/sepolicy/private |
Detalhes da implementação da plataforma (os fornecedores podem ignorar) |
system/sepolicy/vendor |
Arquivos de política e contexto que os fornecedores podem usar (os fornecedores podem ignorar) |
BOARD_SEPOLICY_DIRS |
Sepolicy do fornecedor |
BOARD_ODM_SEPOLICY_DIRS (Android 9 e versões mais recentes) |
Sepolicy do ODM |
SYSTEM_EXT_PUBLIC_SEPOLICY_DIRS (Android 11 e versões mais recentes) |
API de sepolicy system_ext |
SYSTEM_EXT_PRIVATE_SEPOLICY_DIRS (Android 11 e versões mais recentes) |
Detalhes da implementação de system_ext (os fornecedores podem ignorar) |
PRODUCT_PUBLIC_SEPOLICY_DIRS (Android 11 e versões mais recentes) |
API de sepolicy do produto |
PRODUCT_PRIVATE_SEPOLICY_DIRS (Android 11 e versões mais recentes) |
Detalhes da implementação do produto (os fornecedores podem ignorar) |
O sistema de build usa essa política e produz system, system_ext,
product, vendor, e odm componentes de política na
partição correspondente. As etapas incluem:
- Converter políticas para o formato da linguagem intermediária comum (CIL, na sigla em inglês) do SELinux
, especificamente:
- Política pública da plataforma (
system,system_ext,product) - Política pública e privada combinada
- Política pública, de fornecedor e
BOARD_SEPOLICY_DIRS
- Política pública da plataforma (
- Versionar a política fornecida pelo público como parte da política do fornecedor.
Use a política pública de CIL produzida para informar a política pública e de
fornecedor combinada e
BOARD_SEPOLICY_DIRSsobre quais partes precisam ser transformadas em atributos vinculados à política da plataforma. - Crie um arquivo de mapeamento que vincule as partes da plataforma e do fornecedor. Inicialmente, isso apenas vincula os tipos da política pública aos atributos correspondentes na política do fornecedor. Mais tarde, ela também fornece a base para o arquivo mantido em versões futuras da plataforma, permitindo a compatibilidade com a política do fornecedor direcionada a essa versão da plataforma.
- Combine arquivos de política (descreva soluções no dispositivo e pré-compiladas).
- Combine o mapeamento, a plataforma e a política do fornecedor.
- Compile o arquivo de política binária de saída.
Sepolicy pública da plataforma
A sepolicy pública da plataforma inclui tudo o que está definido em
system/sepolicy/public. A plataforma pode presumir que os tipos e atributos definidos na política pública são APIs estáveis para uma determinada versão da plataforma. Isso forma a parte da sepolicy que é exportada pela plataforma em que os desenvolvedores de políticas de fornecedores (ou seja, de dispositivos) podem gravar políticas adicionais específicas do dispositivo.
Os tipos são versionados de acordo com a versão da política em que os arquivos do fornecedor são gravados, definidos pela variável de build PLATFORM_SEPOLICY_VERSION. A política pública versionada é incluída na política do fornecedor e (na forma original) na política da plataforma. Assim, a política final inclui a política privada da plataforma, a sepolicy pública da plataforma atual, a política específica do dispositivo e a política pública versionada correspondente à versão da plataforma em que a política do dispositivo foi gravada.
Sepolicy privada da plataforma
A sepolicy privada da plataforma inclui tudo o que está definido em
/system/sepolicy/private. Essa parte da política forma tipos, permissões e atributos somente da plataforma necessários para a funcionalidade da plataforma. Eles não são exportados para os gravadores de políticas de fornecedores e dispositivos. Os gravadores de políticas não relacionadas à plataforma não podem gravar extensões de política com base em tipos, atributos e regras definidos na sepolicy privada da plataforma. Além disso, essas regras podem ser modificadas ou desaparecer como parte de uma atualização somente do framework.
Mapeamento privado da plataforma
O mapeamento privado da plataforma inclui declarações de política que mapeiam os atributos expostos na política pública da plataforma das versões anteriores da plataforma para os tipos concretos usados na sepolicy pública da plataforma atual. Isso garante que a política do fornecedor gravada com base em atributos públicos da plataforma das versões anteriores da sepolicy pública da plataforma continue funcionando. O controle de versões é baseado na variável de build PLATFORM_SEPOLICY_VERSION definida no AOSP para uma determinada versão da plataforma. Um arquivo de mapeamento separado existe para cada versão anterior da plataforma em que essa plataforma deve aceitar a política do fornecedor. Para mais detalhes, consulte
Compatibilidade de políticas.
Android 11 e versões mais recentes
Esta seção aborda como a política do SELinux é criada no Android 11 e versões mais recentes.
Sepolicy de system_ext e de produto
No Android 11, as políticas system_ext e product são adicionadas. Assim como a sepolicy da plataforma, a política system_ext e a política product são divididas em política pública e política privada.
A política pública é exportada para o fornecedor. Os tipos e atributos se tornam APIs estáveis, e a política do fornecedor pode se referir a tipos e atributos na política pública. Os tipos são versionados de acordo com PLATFORM_SEPOLICY_VERSION, e a política versionada é incluída na política do fornecedor. A política original é incluída em cada partição system_ext e product.
A política privada contém tipos, permissões e atributos somente system_ext e product necessários para a funcionalidade da partição system_ext e product.
A política privada é invisível para o fornecedor, o que implica que essas regras são internas e podem ser modificadas.
Mapeamento de system_ext e de produto
system_ext e product podem exportar os tipos públicos designados para o fornecedor. No entanto, cada parceiro tem a responsabilidade de manter a compatibilidade. Para compatibilidade, os parceiros podem fornecer os próprios arquivos de mapeamento que mapeiam os atributos versionados de versões anteriores para tipos concretos usados na sepolicy pública atual:
- Para instalar um arquivo de mapeamento para
system_ext, coloque um arquivo CIL contendo as informações de mapeamento desejadas em{SYSTEM_EXT_PRIVATE_SEPOLICY_DIRS}/compat/{ver}/{ver}.cil, e adicionesystem_ext_{ver}.cilaPRODUCT_PACKAGES. - Para instalar um arquivo de mapeamento para
product, coloque um arquivo CIL contendo as informações de mapeamento desejadas em{PRODUCT_PRIVATE_SEPOLICY_DIRS}/compat/{ver}/{ver}.cile adicioneproduct_{ver}.cilaPRODUCT_PACKAGES.
Consulte um
exemplo
que adiciona um arquivo de mapeamento da partição product de um dispositivo Redbull.
Política do SELinux pré-compilada
Antes que init ative o SELinux, init coleta todos os arquivos CIL de partições
(system, system_ext, product, vendor e
odm) e os compila em uma política binária, o formato que pode ser carregado no kernel. Como a compilação leva tempo (geralmente de 1 a 2 segundos), os arquivos CIL são pré-compilados no tempo de build e colocados em /vendor/etc/selinux/precompiled_sepolicy ou /odm/etc/selinux/precompiled_sepolicy, junto com os hashes sha256 dos arquivos CIL de entrada. No ambiente de execução, init verifica se algum arquivo de política foi atualizado comparando os hashes. Se nada mudou, init carrega a política pré-compilada. Caso contrário, init compila em tempo real e a usa em vez da pré-compilada.
Mais especificamente, a política pré-compilada é usada se todas as condições a seguir forem atendidas. Aqui, {partition} representa a partição em que a política pré-compilada existe: vendor ou odm.
- Os arquivos
/system/etc/selinux/plat_sepolicy_and_mapping.sha256e/{partition}/etc/selinux/precompiled_sepolicy.plat_sepolicy_and_mapping.sha256existem e são idênticos. - Os arquivos
/system_ext/etc/selinux/system_ext_sepolicy_and_mapping.sha256e/{partition}/etc/selinux/precompiled_sepolicy.system_ext_sepolicy_and_mapping.sha256não existem. Ou ambos existem e são idênticos. - Os arquivos
/product/etc/selinux/product_sepolicy_and_mapping.sha256e/{partition}/etc/selinux/precompiled_sepolicy.product_sepolicy_and_mapping.sha256não existem. Ou ambos existem e são idênticos.
Se algum deles for diferente, init vai voltar para o caminho de compilação no dispositivo. Consulte
system/core/init/selinux.cpp para mais detalhes.