Categoria do OWASP: MASVS-CODE - Qualidade do código (link em inglês)
Visão geral
O objetivo dos backups de apps é preservar os dados dos usuários para que eles possam ser restaurados mais tarde em um novo dispositivo ou em caso de perda de dados. As recomendações de segurança atuais relacionadas a backups de apps têm nuances, variando entre as versões do Android e os fabricantes do dispositivo. O tema comum é que essas recomendações visam garantir que nenhum dado sensível seja vazado.
O sistema padrão de backup do Android oferece a solução mais segura, robusta e fácil para que os apps façam backup de dados na nuvem ou transfiram dados para um novo dispositivo usando o Backup automático (que é ativado por padrão, não requer trabalho para implementação e também pode ser estendido) e o backup de chave-valor. Recomendamos usar essa solução porque ela armazena os dados de backup resultantes em diretórios que não podem ser acessados por outros apps de terceiros, além de facilitar a criptografia em repouso, a criptografia em trânsito e as configurações que permitem a exclusão de dados sensíveis dos backups.
Se um app implementar uma solução de backup que não depende do sistema padrão de backup do Android, isso pode aumentar a probabilidade de erros que levam a vazamentos de dados sensíveis. Exemplos de soluções de backup não padrão que expõem os dados do usuário a vazamentos incluem apps que oferecem um recurso de "exportação" ou "backup" que cria uma cópia dos dados do app em diretórios legíveis por outros apps e que, portanto, é propenso a vazamentos (diretamente ou por outras vulnerabilidades).
Impacto
Seguir as recomendações de segurança ao configurar backups de apps evita o vazamento potencial de dados sensíveis que os backups podem incluir. Dependendo dos dados reais e das intenções do invasor, o vazamento de dados sensíveis pode levar à divulgação de informações, falsificação de identidade do usuário e perda financeira.
Mitigações
Usar o sistema padrão de backup do Android
O sistema de backup padrão do Android sempre criptografa dados de backup em trânsito e em repouso. Essa criptografia é aplicada independentemente da versão do Android em uso e de o dispositivo ter ou não uma tela de bloqueio. A partir do Android 9, se o dispositivo tiver uma tela de bloqueio definida, os dados de backup não só serão criptografados, mas também com uma chave desconhecida do Google. O segredo da tela de bloqueio protege a chave de criptografia, permitindo a criptografia de ponta a ponta.
Em geral, siga as diretrizes de armazenamento de dados e de segurança.
Se o backup incluir dados sensíveis, recomendamos excluí-los ou, se não for possível, exigir a criptografia de ponta a ponta, conforme descrito na próxima seção.
Como excluir dados do backup
É possível especificar quais dados excluir de um backup usando um arquivo de regras,
chamado convencionalmente de backup_rules.xml
e colocado na pasta do app res/xml
.
Há algumas diferenças na forma como as regras de backup são configuradas, dependendo da
versão do Android usada:
- Para as versões 12 e mais recentes do Android (nível 31 da API), adicione um
atributo
android:dataExtractionRules
ao elemento<application>
noAndroidManifest.xml
: - xml
xml <application android:name="com.example.foo" android:dataExtractionRules="@xml/backup_rules_extraction"> … </application>
Em seguida, configure o arquivo backup_rules.xml
de acordo com os
requisitos de persistência e segurança de dados do aplicativo, seguindo o
formato de configuração atualizado.
O formato necessário para a configuração do arquivo backup_rules.xml
permite
que os desenvolvedores definam regras de backup personalizadas para a nuvem e as transferências
de dispositivo para dispositivo (D2D). Se o atributo <device-transfer>
não estiver definido, todos os
dados do aplicativo serão transferidos durante uma migração D2D. É importante
destacar que, mesmo que o aplicativo de destino seja direcionado ao Android 12 ou mais recente, um
arquivo separado com um conjunto adicional de regras de backup sempre precisa ser
especificado para dispositivos com o Android 11 (nível 30 da API) ou versões anteriores.
- Para o Android 11 e versões anteriores, adicione um atributo
android:fullBackupContent
ao elemento<application>
noAndroidManifest.xml
: - xml
xml <application android:name="com.example.foo" android:fullBackupContent="@xml/backup_rules_full"> … </application>
Em seguida, configure o arquivo backup_rules.xml
de acordo com a persistência de dados
e os requisitos de segurança do aplicativo usando a sintaxe informada no
artigo fazer backup dos dados do usuário.
Exigência de criptografia de ponta a ponta
Se não for possível excluir dados sensíveis do backup, recomendamos
exigir a criptografia de ponta a ponta, o que significa permitir backups apenas no Android 9
ou versões mais recentes e somente quando a tela de bloqueio estiver definida. Para fazer isso, use
a flag requireFlags="clientSideEncryption"
, que precisa ser renomeada para
disableIfNoEncryptionCapabilities
e definida como true
a partir do Android
12.
Se não for possível usar o sistema de backup padrão do Android
Se não for possível usar o sistema padrão de Backup do Android, o armazenamento seguro dos dados de backup e a especificação de quais dados excluir do backup será mais complexo. Isso precisa ser especificado no nível do código e, consequentemente, está sujeito a erros, o que pode causar vazamentos de dados. Nesse cenário, também é recomendável testar regularmente a implementação para garantir que não houve alterações no comportamento de backup esperado.
Recursos
- Descrição do atributo allowBackup
- Criptografia baseada em arquivos
- Mudanças na funcionalidade das transferências D2D
- Fazer backup dos dados de usuários com o Backup automático
- Fazer backup de pares de chave-valor com o Android Backup Service
- Controlar o backup no Android 12 ou versões mais recentes
- Controlar o backup no Android 11 e em versões anteriores
- Noções básicas sobre PII nos contratos e políticas do Google
- Testar o backup e a restauração
- Criptografia
- Sistema Android Keystore
- ADB
- Opções do desenvolvedor.