Android

18 abr, 2018

Protegendo usuários com TLS por padrão no Android P

Publicidade

Artigo de Chad Brubaker, publicado originalmente pelo Android Developers Blog. A tradução foi feita pela Redação iMasters com autorização.

***

O Android está comprometido em manter os usuários, seus dispositivos e seus dados seguros. Uma das maneiras de manter os dados seguros é protegendo todos os dados que entram ou saem de um dispositivo Android com o TLS (Transport Layer Security/Segurança da Camada de Transporte) em trânsito.

Conforme anunciado no lançamento prévio para desenvolvedores do Android P, essas proteções estão sendo ainda mais aprimoradas, impedindo que os aplicativos que segmentam o Android P permitam conexões não criptografadas por padrão.

Isso segue uma série de mudanças que fizemos ao longo dos anos para melhor proteger os usuários do Android. Para impedir conexões não criptografadas acidentais, introduzimos o atributo do manifestoandroid:usesCleartextTraffic no Android Marshmallow. No Android Nougat, estendemos esse atributo criando o recurso Network Security Config/Configuração de Segurança de Rede, que permite que os aplicativos indiquem que não pretendem enviar tráfego de rede sem criptografia. No Android Nougat e no Oreo, ainda permitimos conexões em texto simples.

Como eu atualizo meu aplicativo?

Se o seu aplicativo usa TLS para todas as conexões, não há nada para você fazer. Caso contrário, atualize seu aplicativo para usar o TLS para criptografar todas as conexões. Se você ainda precisar fazer conexões de texto simples, continue lendo para obter algumas práticas recomendadas.

Por que devo usar o TLS?

O Android considera todas as redes potencialmente hostis e, portanto, o tráfego de criptografia deve ser usado em todos os momentos, para todas as conexões. Os dispositivos móveis estão especialmente em risco porque regularmente se conectam a muitas redes diferentes, como o Wi-Fi em uma cafeteria.

Todo o tráfego deve ser criptografado, independentemente do conteúdo, pois qualquer conexão não criptografada pode ser usada para injetar conteúdo, aumentar a superfície de ataque para o código do cliente potencialmente vulnerável ou rastrear o usuário. Para mais informações, consulte o nosso artigo anterior e a Palestra do Desenvolvedor.

TLS não é lento?

Não, não é.

Como eu uso o TLS no meu aplicativo?

Uma vez que seu servidor suporta TLS, basta alterar as URLs nas respostas do aplicativo e do servidor de http:// para https://. Sua pilha HTTP lida com o handshake TLS sem trabalho adicional.

Se você estiver fazendo sockets, use um SSLSocketFactory em vez de um SocketFactory. Tome cuidado extra para usar o socket corretamente, pois o SSLSocket não realiza a verificação do nome do host. Seu aplicativo precisa fazer sua própria verificação de nome de host, preferencialmente chamando getDefaultHostnameVerifier() com o nome do host esperado. Além disso, lembre-se de que HostnameVerifier.verify() não lança uma exceção no erro, mas retorna um resultado booleano que você deve verificar explicitamente.

Eu preciso usar o tráfego de texto simples para…

Embora você deva usar TLS para todas as conexões, é possível que você precise usar o tráfego de texto simples por motivos herdados, como a conexão a alguns servidores. Para fazer isso, altere a configuração de segurança de rede do seu aplicativo para permitir essas conexões.

Incluímos algumas configurações de exemplo. Veja a documentação de configuração de segurança da rede para obter mais ajuda.

Permitir conexões de texto simples para um domínio específico

Se você precisar permitir conexões a um domínio específico ou um conjunto de domínios, use a seguinte configuração como guia:

<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">insecure.example.com</domain>
        <domain includeSubdomains="true">insecure.cdn.example.com</domain>
    </domain-config>
</network-security-config>

Permitir conexões a domínios inseguros arbitrários

Se o seu aplicativo oferecer suporte à abertura de conteúdo arbitrário de URLs em conexões inseguras, você deverá desabilitar as conexões de texto simples com seus próprios serviços e, ao mesmo tempo, suportar conexões de texto simples a hosts arbitrários. Lembre-se de que você deve ser cauteloso em relação aos dados recebidos por conexões inseguras, pois elas podem ter sido adulteradas em trânsito.

<network-security-config>
    <domain-config cleartextTrafficPermitted="false">
        <domain includeSubdomains="true">example.com</domain>
        <domain includeSubdomains="true">cdn.example2.com</domain>
    </domain-config>
    <base-config cleartextTrafficPermitted="true" />
</network-security-config>

Como faço para atualizar minha biblioteca?

Se a sua biblioteca criar diretamente conexões seguras/inseguras, certifique-se de que ela respeita as configurações de texto simples do aplicativo marcando isCleartextTrafficPermitted antes de abrir qualquer conexão de texto simples.

***

Este artigo é do Android Developers Blog. Ele foi escrito por Chad Brubaker. A tradução foi feita pela Redação iMasters com autorização. Você pode acessar o original em: https://android-developers.googleblog.com/2018/04/protecting-users-with-tls-by-default-in.html