2 pontos por GN⁺ 2024-05-04 | 1 comentários | Compartilhar no WhatsApp

O tráfego DNS pode vazar para fora do túnel VPN no Android

Confirmação de possibilidade de múltiplos vazamentos de DNS

  • Foi identificada recentemente a possibilidade de múltiplos vazamentos de DNS no Android
  • Decorre de um bug do próprio Android e afeta apenas alguns aplicativos
  • Em 22 de abril, uma segunda-feira, o vazamento de DNS foi reportado por meio de uma denúncia de usuário no Reddit
    • Descobriu-se que com a configuração "Block connections without VPN" ativada, ao desativar e ativar a VPN ocorria vazamento de consultas DNS
  • Foi iniciada imediatamente uma investigação interna para verificar o problema
  • Descobrimos também mais cenários no Android que podem causar vazamentos de DNS

Descobertas

Cenários identificados em que o tráfego DNS pode vazar no Android:

  • Quando a VPN é ativada com um servidor DNS não configurado
  • Durante curtos períodos enquanto o app de VPN reconfigura o túnel ou é forçado a encerrar/crashar

O vazamento parece ficar restrito a chamadas diretas para a função C getaddrinfo:

  • Nos cenários acima, aplicativos que usam esse método para resolver nomes de domínio podem causar vazamento
  • Não foram observados vazamentos em apps que usam apenas APIs do Android, como DnsResolver
  • O navegador Chrome é um exemplo de aplicativo que pode usar getaddrinfo diretamente

Independentemente de Always-on VPN e Block connections without VPN estarem ativados:

  • Como esse não é o comportamento esperado do sistema operacional, a correção deve ser feita no upstream do OS

Foi possível verificar esse vazamento em várias versões do Android (incluindo a mais recente, Android 14)

Melhorias

Atualmente, com o app bloqueado, o DNS não é configurado:

  • O app entra em estado bloqueado se não consegue configurar o túnel de forma recuperável
  • Nesse estado, o tráfego deixa de sair do aparelho
  • Porém, como o servidor DNS não é configurado nesse estado, pode ocorrer o vazamento de DNS descrito acima
  • No momento, a solução será definir temporariamente um DNS fictício para contornar o bug do OS
  • A atualização com essa correção deve ser liberada em breve

Mitigar o vazamento durante a reconexão do túnel no app é mais difícil:

  • Ainda estamos buscando uma solução
  • Embora seja possível minimizar a frequência de reconfiguração do túnel, atualmente não consideramos possível evitar esse vazamento totalmente

É importante deixar claro que nenhum app VPN deveria precisar dessa solução:

  • Não é errado um app usar getaddrinfo para resolução de nomes de domínio
  • Em vez disso, para proteger todos os usuários do Android, independentemente do app utilizado, a resolução deve ser feita no sistema operacional

Relatamos o problema ao Google com uma proposta de melhoria e esperamos que seja resolvido rapidamente

Passos de reprodução

As etapas abaixo reproduzem o segundo cenário acima, em que usuários de VPN alteram a configuração do túnel (por exemplo, mudando para outro servidor ou alterando o DNS):

  • Use-se o app WireGuard, porque é a implementação de referência de VPN no Android
  • Observe que o vazamento provavelmente também pode ser reproduzido com outros apps de VPN do Android
  • Como um dos apps confirmado a utilizar getaddrinfo, usamos o Chrome para disparar o vazamento
  1. Baixe spam_get_requests.html

  2. Instale os apps WireGuard e Chrome

  3. Importe wg1.conf e wg2.conf no WireGuard

  4. Ative o túnel wg1 no app WireGuard e permita a permissão da VPN

  5. Ative "Always-on VPN" e "Block connections without VPN" para o WireGuard nas configurações de VPN do Android

  6. Inicie a captura de tráfego no roteador com tcpdump
    $ tcpdump -i <INTERFACE> host <IP of android device>

  7. Divida a tela para exibir WireGuard e Chrome lado a lado

  8. Abra spam_get_requests.html no Chrome e toque em "Start"

  9. No app WireGuard, alterne entre wg1 e wg2 repetidamente até ver o vazamento no próximo passo

  10. Observe o tráfego DNS a seguir no roteador:

    11:50:27.816359 IP Pixel-Tablet.lan.53353 > OpenWrt.lan.53: 11200+ A? 307lf5rgn6-19282-11-50-27-519z.mullvad.test.lan. (65) 11:50:27.816359 IP Pixel-Tablet.lan.48267 > OpenWrt.lan.53: 44347+ A? 307lf5rgn6-19284-11-50-27-579z.mullvad.test.lan. (65) 11:50:27.816396 IP Pixel-Tablet.lan.16747 > OpenWrt.lan.53: 44584+ A? 307lf5rgn6-19289-11-50-27-729z.mullvad.test. (61) 11:50:27.816458 IP OpenWrt.lan.53 > Pixel-Tablet.lan.53353: 11200 NXDomain 0/0/0 (65) 11:50:27.816476 IP Pixel-Tablet.lan.45727 > OpenWrt.lan.53: 40503+ A? 307lf5rgn6-19290-11-50-27-759z.mullvad.test. (61) 11:50:27.816542 IP OpenWrt.lan.53 > Pixel-Tablet.lan.48267: 44347 NXDomain 0/0/0 (65) 11:50:27.816588 IP Pixel-Tablet.lan.43821 > OpenWrt.lan.53: 36295+ A? 307lf5rgn6-19291-11-50-27-789z.mullvad.test. (61) 11:50:27.816625 IP OpenWrt.lan.53 > Pixel-Tablet.lan.16747: 44584 NXDomain 0/0/0 (61)

Como "Block connections without VPN" estava habilitado, nada deveria sair do aparelho além do tráfego criptografado da WireGuard, mas aqui podemos ver DNS em texto sem criptografia saindo do aparelho

Conclusão e recomendação

O vazamento DNS pode afetar seriamente a privacidade do usuário, pois pode ser usado para determinar sua localização aproximada e descobrir os sites e serviços usados pelo usuário

Essa descoberta novamente mostra que "Block connections without VPN" não corresponde ao seu nome (ou documentação) e possui vários problemas:

  • O tráfego DNS ainda pode vazar em apps sob as condições mencionadas acima
  • Como relatado anteriormente, ainda há vazamento de tráfego de verificação de conectividade

De acordo com o modelo de ameaça, pode ser necessário evitar usar Android para tarefas sensíveis ou adotar outras medidas de mitigação para evitar vazamentos:

  • Como o objetivo é mitigar parcialmente esse problema no app, mantenha-os atualizados

Opinião GN+

  • Como essa é fundamentalmente uma falha do Android OS, esperemos que o Google a corrija em pouco tempo, pois não é desejável que os desenvolvedores de apps que oferecem recurso de VPN precisem resolver esse problema todos.
  • O fato de a opção "Block connections without VPN" não funcionar conforme a documentação e ainda haver vazamento de DNS é um problema grande para os usuários. Um dos principais motivos para usar VPN é proteção de privacidade, e por isso o vazamento de DNS pode expor histórico de navegação do usuário, entre outros
  • A tecnologia de tunelamento VPN ainda pode ser considerada bastante segura, mas pode ser válido considerar soluções de segurança/privacidade adicionais além da VPN para prevenir vazamentos não intencionais causados pelo OS
  • Do ponto de vista dos desenvolvedores, pode haver ajustes temporários nos apps para contornar o bug do OS, mas no longo prazo parece necessária melhoria no sistema operacional para resolver a causa raiz
  • À medida que a tecnologia VPN se torna mais sofisticada e popular, esse tipo de problema de segurança está se tornando mais evidente. No futuro, devem-se realizar auditorias contínuas e melhorias de segurança das funções de rede e VPN do OS móvel

1 comentários

 
GN⁺ 2024-05-04
Opinião do Hacker News
  • A Mullvad foi bem elogiada por explicar muito bem as informações, o problema, uma solução de curto prazo, possíveis soluções e o que precisa ser corrigido no Android.
  • O "paranoid networking" do Android tem exceções para aplicativos de sistema e OEM, e o desenvolvedor da rethinkdns acredita que a maioria dos patches de bugs não mudará essa suposição central.
  • O Android tem suporte a uma "transição suave" entre dois dispositivos TUN, mas é complicado de implementar.
  • Há muito tempo o Android possui um problema em que, ao tentar usar apenas servidores DNS internos, ele muda para dados celulares conforme necessário e usa DNS externos.
  • No caso da Apple, como a VPN de "privacidade" tenta fazer proxy de tudo por padrão, é improvável que o cenário seja melhor com concorrentes.
  • No Android, não é possível definir diretamente o servidor DNS IPv6 e ele muda a cada alteração de Wi-Fi.
  • É possível evitar vazamentos de tráfego bloqueando, com um firewall MikroTik, todo o tráfego que não vá para o IP do servidor VPN.
  • Todos os sistemas sem acesso root são essencialmente inseguros, e Android e iOS são lamentáveis.
  • A configuração mais segura é desligar os dados móveis do celular e usar um hotspot OpenWRT para fazer a VPN no upstream.
  • Os vazamentos de DNS anulam o propósito da VPN, pois podem expor a localização de navegação do usuário e até sua localização real.
  • O tráfego APNS também vaza para fora da VPN no iOS (exceto VPNs suportadas pelo sistema operacional instaladas via perfil de provisionamento).
  • Não fica claro se esses "bugs" foram colocados de maneira proposital; é difícil acreditar que o Android tenha tantos bugs "por acidente", considerando-se a cooperação de grandes empresas de tecnologia com agências de inteligência.