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 gama de problemas de segurança, incluindo aqueles identificados neste documento. O Android incentiva fortemente a revisão manual e automatizada do código-fonte.
- Siga orientações abrangentes de segurança ao realizar análises 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 todos os códigos 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 buffer overflows e erros off-by-one.
- O sistema de compilação do 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. Combinado com o fuzzing, suportado no Android por meio do libFuzzer , os sanitizadores podem descobrir casos extremos incomuns que exigem investigação mais aprofundada.
- Um avaliador de segurança experiente deve revisar códigos 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 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 vulnerabilidades
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.
- Verifique 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 no 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 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 à 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 estã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 ao 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 instaladores 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 a ser usada para assinar aplicativos, é importante considerar se um aplicativo estará disponível apenas em um único dispositivo ou será 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.
- Garanta 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 estejam assinados com a chave da plataforma. Isso dá ao 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 dispositivos diferentes, 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 pacotes exclusivos por dispositivo e chave.
Isolando aplicativos e processos
O modelo de sandbox 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 normal do Android em vez de um processo root. Se um processo precisar 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 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 Java VM).
Isolando aplicativos do sistema
Em geral, os aplicativos pré-instalados não devem ser executados com o identificador exclusivo (UID) do sistema compartilhado. 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 deverá exportar quaisquer serviços, receptores de transmissão ou provedores de conteúdo que possam ser acessados 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 aos aplicativos 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 deverá 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 documentado do Android.
- 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 Android documentado.
- Certifique-se de que os dispositivos não incluam nenhum aplicativo que acesse dados ou memória de outros aplicativos ou processos.