Esta página aborda como a política do SELinux é criada. A política do SELinux é criada a partir
da combinação da política principal do AOSP (plataforma) e da política específica do dispositivo
(fabricante). O fluxo de build de políticas do SELinux para o Android 4.4 até o
Android 7.0 mesclou todos os fragmentos de sepolicy e gerou arquivos monolíticos no diretório
raiz. Isso significa 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) toda vez que a política era
modificada.
No Android 8.0 e versões mais recentes, a política da plataforma e do fornecedor é criada separadamente.
Os SOCs e OEMs podem atualizar as partes da política, criar as imagens
(como vendor.img
e boot.img
)
e atualizar essas imagens independentemente das atualizações
da plataforma.
No entanto, como os arquivos de política modularizados do SELinux são armazenados em partições
/vendor
, o processo init
precisa montar as partições do sistema e do fornecedor
antes para poder ler os arquivos do SELinux dessas partições e mesclar
com os arquivos principais do SELinux no diretório do sistema (antes de carregá-los no
kernel).
Arquivos de origem
A lógica para criar o SELinux está nestes arquivos:
-
external/selinux
: projeto SELinux externo, usado para criar utilitários de linha de comando HOST para compilar políticas e rótulos do SELinux.-
external/selinux/libselinux
: o Android usa apenas um subconjunto do projetolibselinux
externo com algumas personalizações específicas do Android. Confira mais detalhes emexternal/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 de política do SELinux do Android principal, 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
Como implementar o SELinux.
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árias verificadoras. 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íticas adicionais serão 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/sepolicy
BOARD_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. Criação de lógica do SELinux.
O arquivo sepolicy
consiste em vários arquivos de origem:
- O texto simples
policy.conf
é gerado concatenandosecurity_classes
,initial_sids
,*.te
,genfs_contexts
eport_contexts
nessa 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 no formato binário comosepolicy
no dispositivo.Figura 2. Arquivo de política do SELinux.
Arquivos SELinux
Após a compilação, os dispositivos Android com o 7.x e versões anteriores geralmente contêm os seguintes arquivos relacionados ao SELinux:
selinux_version
- sepolicy: saída binária após a combinação de arquivos de política
(como
security_classes
,initial_sids
e*.te
) file_contexts
property_contexts
seapp_contexts
service_contexts
system/etc/mac_permissions.xml
Para mais detalhes, consulte Como 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
sepolicy
do 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 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 fornecedor para permitir atualizações independentes de políticas de plataforma/fornecedor, mantendo a compatibilidade.
A política de segurança da plataforma é dividida em partes públicas e privadas para exportar tipos e atributos específicos para os autores de políticas do fornecedor. Os tipos/atributos públicos da plataforma são mantidos como APIs estáveis para uma determinada versão da plataforma. A compatibilidade com tipos/atributos públicos públicos da plataforma anteriores pode ser garantida para várias versões usando arquivos de mapeamento da plataforma.
Processo de build para 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
corretamente está em
/platform/system/sepolicy/Android.mk
.
A política está nos seguintes locais:
Local | Contém |
---|---|
system/sepolicy/public |
A API 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 se quiserem) |
BOARD_SEPOLICY_DIRS |
Política de segurança do fornecedor |
BOARD_ODM_SEPOLICY_DIRS (Android 9 e versões mais recentes) |
Odm sepolicy |
SYSTEM_EXT_PUBLIC_SEPOLICY_DIRS (Android 11 e versões mais recentes) |
API sepolicy do System_ext |
SYSTEM_EXT_PRIVATE_SEPOLICY_DIRS (Android 11 e versões mais recentes) |
Detalhes da implementação do system_ext (os fornecedores podem ignorar) |
PRODUCT_PUBLIC_SEPOLICY_DIRS (Android 11 e versões mais recentes) |
API 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 componentes de política de sistema, system_ext, produto, fornecedor e odm na partição correspondente. As etapas incluem:
- Conversão de 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 + fornecedor e
BOARD_SEPOLICY_DIRS
- Controle de versões da política fornecida pelo público como parte da política do fornecedor.
É feito usando a política de CIL pública produzida para informar a política pública +
fornecedor +
BOARD_SEPOLICY_DIRS
combinada sobre quais partes precisam ser transformadas em atributos que serão vinculados à política da plataforma. - Criação de um arquivo de mapeamento que vincula 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, ele também vai fornecer 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.
- Combinar arquivos de política (descrever soluções no dispositivo e pré-compiladas).
- Combine a política de mapeamento, plataforma e fornecedor.
- Compile o arquivo de política binária de saída.
Política de segurança pública da plataforma
A política de segurança pública da plataforma inclui tudo o que é definido em
system/sepolicy/public
. A plataforma pode assumir que os tipos e
atributos definidos na política pública são APIs estáveis para uma determinada versão
da plataforma. Isso faz parte da política de segurança exportada pela plataforma em
que os desenvolvedores de políticas de fornecedores (ou seja, dispositivos) podem escrever outras
políticas específicas do dispositivo.
Os tipos são versionados de acordo com a versão da política para a qual os arquivos
do fornecedor são escritos, definida pela variável de build
PLATFORM_SEPOLICY_VERSION
. A política pública com versão é 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 de plataforma privada, a política pública da plataforma
atual, a política específica do dispositivo e a política pública com versão
correspondente à versão da plataforma em que a política do dispositivo foi
criada.
Política de segurança privada da plataforma
A política de segurança privada da plataforma inclui tudo o que é definido em
/system/sepolicy/private
. Essa parte da política forma
tipos, permissões e atributos exclusivos da plataforma necessários para a funcionalidade
da plataforma. Eles não são exportados para os autores de políticas
vendor/device
. Os autores de políticas que não são da plataforma não podem gravar as extensões de políticas
com base em tipos/atributos/regras definidos na política de segurança privada da plataforma. Além disso,
essas regras podem ser modificadas ou podem desaparecer como parte de uma
atualização somente do framework.
Mapeamento particular da plataforma
O mapeamento particular da plataforma inclui declarações de políticas que mapeiam os atributos
expostos na política pública da plataforma das versões anteriores para os
tipos concretos usados na política pública atual da plataforma. Isso garante que a política do fornecedor que foi gravada com base nos atributos públicos da plataforma das versões anteriores da política de segurança pública da plataforma continue funcionando. O
controle de versão é 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 da qual essa plataforma deve aceitar
a política do fornecedor. Para mais detalhes, consulte
Compatibilidade.
Android 11 e versões mais recentes
system_ext e sepolicy do produto
No Android 11, a política system_ext e a política do produto foram adicionadas. Assim como a plataforma sepolicy, a política system_ext e a política do produto são divididas em política pública e privada.
A política pública é exportada para o fornecedor. Os tipos e atributos se tornam uma API estável, 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 do produto.
A política particular contém tipos, permissões e atributos exclusivos de system_ext e de produtos necessários para a funcionalidade das partições system_ext e de produtos. A política particular é invisível para o fornecedor, o que significa que essas regras são internas e podem ser modificadas.
system_ext e mapeamento de produtos
system_ext e product podem exportar os tipos públicos designados para o fornecedor. No entanto, a responsabilidade de manter a compatibilidade é de cada parceiro. 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 política de segurança 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}.cil
aPRODUCT_PACKAGES
. - Para instalar um arquivo de mapeamento para o produto, coloque um arquivo cil com as
informações de mapeamento desejadas em
{PRODUCT_PRIVATE_SEPOLICY_DIRS}/compat/{ver}/{ver}.cil
e adicioneproduct_{ver}.cil
aPRODUCT_PACKAGES
.
Consulte um exemplo que adiciona um arquivo de mapeamento da partição de produto do dispositivo redbull.
Política SELinux pré-compilada
Antes de init
ativar o SELinux, init
reúne todos os arquivos CIL das 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 um a dois segundos), os arquivos CIL são pré-compilados no momento da criação 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 momento da execução, o init
verifica se algum dos arquivos de política foi atualizado comparando
os hashes. Se nada tiver mudado, init
vai carregar a política pré-compilada. Caso contrário,
init
será compilado em tempo real e usado em vez do pré-compilado.
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
.
-
Tanto
/system/etc/selinux/plat_sepolicy_and_mapping.sha256
quanto/{partition}/etc/selinux/precompiled_sepolicy.plat_sepolicy_and_mapping.sha256
existem e são idênticos. -
/system_ext/etc/selinux/system_ext_sepolicy_and_mapping.sha256
e/{partition}/etc/selinux/precompiled_sepolicy.system_ext_sepolicy_and_mapping.sha256
não existem. Ou ambos existem e são idênticos. -
/product/etc/selinux/product_sepolicy_and_mapping.sha256
e/{partition}/etc/selinux/precompiled_sepolicy.product_sepolicy_and_mapping.sha256
não existem. Ou ambos existem e são idênticos.
Se algum deles for diferente, a init
vai usar o caminho de compilação no dispositivo. Consulte
system/core/init/selinux.cpp
para mais detalhes.