Proteja a privacidade dos usuários: segurança de aplicativos Android para desenvolvedores

Autor: Peter Berry
Data De Criação: 20 Lang L: none (month-012) 2021
Data De Atualização: 5 Poderia 2024
Anonim
Proteja a privacidade dos usuários: segurança de aplicativos Android para desenvolvedores - Aplicativos
Proteja a privacidade dos usuários: segurança de aplicativos Android para desenvolvedores - Aplicativos

Contente


Se você vai se concentrar no seu público e sua reputação como desenvolvedor Android confiável, você precisará levar a segurança do aplicativo Android a sério como desenvolvedor.

Se seu aplicativo vazar dados privados, você corre o risco de perder grande parte do seu público. Os usuários móveis com conhecimento técnico de hoje entendem que a melhor maneira de se proteger de um aplicativo inseguro é removê-lo do dispositivo. As violações graves de dados também são cada vez mais relatadas pela mídia, portanto, adotar uma abordagem desleixada da segurança móvel pode resultar em uma publicidade muito ruim.

As apostas são altas e, com novos aplicativos maliciosos sendo lançados o tempo todo, há uma chance crescente de que seu aplicativo compartilhe um dispositivo com malware e código malicioso de terceiros.

Adotar uma abordagem superficial à segurança móvel pode resultar em uma publicidade muito ruim.


Felizmente, o Android tem uma ampla variedade de recursos de segurança integrados que podem ajudar a manter os dados dos usuários bloqueados. Neste artigo, exploraremos todos os principais recursos de privacidade incorporados à plataforma Android, além de ferramentas, técnicas e práticas recomendadas adicionais que você pode usar para ajudar a garantir que os dados de seu aplicativo privado permaneçam privados.

Mantenha suas dependências atualizadas

Não é incomum que aplicativos móveis modernos usem várias bibliotecas, SDKs e muitas outras dependências diversas. As novas versões dessas dependências geralmente contêm correções de bugs, patches e outros recursos de segurança. Portanto, você deve garantir que está usando as versões mais recentes ao desenvolver seu aplicativo.


Antes de implantar seu aplicativo, também é uma boa idéia executar uma verificação final, apenas para garantir que não haja atualizações disponíveis.

Se seu aplicativo usa o Google Play Services, você pode verificar se o dispositivo do usuário tem a versão mais recente instalada e, em seguida, acionar uma atualização, se necessário.

Para testar se o Google Play Services do dispositivo está atualizado, chame o método installIfNeeded () da classe ProviderInstaller. Se houver uma atualização disponível, esse método lançará uma exceção de autorização e o usuário será solicitado a atualizar o Google Play Services no dispositivo.

Limite seus pedidos de permissão

Se o seu aplicativo não tiver acesso a uma permissão, não haverá chances de ele manipular incorretamente qualquer dado ou funcionalidade sensível associada a essa permissão. Restringir o acesso a permissões confidenciais também pode tornar seu aplicativo um alvo menos atraente para hackers, por isso é importante solicitar o mínimo de permissões possível.

Antes de fazer qualquer solicitações de permissão, considere se existe uma maneira de obter o mesmo resultado sem ter acesso a essa permissão. Por exemplo, se você precisar salvar alguns dados, poderá acessar o armazenamento local sem solicitar nenhuma permissão, em vez de tentar salvar os dados externamente, o que requer a permissão WRITE_EXTERNAL_STORAGE.

Como alternativa, você pode usar intenções para passar uma tarefa para um aplicativo que já possui as permissões necessárias. Por exemplo, em vez de solicitar as permissões READ_CONTACTS e WRITE_CONTACTS, você pode delegar uma tarefa ao aplicativo Contatos:

Intenção contactIntent = new Intent (Intent.ACTION_INSERT); contactIntent.setType (ContactsContract.Contacts.CONTENT_TYPE); if (contactIntent.resolveActivity (getPackageManager ())! = null) {startActivity (contactIntent); }

Você também deve renunciar a quaisquer permissões que seu aplicativo não exija mais, o que pode reduzir significativamente a quantidade de dados e recursos confidenciais aos quais seu aplicativo tem acesso a qualquer momento.

Permita que seus usuários decidam: exibindo o seletor de aplicativos

Por que perder tempo e energia reinventando a roda? As intenções implícitas permitem executar tarefas em cooperação com aplicativos de terceiros, reduzindo a quantidade de código que você precisa escrever para fornecer toda a funcionalidade desejada do seu aplicativo. Ao passar uma tarefa para outro aplicativo, você também poderá reduzir o número de permissões que seu aplicativo exige.

Intenções implícitas podem economizar uma tonelada de tempo, mas também oferecem zero controle sobre qual aplicativo responde à sua solicitação. Se um aplicativo de terceiros inseguro ou mal-intencionado responder à sua intenção implícita, é possível que você exponha inadvertidamente os dados pessoais do usuário a terceiros.Se a privacidade do usuário for violada como resultado de um aplicativo de terceiros, seu aplicativo poderá ser considerado culpado por associação.

Ao emitir uma intenção implícita, você deve exibir o seletor de aplicativos do Android sempre que possível.

Ao apresentar ao usuário uma lista de todos os aplicativos que podem responder a essa intenção, você está dando a ele a oportunidade de selecionar um aplicativo em que confiam pessoalmente. Embora não haja garantia de que cada usuário escolha sabiamente, isso pode reduzir as chances de você compartilhar dados com um aplicativo não confiável.

Ao emitir uma intenção, você deve verificar se o usuário possui vários aplicativos que podem lidar com essa intenção. Supondo que vários aplicativos compatíveis estejam disponíveis, você pode exibir o seletor de aplicativos chamando createChooser () e passando-o para startActivity ():

Intenção myIntent = new Intent (Intent.ACTION_SEND); Lista possibleActivitiesList = queryIntentActivities (intenção, PackageManager.MATCH_ALL); // Verifique se mais de um aplicativo pode lidar com essa intenção // if (possibleActivitiesList.size ()> 1) {// Exibe o seletor de aplicativo // String title = getResources (). GetString (R.string.app_chooser_title); Seletor de intenção = Intent.createChooser (intenção, título); startActivity (seletor); } else if (intent.resolveActivity (getPackageManager ())! = null) {startActivity (intent); }

Observe que você nunca deve usar uma intenção implícita para iniciar um Serviço, pois não terá controle sobre qual Serviço responde à sua intenção implícita.

Evite armazenamento externo

Você precisa garantir que os dados armazenados no dispositivo do usuário não sejam acessíveis a outros aplicativos, a menos que você conceda a aprovação explícita desses aplicativos.

Os arquivos salvos no armazenamento externo são legíveis e graváveis ​​globalmente; portanto, todos os dados salvos em armazenamento externo podem ser acessados ​​e modificados por qualquer outro aplicativo. Também não há garantia de que um meio de armazenamento externo permaneça conectado ao smartphone ou tablet atual. Se o seu aplicativo gravar no armazenamento externo, você poderá salvar dados confidenciais do usuário em um cartão SD que será removido e inserido posteriormente no dispositivo de outra pessoa!

A menos que você tenha um motivo específico para não fazê-lo, sempre salve os dados no armazenamento interno, onde estão na área restrita e só estarão acessíveis ao seu aplicativo por padrão. Além disso, se um usuário desinstalar seu aplicativo, todos os arquivos do seu aplicativo serão excluídos do armazenamento interno automaticamente, para que você não precise se preocupar em deixar para trás informações confidenciais.

No snippet a seguir, estamos gravando dados no armazenamento interno:

string final FILE_NAME = "user_data.txt"; String fileContents = "Este arquivo de texto contém dados confidenciais do usuário"; try (BufferedWriter writer = new BufferedWriter (novo FileWriter (novo arquivo (getFilesDir (), FILE_NAME))))) {writer.write (fileContents); } catch (IOException e) {// Para fazer: manipular exceção //}

Se os dados forem particularmente sensíveis, você poderá fornecer alguma segurança adicional ao aplicativo Android criptografando os arquivos com uma chave que não é acessível ao seu aplicativo, por exemplo, uma chave colocada em um Keystore e protegida por uma senha que não esteja armazenada em o dispositivo.

Use o novo acesso ao diretório com escopo do Android

Às vezes, um aplicativo pode exigir acesso a diretórios específicos no armazenamento externo de um dispositivo, por exemplo, obter acesso ao diretório de imagens externo do dispositivo.

Embora você possa solicitar a permissão READ_EXTERNAL_STORAGE, isso geralmente fornece ao seu aplicativo acesso a mais dados do que o necessário. É impossível para um aplicativo manipular incorretamente os dados aos quais não tem acesso; portanto, tente minimizar a quantidade de informações que seu aplicativo pode acessar, sempre que possível.

Em vez de solicitar a permissão READ_EXTERNAL_STORAGE, você pode solicitar acesso a um diretório específico. este acesso ao diretório com escopo requer que você use a classe StorageManager e crie uma intenção chamando o método StorageVolume.createAccessIntent () dessa instância. Por exemplo, no seguinte snippet, estamos acessando o diretório externo de imagens:

StorageManager newStorageManager = (StorageManager) getSystemService (Context.STORAGE_SERVICE); Volume StorageVolume = newStorageManager.getPrimaryStorageVolume (); Intenção intent = volume.createAccessIntent (Environment.DIRECTORY_PICTURES); startActivityForResult (intent, request_code);

Se o usuário conceder ao seu aplicativo acesso a esse diretório externo, o Android chamará sua substituição onActivityResult () pelo código de resultado RESULT_OK, além de uma intenção que contém o URI do diretório solicitado.

Nunca armazene em cache dados confidenciais do usuário

Ao manipular dados não sensíveis do aplicativo, você poderá melhorar a experiência do usuário armazenando esses dados no cache do dispositivo.

Para caches maiores que 1 MB, você pode usar getExternalCacheDir (), que retornará o caminho para um diretório específico do aplicativo onde você pode armazenar seu conteúdo em cache.

Se você decidir armazenar em cache, esteja ciente de que qualquer aplicativo que tenha a permissão WRITE_EXTERNAL_STORAGE pode gravar potencialmente nesses arquivos, portanto, você deve Nunca armazene informações particulares ou confidenciais no cache se você se preocupa com a segurança do aplicativo Android.

Proteja suas chaves contra uso não autorizado

O sistema Android Keystore permite armazenar chaves criptográficas em um contêiner, o que dificulta a extração dessas chaves do dispositivo.

O Keystore do Android garante que o material da chave nunca entre no processo de inscrição, portanto, mesmo que os processos do aplicativo sejam comprometidos e um invasor consiga acessar suas chaves, eles não poderão extrair o material da chave.

Você também pode usar o Keystore para restringir quando e como suas chaves podem ser usadas; por exemplo, você pode restringir o uso de chaves a determinados modos criptográficos ou exigir autenticação do usuário.

Torne seus ContentProviders privados

O ContentProviders é um mecanismo de armazenamento estruturado que você pode tornar privado para o seu aplicativo ou optar por exportar, quando eles se tornarão acessíveis a outros aplicativos.

A menos que você precise compartilhar dados explicitamente com um aplicativo de terceiros, você deve tornar todos os seus ContentProviders privados, marcando-os como android: exported = false no Manifest do seu aplicativo. Se o seu aplicativo for compatível com o Android 4.1.1 ou inferior, é particularmente importante que você marque seus ContentProviders privados como android: exported = false, pois todos os ContentProviders são públicos por padrão.

Impressão digital de seus usuários, com autenticação biométrica

Antes de permitir que um usuário acesse qualquer uma das informações ou recursos confidenciais do seu aplicativo, verifique sua identidade solicitando suas credenciais.

As credenciais do usuário podem assumir a forma de um PIN ou senha, no entanto, sempre que possível, é muito mais seguro executar autenticação biométrica, por exemplo, solicitando a impressão digital do usuário.

Segue todos melhores práticas de rede

Ao contrário de dispositivos menos portáteis, como computadores de mesa, freqüentemente conectamos nossos smartphones e tablets a redes sem fio não seguras, como Wi-Fi público gratuito. Para ajudar a preservar a privacidade do usuário, você deve abordar todas as transações de rede como inerentemente arriscadas, especialmente quando você está transmitindo dados do usuário.

Sempre que você precisar realizar uma transação de rede, é importante seguir todas as práticas recomendadas de rede do Android:

  • Use HTTPS em vez de HTTP, sempre que houver suporte no servidor.
  • Nunca confie nos dados baixados de protocolos inseguros, incluindo quaisquer respostas emitidas no HTTP.
  • Use protocolos apropriados para dados confidenciais, como HttpsURLConnection.
  • Onde a autenticação for possível, use um mecanismo IPC do Android, como um Serviço.
  • Use a ferramenta de segurança de rede Nogotofail de código aberto para testar seu aplicativo contra vulnerabilidades e configurações incorretas conhecidas do TLS / SSL. O Nogotofail inclui testes para problemas comuns de verificação de certificado SSL, erros de biblioteca HTTPS e TLS / SSL, problemas de texto não criptografado e problemas de remoção de SSL e STARTTLS. Para mais informações, consulte a página GitHub do Nogotofail.
  • Sempre que possível, evite carregar o código fora do APK, pois isso aumenta as chances de alguém na rede modificar seu código enquanto ele está transmitindo.

Use o WebViews com cuidado

O componente WebView pode consumir HTML e JavaScript; portanto, se você usar WebViews incorretamente, seu aplicativo ficará vulnerável a problemas comuns de segurança na Web, como scripts entre sites.

Se você usar WebViews incorretamente, seu aplicativo ficará vulnerável a problemas comuns de segurança na web.

Para ajudar a manter os usuários do Android seguros, o componente WebView não executa JavaScript por padrão. No entanto, se necessário, você pode ativar o JavaScript usando getSettings () para recuperar WebSettings e, em seguida, executando o método setJavaScriptEnabled ():

WebView myWebView = (WebView) findViewById (R.id.webview); WebSettings webSettings = myWebView.getSettings (); webSettings.setJavaScriptEnabled (true);

Mesmo se você precisar ativar o JavaScript, evite usar addJavaScriptInterface () sempre que possível, pois esse método injeta o objeto Java fornecido no componente WebView. Se seu aplicativo estiver instalado em um dispositivo com Android 4.2 ou anterior, esse método poderá permitir que o JavaScript manipule seu aplicativo.

Se você usa WebViews, não deve permitir que os usuários naveguem para qualquer site que você não controla, mas em particular você deve Nunca use o método addJavascriptInterface () se o usuário puder navegar para uma página da Web não confiável, pois esse é um grande risco à segurança do aplicativo Android.

Você nunca deve usar o método addJavascriptInterface () se o usuário puder navegar para uma página da Web não confiável.

Se o seu componente WebView acessar dados pessoais, você poderá excluir periodicamente todos os arquivos armazenados localmente, usando o método clearCache (). Como alternativa, você pode impedir que seu aplicativo armazene em cache conteúdo confidencial usando o cabeçalho do servidor sem cache.

Gerenciar SSL (Secure Sockets Layer) do seu aplicativo

O SSL é um componente comum da comunicação criptografada entre clientes e servidores. Se o seu aplicativo usar SSL incorretamente, terceiros mal-intencionados poderão interceptar os dados do aplicativo enquanto estiverem sendo transmitidos por uma rede.

Normalmente, um servidor é configurado com um certificado que contém uma chave pública e uma chave privada correspondente. Como parte da comunicação entre o cliente SSL e o servidor, o servidor assinará seu certificado com criptografia de chave pública. No entanto, é possível que terceiros gerem seu próprio certificado e chave privada; portanto, seu cliente também deve ter um ou mais certificados nos quais confia. Se um certificado não estiver definido, seu aplicativo não deve confiar no servidor.

Para facilitar esse processo, os servidores geralmente são configurados com certificados de autoridades de certificação conhecidas. No nível 17 da API, o Android suporta mais de 100 CAs que são atualizadas a cada versão. Ao emitir um certificado para um servidor, a CA assina o certificado do servidor usando sua chave privada e, em seguida, o cliente pode verificar se o certificado foi emitido por uma CA conhecida e confiável pela plataforma Android.

Se seu aplicativo estiver se comunicando com um servidor Web que possui um certificado emitido por uma CA confiável, você poderá fazer sua solicitação em algumas linhas de código:

URL URL = novo URL ("https://www.google.com"); HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection (); urlConnection.connect (); InputStream in = urlConnection.getInputStream ();

No entanto, existem alguns cenários em que o código acima resultará em uma exceção:

  • A CA que emitiu o certificado do servidor é desconhecida. Nesse cenário, você pode ensinar ao HttpsURLConnection a confiar nesse conjunto de autoridades de certificação.
  • O certificado do servidor foi autoassinado, o que significa que o servidor está agindo como sua própria CA. Para certificados autoassinados, você pode criar seu próprio TrustManager, embora seja necessário garantir que seu certificado autoassinado tenha uma chave forte.
  • Falta à configuração do servidor uma CA intermediária. Muitas autoridades de certificação públicas não assinam certificados de servidor diretamente. O Android confia apenas nas CAs raiz; portanto, o servidor precisará enviar uma cadeia de certificados da CA do servidor por meio de quaisquer intermediários necessários para alcançar a raiz. Se você não pode configurar o servidor para incluir a CA intermediária na cadeia de servidores, uma solução possível é criar seu próprio TrustManager.

Criando um arquivo de configuração de segurança de rede: confiando em CAs personalizadas

Se você deseja que seu aplicativo use uma CA nova ou personalizada, crie um arquivo de Configuração de segurança de rede em que especifique suas configurações de segurança de rede.

Para criar um arquivo de configuração de segurança de rede:

  • Se o seu projeto ainda não contiver uma pasta XML, será necessário criar uma. Clique com a tecla Control pressionada na pasta res do seu projeto e selecione Novo> Diretório de Recursos do Android.
  • Crie um novo arquivo de recurso XML dentro do diretório XML, que servirá como seu arquivo de configuração de segurança de rede. Estou nomeando esse arquivo network_config.
  • Abra o arquivo de configuração de rede e especifique que todo o tráfego para os seguintes domínios deve usar HTTPS:

// Desativar texto não criptografado // // Aplique esta regra ao domínio e a todos os seus subdomínios // meu.domínio.com ... ... ...

Agora você pode especificar o conjunto de CAs personalizadas em que seu aplicativo deve confiar. Por exemplo, se você deseja se conectar a um host que usa uma CA autoassinada, adicione o seguinte ao seu arquivo de configuração de segurança de rede:

meu.domínio.com // Um ​​conjunto de âncoras de confiança para conexões seguras // // Um ​​conjunto de certificados para elementos de âncoras de confiança e a origem desses certificados //

Não se esqueça de declarar o arquivo de configuração de segurança de rede em seu manifesto:

Você precisará adicionar as CAs confiáveis ​​aos res / raw / trust_cas do seu projeto, no formato PEM ou DER.

Confie em CAs adicionais, quando apropriado

Por fim, convém confiar em CAs adicionais que não são conhecidas pela plataforma Android. Para aumentar o número de CAs em que seu aplicativo confia, você precisa especificar várias fontes de certificado:

Nunca envie dados confidenciais via SMS

Se você precisar transmitir dados de um servidor para seu aplicativo, use o Google Cloud Messaging (GCM) e o IP, e nunca o protocolo SMS não criptografado.

Leia também: Desenvolvimento Android: como fazer chamadas, receber SMS e recuperar os contatos dos usuários

Você também nunca deve executar comandos sensíveis usando SMS s, pois o SMS é transmitido como intenção de transmissão, o que significa que qualquer aplicativo com a permissão READ_SMS poderá acessar seu conteúdo.

Proteja-se contra ameaças de segurança com as APIs SafetyNet

O SafetyNet fornece um conjunto de serviços e APIs que você pode usar para proteger seu aplicativo contra ameaças à segurança, como adulteração de dispositivos, URLs maliciosos e usuários falsos.

O Android suporta as seguintes APIs SafetyNet:

  • API do SafetyNet Attestation. Essa API antiabuso permite acessar o dispositivo Android em que seu aplicativo está sendo executado, para que você possa determinar se seus servidores estão interagindo com um dispositivo genuíno.
  • API de Navegação Segura SafetyNet. Você pode usar esta API para determinar se o Google classificou um URL específico como uma ameaça conhecida.
  • API SafetyNet reCAPTCHA. Este serviço inclui uma API reCAPTCHA que você pode usar para proteger seu aplicativo contra ameaças como spam e tráfego malicioso. Se a API suspeitar que seu aplicativo está interagindo com um bot, ele exibirá um CAPTCHA que o destinatário deve resolver antes de poder continuar usando o aplicativo.
  • API SafetyNet Verify Apps. Se o seu aplicativo contiver dados confidenciais do usuário, você poderá usar esta API para interagir com o recurso Verificar aplicativos do dispositivo e verificar se o dispositivo está livre de aplicativos maliciosos. Se o dispositivo não for seguro, você poderá executar algumas limitações ao desativar todos os recursos confidenciais do seu aplicativo. Lembre-se de que, apesar de o SafetyNet alertar os usuários sobre todos os aplicativos potencialmente perigosos descobertos, não há garantia de que o usuário desinstale esses aplicativos. Além disso, aplicativos maliciosos são lançados o tempo todo e os hackers estão sempre inventando maneiras novas e engenhosas de passar despercebidas, portanto, mesmo que um dispositivo seja aprovado no teste SafetyNet, você não deve assumir que não há aplicativos prejudiciais no o dispositivo.

Para obter mais informações sobre as APIs SafetyNet, incluindo instruções sobre como usá-las em seus aplicativos, consulte os documentos oficiais do Android.

Use a Confirmação protegida do Android para transações confidenciais

Se seu aplicativo precisar executar uma transação confidencial, como efetuar um pagamento, você poderá usar a Confirmação Protegida do Android em dispositivos com Android 9 (nível 28 da API) ou superior.

Sempre que o usuário tentar concluir uma transação confidencial, a Confirmação Protegida do Android exibirá um prompt solicitando que ele aceite uma declaração curta. Se o usuário aprovar esta declaração, você poderá assinar usando uma chave no Android Keystore.

Para mais informações, além de instruções sobre como implementar a Confirmação Protegida para Android, consulte os documentos oficiais do Android.

Android 10: execute o código DEX incorporado diretamente

Em dispositivos com Android 10 (API nível 29) e superior, é possível executar o código DEX incorporado diretamente do arquivo APK do seu aplicativo, o que pode ajudar a impedir um ataque, mesmo se o hacker conseguir adulterar o código compilado localmente do dispositivo.

Leia também: Explorando o Android Q: adicionando notificações de bolha ao seu aplicativo

Para ativar esse novo recurso de segurança, abra o Manifest do seu projeto e adicione o seguinte ao elemento:

Em seguida, você precisará criar um arquivo APK contendo o código DEX descompactado que o ART pode acessar diretamente. Abra o arquivo build.gradle e adicione o seguinte:

aaptOptions {noCompress dex}

Lembre-se de que o ART usará o compilador JIT quando o aplicativo for iniciado, o que pode afetar o desempenho do aplicativo.

Empacotando

Neste artigo, abordamos todas as práticas recomendadas, ferramentas, APIs e técnicas que você pode usar para ajudar a manter a segurança do seu aplicativo Android.

Você tem algum conselho para aumentar a segurança do seu aplicativo? Não deixe de compartilhar suas dicas nos comentários abaixo!

O gerente de projeto de TI ão cada vez mai cruciai para o etor de tecnologia. Ele têm a tarefa de liderando projeto para o uceo dentro do orçamento e dentro do cronograma....

Já é egunda-feira de novo? e você etá procratinando no trabalho, e perguntando por que não fez entrar em uma carreira de tecnologia, Você pode fazer algo obre io. Uma car...

Preso Hoje