Os recursos permitem que os processos do Linux descartem a maioria dos privilégios de root, mantendo o subconjunto de privilégios necessários para executar a própria função. A implementação original de capabilities tornava impossível que os processos fork+exec herdassem capabilities, a menos que os arquivos executados tivessem capabilities 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 por 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, você pode usar o arquivo .rc
associado ao serviço para
configurar os recursos dele.
As funcionalidades de ambiente são o mecanismo preferencial para definir recursos
para serviços iniciados por init. Esse método mantém todos os aspectos da configuração
do serviço em um único arquivo .rc
. Recomendamos o uso de recursos
de ambiente em vez de
configurar recursos do sistema de arquivos
usando a seção de caps em arquivos config.fs
.
Ao definir recursos para serviços não iniciados por init,
continue a configurar os recursos do sistema de arquivos usando
fs_config.c
.
Ativar os recursos do Modo ambiente
Para ativar os recursos de ambiente para um determinado serviço, use a
palavra-chave capabilities
na inicialização. Para detalhes sobre a linguagem de inicialização
atual, consulte o
init README.md.
Por exemplo, para ativar as capacidades de ambiente para o serviço wificond
AOSP, o
arquivo.rc
do serviço wificond
configura o usuário e os grupos
adequados e concede ao serviço as capacidades 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 portado de volta para todas as ramificações relevantes do kernel comum do Android.
O principal patch de recursos do ambiente https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=58319057b7847667f0c9585b9de0e8932b0fdb08 foi enviado de volta 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 incluída em:
- android-3.18:
- android-4.1:
Validação
Os testes de unidade do Bionic incluem testes de unidade para recursos de ambiente. Além disso, usar a palavra-chave "capabilities" no Android init para um serviço e verificar se o serviço recebe os recursos esperados permitiria o teste de execução desse recurso.