Essas funcionalidades permitem que os processos do Linux descartem a maioria dos privilégios de root, mantendo o subconjunto de privilégios de que precisam para executar a própria função. A implementação original de recursos impossibilitava que processos fork+exec herdassem recursos, a menos que os arquivos executados tivessem recursos de arquivo configurados. Os recursos de arquivo, por sua vez, apresentam um risco de segurança, já que qualquer processo que execute um arquivo com recursos de arquivo pode ganhar esses recursos.
As funcionalidades de ambiente permitem que os serviços do sistema iniciados pelo init configurem
recursos nos arquivos .rc
, reunindo a configuração em
um único arquivo em vez de dividir a configuração no
arquivo fs_config.c
. Isso significa que, para qualquer serviço iniciado por
init, é possível usar o arquivo .rc
associado ao serviço para
configurar recursos.
As funcionalidades de ambiente são o mecanismo preferido para definir recursos
para serviços iniciados pela inicialização. Esse método mantém todos os aspectos da configuração
do serviço em um único arquivo .rc
. Recomendamos usar recursos
ambientais em vez de
configurar recursos do
sistema de arquivos usando a seção "caps" em arquivos config.fs
.
Ao definir recursos para serviços não iniciados por init,
continue configurando os recursos do sistema de arquivos usando
fs_config.c
.
Ativar recursos ambientais
Para ativar recursos ambientais em um determinado serviço, use a palavra-chave
capabilities
na inicialização. Para mais detalhes sobre a linguagem de inicialização atual, consulte o init README.md.
Por exemplo, para ativar as funcionalidades de ambiente para o serviço AOSP
wificond
, o
arquivo.rc
do serviço wificond
configura o usuário e os grupos adequados e concede ao serviço as funcionalidades especificadas usando a palavra-chave
capabilities
:
service wificond /system/bin/wificond class main user wifi group wifi net_raw net_admin capabilities NET_RAW NET_ADMIN
Implementação de referência
A implementação de referência é o kernel comum do Android https://android.googlesource.com/kernel/common/
Patches obrigatórios
Os patches necessários foram portados para todas as ramificações relevantes do kernel comum do Android.
O principal patch de recursos ambientais https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=58319057b7847667f0c9585b9de0e8932b0fdb08 foi portado para versões anteriores em:
- android-3.18:
- android-4.1:
Uma pequena correção de segurança https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=b7f76ea2ef6739ee484a165ffbac98deb855d3d3 foi portado para versões anteriores em:
- android-3.18:
- android-4.1:
Validação
Os testes de unidade do Bionic incluem testes de unidade para recursos ambientais. Além disso, usar a palavra-chave "capabilities" na inicialização do Android para um serviço e verificar se o serviço recebe as capacidades esperadas permite o teste em tempo de execução desse recurso.