Os recursos permitem que os processos do Linux eliminem a maioria dos privilégios de root, mantendo o subconjunto de privilégios necessários para executar sua função. A implementação original de recursos tornou impossível que processos fork+exec herdassem recursos, a menos que os arquivos sendo executados tivessem recursos de arquivo configurados. As capacidades de arquivo, por sua vez, apresentam um risco de segurança, pois qualquer processo que execute um arquivo com capacidades de arquivo poderá obter essas capacidades.
Os recursos ambientais permitem que os serviços do sistema iniciados pelo init configurem recursos em seus arquivos .rc
, trazendo a configuração para um único arquivo em vez de dividir a configuração no arquivo fs_config.c
. Isso significa que para qualquer serviço iniciado pelo init, você pode usar o arquivo .rc
associado ao serviço para configurar recursos para esse serviço.
As capacidades ambientais são o mecanismo preferido para definir capacidades para serviços iniciados pelo init (esse método mantém todos os aspectos da configuração do serviço em um único arquivo .rc
). Recomendamos usar recursos de ambiente em vez de configurar recursos do sistema de arquivos usando a seção caps nos arquivos config.fs
.
Ao definir recursos para serviços não iniciados pelo init , continue configurando os recursos do sistema de arquivos usando fs_config.c
.
Habilitando recursos ambientais
Para habilitar recursos de ambiente para um determinado serviço, use a palavra-chave capabilities
em init. Para obter detalhes atuais do idioma init, consulte init README.md .
Por exemplo, para habilitar recursos de ambiente para o serviço AOSP wificond
, o arquivo .rc para o serviço wificond
configura o usuário e os grupos apropriados e fornece ao serviço os recursos especificados 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 necessários
Os patches necessários foram transferidos para todos os ramos comuns relevantes do kernel do Android.
O patch de recursos de ambiente principal https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=58319057b7847667f0c9585b9de0e8932b0fdb08 foi portado em:
- andróide-3.18:
- andróide-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 suportada em:
- andróide-3.18:
- andróide-4.1:
Validação
Os testes de unidade biônica incluem testes de unidade para capacidades ambientais. Além disso, usar a palavra-chave "capabilities" no Android init para um serviço e, em seguida, verificar se o serviço obtém os recursos esperados permitiria o teste de tempo de execução desse recurso.