Esta seção contém recomendações para garantir a segurança de aplicativos em dispositivos Android.
Revisão do código-fonte
A revisão do código-fonte pode detectar uma ampla variedade de problemas de segurança, incluindo os identificados neste documento. O Android incentiva fortemente a revisão de código-fonte manual e automatizada.
- Siga as orientações de segurança abrangentes ao realizar revisões para garantir a cobertura. Utilize padrões internos ou externos relevantes para garantir revisões consistentes e completas.
- Execute um linter, como o linter do Android Studio , em todo o código do aplicativo usando o SDK do Android e corrija os problemas identificados.
- Analise o código nativo usando uma ferramenta automatizada que pode detectar problemas de gerenciamento de memória, como estouro de buffer e erros off-by-one.
- O sistema de compilação do Android oferece suporte a muitos sanitizadores do LLVM, como AddressSanitizer e UndefinedBehaviorSanitizer , que podem ser usados para análise de tempo de execução de problemas relacionados à memória. Combinado com o fuzzing, suportado no Android por meio do libFuzzer , os sanitizadores podem descobrir casos extremos incomuns que exigem investigação adicional.
- Um avaliador de segurança experiente deve revisar o código de maior risco, como criptografia, processamento de pagamentos e processamento de PII.
Teste automatizado
Os testes automatizados podem ajudar a detectar uma ampla gama de problemas de segurança e devem ser realizados regularmente.
- Execute a versão mais recente do CTS regularmente durante todo o processo de desenvolvimento para detectar problemas antecipadamente e reduzir o tempo de correção. O Android usa o CTS como parte da integração contínua em nosso processo de compilação automatizado, que é compilado várias vezes por dia.
- Automatize testes de segurança de interfaces, incluindo testes com entradas malformadas (teste fuzz). O sistema de compilação do Android suporta libFuzzer para escrever testes fuzz.
Verificação de vulnerabilidade
A verificação de vulnerabilidades pode ajudar a garantir que os aplicativos pré-instalados estejam livres de vulnerabilidades de segurança conhecidas. A detecção avançada pode reduzir o tempo e o custo necessários para lidar com essas vulnerabilidades e evitar riscos para usuários e dispositivos.
- Analise todos os aplicativos pré-instalados usando uma ferramenta de verificação de vulnerabilidades de aplicativos reconhecida pelo setor e resolva as vulnerabilidades detectadas.
Aplicações potencialmente prejudiciais
É importante garantir que os aplicativos pré-instalados em seu dispositivo não sejam aplicativos potencialmente prejudiciais (PHAs). Você é responsável pelo comportamento de todos os aplicativos incluídos em seus dispositivos. Antes de iniciar o dispositivo, verifique se há vulnerabilidades em todos os aplicativos pré-carregados.
Para obter mais informações sobre PHAs e como o Google os está combatendo na Play Store, consulte a documentação do desenvolvedor do Google Play Protect .
Instalação e permissões do aplicativo
Permissões excessivas para aplicativos pré-instalados podem criar um risco de segurança. Restrinja os aplicativos pré-instalados às permissões mínimas necessárias e certifique-se de que eles não tenham acesso a permissões ou privilégios desnecessários. As permissões do aplicativo são descritas no AndroidManifest.xml .
- Não conceda permissões ou privilégios desnecessários a aplicativos pré-instalados. Revise completamente os aplicativos com privilégios do sistema, pois eles podem ter permissões muito confidenciais.
- Certifique-se de que todas as permissões solicitadas sejam relevantes e necessárias para a funcionalidade desse aplicativo específico.
- Verifique se há divulgação do usuário para todos os aplicativos pré-instalados que usam a permissão
INSTALL_PACKAGES
. - Certifique-se de que o desenvolvedor esteja contratualmente obrigado a não instalar nenhum aplicativo como UID 0.
- Avalie as permissões declaradas no manifesto de todos os aplicativos a serem instalados pela rede do desenvolvedor.
- Certifique-se de que o desenvolvedor esteja contratualmente obrigado a verificar todos os URLs de download de aplicativos de atualização automática e instalador com a API de navegação segura do Google antes de veicular aplicativos no dispositivo.
Assinatura do aplicativo
As assinaturas de aplicativos desempenham um papel importante na segurança do dispositivo e são usadas para verificações de permissões e atualizações de software. Ao selecionar uma chave para usar para assinar aplicativos, é importante considerar se um aplicativo estará disponível apenas em um único dispositivo ou comum em vários dispositivos.
- Certifique-se de que os aplicativos não sejam assinados com uma chave conhecida publicamente, como a chave do desenvolvedor AOSP.
- Certifique-se de que as chaves usadas para assinar aplicativos sejam gerenciadas de maneira consistente com as práticas padrão do setor para lidar com chaves confidenciais, incluindo um módulo de segurança de hardware (HSM) que fornece acesso limitado e auditável.
- Certifique-se de que os aplicativos não sejam assinados com a chave da plataforma. Isso dá a um aplicativo acesso às permissões de assinatura da plataforma, que são muito poderosas e destinadas apenas a serem usadas por componentes do sistema operacional. Os aplicativos do sistema devem usar permissões privilegiadas.
- Certifique-se de que os aplicativos com o mesmo nome de pacote não sejam assinados com chaves diferentes. Isso geralmente ocorre ao criar um aplicativo para diferentes dispositivos, especialmente ao usar a chave da plataforma. Se o aplicativo for independente do dispositivo, use a mesma chave em todos os dispositivos. Se o aplicativo for específico do dispositivo, crie nomes de pacote exclusivos por dispositivo e chave.
Isolando aplicativos e processos
O modelo de sandboxing do Android oferece segurança extra em torno de aplicativos e processos quando usado corretamente.
Isolando processos raiz
Os processos raiz são o alvo mais frequente de ataques de escalonamento de privilégios; reduzir o número de processos raiz reduz o risco de escalonamento de privilégios.
- Certifique-se de que os dispositivos executem o código mínimo necessário como root. Sempre que possível, use um processo Android normal em vez de um processo raiz. Se um processo deve ser executado como root em um dispositivo, documente o processo em uma solicitação de recurso AOSP para que possa ser revisado publicamente.
- Sempre que possível, o código raiz deve ser isolado de dados não confiáveis e acessado por meio de comunicação entre processos (IPC). Por exemplo, reduza a funcionalidade raiz para um pequeno Serviço acessível via Binder e exponha o Serviço com permissão de assinatura a um aplicativo com poucos ou nenhum privilégio para lidar com o tráfego de rede.
- Os processos raiz não devem escutar em um soquete de rede.
- Os processos raiz não devem incluir um tempo de execução de uso geral, como uma Java VM).
Isolando aplicativos do sistema
Em geral, os aplicativos pré-instalados não devem ser executados com o identificador exclusivo do sistema compartilhado (UID). Se for necessário que um aplicativo use o UID compartilhado do sistema ou outro serviço privilegiado (por exemplo, telefone), o aplicativo não deve exportar nenhum serviço, broadcast receiver ou provedor de conteúdo que possa ser acessado por aplicativos de terceiros instalados pelos usuários .
- Certifique-se de que os dispositivos executem o código mínimo necessário como sistema. Sempre que possível, use um processo Android com seu próprio UID em vez de reutilizar o UID do sistema.
- Sempre que possível, o código do sistema deve ser isolado de dados não confiáveis e expor o IPC apenas a outros processos confiáveis.
- Os processos do sistema não devem escutar em um soquete de rede. Este é um requisito do CTS.
Isolando processos
O Android Application Sandbox fornece aplicativos com uma expectativa de isolamento de outros processos no sistema, incluindo processos raiz e depuradores. A menos que a depuração seja habilitada especificamente pelo aplicativo e pelo usuário, nenhum aplicativo deve violar essa expectativa.
- Certifique-se de que os processos raiz não acessem dados em pastas de dados de aplicativos individuais, a menos que usem um método de depuração Android documentado.
- Certifique-se de que os processos raiz não acessem a memória dos aplicativos, a menos que usem um método de depuração Android documentado.
- Certifique-se de que os dispositivos não incluam nenhum aplicativo que acesse dados ou memória de outros aplicativos ou processos.