O sistema operacional Android contém utilitários de rede padrão do Linux, como ifconfig
, ip
e ip6tables
. Esses utilitários residem na imagem do sistema e permitem a configuração de toda a pilha de rede do Linux. Em dispositivos que executam o Android 7.xe inferior, o código do fornecedor pode chamar esses binários diretamente, o que apresenta os seguintes problemas:
- Como os utilitários de rede são atualizados na imagem do sistema, eles não fornecem uma implementação estável.
- O escopo dos utilitários de rede é tão amplo que é difícil evoluir a imagem do sistema e ao mesmo tempo garantir um comportamento previsível.
Em dispositivos com Android 8.0 e superior, a partição do fornecedor permanece a mesma enquanto a partição do sistema recebe uma atualização. Para conseguir isso, o Android 8.0 oferece a capacidade de definir uma interface estável e com versão, ao mesmo tempo que usa restrições do SELinux para manter a interdependência do fornecedor e da imagem do sistema em um conjunto válido e conhecido.
Os fornecedores podem usar os utilitários de configuração de rede fornecidos pela plataforma para configurar a pilha de rede do Linux, mas esses utilitários ainda não incluem um wrapper de interface HIDL. Para definir tal interface, o Android 8.0 inclui a ferramenta netutils-wrapper-1.0
.
Wrapper Netutils
O utilitário wrapper netutils
fornece um subconjunto da configuração da pilha de rede do Linux que não é afetado pelas atualizações da partição do sistema. O Android 8.0 contém a versão 1.0 dos wrappers, que permite passar os mesmos argumentos dos utilitários empacotados, instalados na partição do sistema em /system/bin
da seguinte forma:
u:object_r:system_file:s0 /system/bin/ip-wrapper-1.0 -> netutils-wrapper-1.0 u:object_r:system_file:s0 /system/bin/ip6tables-wrapper-1.0 -> netutils-wrapper-1.0 u:object_r:system_file:s0 /system/bin/iptables-wrapper-1.0 -> netutils-wrapper-1.0 u:object_r:system_file:s0 /system/bin/ndc-wrapper-1.0 -> netutils-wrapper-1.0 u:object_r:netutils_wrapper_exec:s0 /system/bin/netutils-wrapper-1.0 u:object_r:system_file:s0 /system/bin/tc-wrapper-1.0 -> netutils-wrapper-1.0
Os links simbólicos mostram os utilitários de rede envolvidos pelo wrapper netutils
, que incluem:
-
ip
-
iptables
-
ip6tables
-
ndc
-
tc
Para usar esses utilitários no Android 8.0 e versões posteriores, as implementações do fornecedor devem seguir as seguintes regras:
- Os processos do fornecedor não devem executar
/system/bin/netutils-wrapper-1.0
diretamente; tentativas de fazer isso resultarão em erro. - Todos os utilitários incluídos no
netutils-wrapper-1.0
devem ser iniciados usando seus links simbólicos. Por exemplo, altere o código do fornecedor que fez isso antes (/system/bin/ip <FOO> <BAR>
) para/system/bin/ip-wrapper-1.0 <FOO> <BAR>
. - A execução dos wrappers sem transição de domínio é proibida na política da plataforma SELinux. Esta regra não deve ser alterada e é testada no Android Compatibility Test Suite (CTS) .
- A execução dos utilitários diretamente (por exemplo,
/system/bin/ip <FOO> <BAR>
) dos processos do fornecedor também é proibida nas políticas da plataforma SELinux. Esta regra não deve ser alterada e é testada no CTS. - Qualquer domínio (processo) de fornecedor que precise iniciar um wrapper deve adicionar a seguinte regra de transição de domínio na política SELinux:
domain_auto_trans( VENDOR-DOMAIN-NAME , netutils_wrapper_exec, netutils_wrapper)
.
Filtros de wrapper Netutils
Utilitários empacotados podem ser usados para configurar praticamente qualquer aspecto da pilha de rede do Linux. Entretanto, para garantir que seja possível manter uma interface estável e permitir atualizações na partição do sistema, apenas certas combinações de argumentos de linha de comando são permitidas; outros comandos serão rejeitados.
Interfaces e cadeias de fornecedores
O wrapper possui um conceito de interfaces de fornecedor . Estas são interfaces normalmente gerenciadas pelo código do fornecedor, como interfaces de dados celulares. Normalmente, outros tipos de interfaces (como Wi-Fi) são gerenciados pelos HALs e pela estrutura. O wrapper reconhece as interfaces do fornecedor pelo nome (usando uma expressão regular) e permite que o código do fornecedor execute muitas operações nelas. Atualmente, as interfaces do fornecedor são:
- Interfaces cujos nomes terminam em "oem" seguido de um número, como
oem0
our_oem1234
. - Interfaces usadas pelas implementações atuais de SOC e OEM, como
rmnet_data[0-9]
.
Nomes de interfaces que normalmente são gerenciados pela estrutura (como wlan0
) nunca são interfaces de fornecedor.
O wrapper tem um conceito semelhante de cadeia de fornecedores . Eles são usados em comandos iptables
e também são reconhecidos pelo nome. Atualmente, cadeias de fornecedores:
- Comece com
oem_
. - São usados pelas implementações atuais de SOC e OEM, por exemplo, cadeias começando em
nm_
ouqcom_
.
Comandos permitidos
Os comandos atualmente permitidos estão listados abaixo. As restrições são implementadas por meio de um conjunto de expressões regulares nas linhas de comando executadas. Para obter detalhes, consulte system/netd/netutils_wrappers/NetUtilsWrapper-1.0.cpp
.
IP
O comando ip
é usado para configurar endereços IP, roteamento, criptografia IPsec e vários outros parâmetros de rede. O wrapper permite os seguintes comandos:
- Adicione e remova endereços IP de interfaces gerenciadas pelo fornecedor.
- Configure a criptografia IPsec.
iptables/ip6tables
Os comandos iptables
e ip6tables
são usados para configurar firewall, manipulação de pacotes, NAT e outros processamentos por pacote. O wrapper permite os seguintes comandos:
- Adicione e exclua cadeias de fornecedores.
- Adicione e exclua regras em qualquer cadeia que se refira a pacotes que entram (
-i
) ou saem (-o
) de uma interface de fornecedor. - Vá para uma cadeia de fornecedores a partir de qualquer ponto de qualquer outra cadeia.
ndc
ndc
é usado para se comunicar com o daemon netd
que executa a maioria das configurações de rede no Android. O wrapper permite os seguintes comandos:
- Crie e destrua redes OEM (
oemXX
). - Adicione interfaces gerenciadas pelo fornecedor às redes OEM.
- Adicione rotas às redes OEM.
- Ative ou desative o encaminhamento de IP globalmente e nas interfaces do fornecedor.
tc
O comando tc
é usado para configurar o enfileiramento e modelagem de tráfego nas interfaces do fornecedor.