As 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 das funcionalidades impossibilitava que os processos fork+exec'd herdassem funcionalidades, a menos que os arquivos executados tivessem funcionalidades de arquivo configuradas. As funcionalidades de arquivo, por sua vez, apresentam um risco de segurança já que qualquer processo que execute um arquivo com funcionalidades de arquivo pode ganhar essas funcionalidades.
As funcionalidades de ambiente permitem que os serviços do sistema iniciados pelo init configurem
funcionalidades nos arquivos .rc, reunindo a configuração em
um único arquivo em vez de dividir a configuração no
fs_config.c arquivo. Isso significa que, para qualquer serviço iniciado pelo
init, você pode usar o .rc arquivo associado ao serviço para
configurar funcionalidades para ele.
As funcionalidades de ambiente são o mecanismo preferido para definir funcionalidades
para serviços iniciados pelo init. Esse método mantém todos os aspectos da configuração do serviço em um único .rc arquivo. Recomendamos o uso de funcionalidades de ambiente em vez de configurar funcionalidades do sistema de arquivos usando a seção "caps" em config.fs arquivos.
Ao definir funcionalidades para serviços não iniciados pelo init,
continue configurando funcionalidades do sistema de arquivos usando
fs_config.c.
Ativar funcionalidades de ambiente
Para ativar funcionalidades de ambiente para um determinado serviço, use a
capabilities palavra-chave no init. Para detalhes atuais da linguagem init, consulte o arquivo README.md do init.
Por exemplo, para ativar funcionalidades 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 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_ADMINImplementaçã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 todas as ramificações relevantes do kernel comum do Android branches.
O patch principal de funcionalidades de ambiente https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=58319057b7847667f0c9585b9de0e8932b0fdb08 foi transferido para:
- 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 transferida para:
- android-3.18:
- android-4.1:
Validação
Os testes de unidade do Bionic incluem testes de unidade para funcionalidades de ambiente. Além disso, usar a palavra-chave "capabilities" no init do Android para um serviço e verificar se o serviço recebe as funcionalidades esperadas permite o teste de tempo de execução deste recurso.