Práticas recomendadas de segurança de aplicativos

Esta seção contém recomendações para garantir a segurança dos 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 manual e automatizada do código-fonte.

  • 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 análises consistentes e completas.
  • Execute um linter, como o Android Studio linter , em todos os códigos de aplicativos 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 estouros de buffer e erros off-by-one.
  • O sistema de compilação Android oferece suporte a muitos dos sanitizadores LLVM, como AddressSanitizer e UndefinedBehaviorSanitizer , que podem ser usados ​​para análise de tempo de execução de problemas relacionados à memória. Combinados com o fuzzing, com suporte no Android por meio do libFuzzer , os higienizadores podem descobrir casos extremos incomuns que exigem uma investigação mais aprofundada.
  • Um avaliador de segurança experiente deve analisar códigos de alto risco, como criptografia, processamento de pagamentos e processamento de PII.

Teste automatizado

O teste automatizado pode ajudar a detectar uma ampla gama de problemas de segurança e deve ser realizado 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 o teste 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.

Varredura 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 prevenir riscos para usuários e dispositivos.

  • Examine todos os aplicativos pré-instalados usando uma ferramenta de verificação de vulnerabilidades de aplicativos reconhecida pelo setor e resolva as vulnerabilidades detectadas.

Aplicativos potencialmente nocivos

É importante garantir que os aplicativos pré-instalados em seu dispositivo não sejam Aplicativos Potencialmente Nocivos (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 os 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 de aplicativos

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 garanta 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 cuidadosamente os aplicativos com privilégios de 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.
  • Certifique-se de que haja divulgação do usuário para todos os aplicativos pré-instalados que usam a permissão INSTALL_PACKAGES .
  • Certifique-se de que o desenvolvedor seja contratualmente obrigado a não instalar nenhum aplicativo como UID 0.
  • Avalie as permissões declaradas no manifesto de todos os apps a serem instalados pela rede do desenvolvedor.
  • Certifique-se de que o desenvolvedor seja contratualmente obrigado a verificar todos os URLs de download de aplicativos de atualização automática e instalador com a API Google Safe Browsing antes de fornecer aplicativos ao dispositivo.

Assinatura de 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 devem ser usadas apenas 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 de 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 sandbox do Android fornece segurança extra em torno de aplicativos e processos quando usado corretamente.

Isolando processos raiz

Os processos raiz são os alvos mais frequentes dos 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 normal do Android 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 via comunicação entre processos (IPC). Por exemplo, reduza a funcionalidade raiz a um pequeno serviço acessível por meio do 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 VM Java).

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, receptor de transmissão 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.

Processos de isolamento

O Android Application Sandbox fornece aplicativos com expectativa de isolamento de outros processos no sistema, incluindo processos raiz e depuradores. A menos que a depuração seja especificamente habilitada 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 use um método de depuração do Android documentado.
  • Certifique-se de que os processos raiz não acessem a memória dos aplicativos, a menos que use um método de depuração do Android documentado.
  • Certifique-se de que os dispositivos não incluam nenhum aplicativo que acesse dados ou memória de outros aplicativos ou processos.