BLOG

API do Pokémon Go – Um olhar mais atento aos ataques automatizados

Miniatura F5
F5
Publicado em 16 de agosto de 2016

Dezenas de milhões de pessoas estão explorando o novo mundo do Pokémon Go. Acontece que muitos desses usuários não são pessoas, mas agentes automatizados ou bots. Bots de jogo não são um fenômeno novo, mas Pokémon Go oferece alguns novos casos de uso para bots. Esses bots começaram a interferir na diversão de todos, sobrecarregando os servidores do Pokémon Go com tráfego automatizado. Pokémon Go é um estudo de caso perfeito sobre como ataques e defesas automatizados funcionam em APIs móveis. Na Shape lidamos com esses tipos de ataques todos os dias, então pensamos em analisar mais de perto o que aconteceu com os ataques à API do Pokémon Go.

Ataque de API do Pokémon Go

A Niantic publicou recentemente uma postagem de blog detalhando os problemas que os bots estavam criando por meio da geração de tráfego automatizado, o que na verdade dificultou seu lançamento na América Latina. O gráfico incluído na postagem descreve uma queda significativa no tráfego de consultas espaciais desde que a Niantic lançou contramedidas para a automação às 13h, horário do Pacífico, em 08/03. O tráfego automatizado parece ter sido cerca de duas vezes maior que o tráfego de jogadores humanos reais. Não é de se espantar que os servidores do Pokémon Go tenham ficado sobrecarregados nas últimas semanas.

 

recursos do servidor
Figura 1. O tráfego de consultas espaciais caiu mais de 50% desde que a Niantic começou a bloquear os scrapers. Fonte: Postagem do blog da Niantic

Conhecendo os Pokémon Bots

Existem dois tipos de bots Pokémon. O primeiro tipo de bot automatiza a jogabilidade regular e é um infrator comum em outros aplicativos de jogos, automatizando atividades como andar por aí e capturar Pokémon. Exemplos desses bots incluem MyGoBot e PokemonGo-Bot . Mas o Pokémon Go inspirou o desenvolvimento de um novo tipo de bot, chamado Rastreador ou Mapeador, que fornece a localização dos Pokémon. Esses bots alimentam serviços de mapeamento do Pokémon Go, como Pokevision e Go Radar .

Como funciona um bot do Pokémon Go

Um bot de API móvel é um programa que imita a comunicação entre um aplicativo móvel e seus servidores de back-end — neste caso, servidores da Niantic. O bot simplesmente informa aos servidores quais ações são tomadas e consome a resposta do servidor.

A Figura 2 mostra uma captura de tela de um mapa do Pokémon Go que marca Pokémon próximos a um alcance de 3 passos de um determinado local. Para conseguir isso, os criadores de bots geralmente seguem estas etapas:

  1. Faça engenharia reversa do protocolo de comunicação entre o aplicativo móvel e o servidor de backend. O criador do bot joga o jogo, captura as comunicações entre o aplicativo e seu servidor e decifra o formato do protocolo.
  2. Escreva um programa para fazer uma série de solicitações “legítimas” aos servidores de backend para realizar ações. Nesse caso, obter a localização de Pokémon próximos é uma única solicitação com uma coordenada GPS específica, sem a caminhada real até o local físico. O desafio do bot é ignorar a detecção do servidor e parecer um humano real .
  3. Forneça recursos relacionados, como integração com o Google Maps, ou inclua a funcionalidade de mapeamento do próprio bot para o usuário.

mapa
Figura 2. Captura de tela de um mapa do Pokémon Go

Cracks e defesas de aplicativos móveis

Usando o aplicativo Pokémon Go como exemplo, vamos examinar como um aplicativo móvel é quebrado por engenharia reversa para revelar seus segredos. Como os invasores exploraram principalmente o aplicativo Android do Pokémon Go, vamos nos concentrar nas falhas e defesas do aplicativo Android.

Engenharia reversa do protocolo

O aplicativo Pokémon Go e os servidores de backend se comunicam usando ProtoBuf sobre SSL. ProtoBuf define o formato dos dados transferidos na rede. Por exemplo, aqui está um trecho da definição do ProtoBuf para estatísticas do jogador:

Definição de ProtoBuf para estatísticas do jogador

O Pokémon Go foi submetido a engenharia reversa e publicado online pela POGOProtos em apenas duas semanas. Como isso aconteceu tão rápido? Inicialmente, a Niantic não usava fixação de certificado .

A fixação de certificados é uma abordagem comum usada contra ataques do tipo Man-in-the-Middle. Resumindo, um aplicativo móvel confia apenas em certificados de servidor que estão incorporados no próprio aplicativo. Sem proteção de fixação de certificado, um invasor pode facilmente configurar um proxy, como Mitmproxy ou Fiddler , e instalar o certificado criado pelo invasor em seu telefone. Em seguida, ela pode configurar seu telefone para rotear o tráfego através do proxy e farejar o tráfego entre o aplicativo Pokémon Go e os servidores da Niantic. Na verdade, existe uma ferramenta de proxy específica do Pokémon Go que facilita isso, chamada pokemon-go-mitm .

Em 31 de julho, a Niantic fez uma grande mudança tanto em seu servidor quanto em seu aplicativo Pokémon Go. O Pokémon Go 0.31.0 foi lançado com proteção de pinagem de certificado. Infelizmente, o segredo estava revelado e o protocolo de comunicação já estava disponível publicamente no GitHub. Além disso, implementar corretamente a fixação de certificados nem sempre é fácil. Nas seções posteriores, abordaremos algumas técnicas comumente usadas por invasores para contornar a fixação de certificados.

Análise Estática de APK

O pacote de aplicativo Android (APK) é o formato de arquivo de pacote usado pelo Android para instalar aplicativos móveis. Os aplicativos Android são escritos principalmente em Java, e o código Java é compilado no formato dex e incorporado em um arquivo apk. Além disso, os aplicativos Android também podem chamar bibliotecas compartilhadas que são escritas em código nativo ( Android NDK ).

Arquivos Dex são conhecidos por serem facilmente desmontados em linguagens SMALI, usando ferramentas como Baksmali . Em seguida, ferramentas como dex2jar e jd-gui descompilam ainda mais o arquivo dex em código Java, que é fácil de ler. Usando essas técnicas, os invasores descompilaram o aplicativo Pokémon Go para Android (versões 0.29.0 e 0.31.0) em código Java. O código de exemplo mostrado abaixo implementa a fixação de certificado da classe com.nianticlabs.nia.network.NianticTrustManager .

código de exemplo

Quando o código-fonte do aplicativo é exposto, a engenharia reversa se torna uma tarefa fácil. O Pokémon Go Xposed usou menos de 100 linhas de código Java para enganar o aplicativo Pokémon Go, fazendo-o acreditar que o certificado do MITMProxy era o certificado autêntico da Niantic.

Como o Pokémon Go Xposed conseguiu isso? Muito facilmente. A ferramenta simplesmente se conecta à chamada da função checkServerTrusted mencionada no trecho de código acima. O gancho altera o primeiro parâmetro da função, chain , para o valor do certificado da Niantic. Isso significa que não importa qual certificado não autorizado o proxy use, o aplicativo Pokémon Go é enganado e confia no certificado.

Existem muitas ferramentas que podem ajudar a dificultar a desmontagem e a análise estática por invasores. ProGuard e DexGuard são ferramentas que aplicam ofuscação ao código Java e arquivos dex. A ofuscação torna o código difícil de ler, mesmo em formato descompilado. Outra abordagem é usar compactadores Android para criptografar o arquivo classes.dex original dos aplicativos Android. O arquivo dex criptografado é descriptografado na memória em tempo de execução, tornando a análise estática extremamente difícil, se não impossível, para a maioria dos invasores. Usar uma biblioteca nativa é outra maneira de aumentar significativamente a dificuldade de fazer engenharia reversa no aplicativo.

Engenharia reversa da biblioteca nativa

O jogo de gato e rato mais interessante entre os hackers pokemongodev e a Niantic foi em torno do campo chamado “Unknown6”, que estava contido na assinatura enviada na solicitação de mapa para obter Pokémon próximos em um local. “Unknown6” é um dos campos não identificados no protobuf de engenharia reversa. Inicialmente, não importava qual valor fosse dado a Unknown6; os servidores da Niantic simplesmente o aceitavam. A partir das 13h (horário do Pacífico) do dia 08/03, todos os bots do Pokémon Go de repente não conseguiram encontrar nenhum Pokémon, o que acabou resultando na queda significativa de consultas na Figura 1.

Os hackers então notaram a importância do campo “Unknown6” no protocolo e inicialmente suspeitaram que Unknown6 fosse algum tipo de resumo ou HMAC para validar a integridade da solicitação. Isso despertou um enorme interesse da comunidade pokemongodev e uma equipe “Unknown6” foi rapidamente formada para tentar desvendar o campo misterioso. O canal do Discord se tornou privado devido ao grande interesse de programadores e não programadores, mas um canal de atualização ao vivo manteve todos informados sobre o progresso do esforço de cracking. Após 3 dias e 5 horas, na tarde de 08/06, a equipe Unknown6 reivindicou a vitória, lançando uma API atualizada do Pokémon Go que mais uma vez conseguiu recuperar Pokémon próximos.

Embora a descrição técnica dos detalhes do hack ainda não tenha sido divulgada , muitas ferramentas e tecnologias relevantes foram mencionadas nos fóruns e na atualização ao vivoO IDA-Pro da Hex-Rays é uma ferramenta profissional capaz de desmontar o código ARM de uma biblioteca nativa, e o novo descompilador Hex-Rays pode descompilar um arquivo de código binário em um formato no estilo C. Essas ferramentas permitem que invasores realizem análises dinâmicas, depurando o aplicativo móvel e suas bibliotecas em tempo de execução. É claro que, mesmo com ferramentas tão poderosas, fazer engenharia reversa de um programa binário ainda é extremamente desafiador. Sem qualquer ofuscação intencional, o código desmontado ou descompilado já é difícil de entender, e o tamanho do código geralmente é enorme. Como ilustração do trabalho complexo e imprevisível necessário, o canal de atualização ao vivo e uma entrevista subsequente descreveram como a função de criptografia de “Unknown6” foi identificada em poucas horas, mas a equipe gastou uma quantidade considerável de tempo adicional analisando outro campo chamado “Unknown22”, que acabou não tendo relação com Unknown6.

Como resultado, a ofuscação ainda tem muitos benefícios práticos para proteger bibliotecas nativas. Um alto nível de ofuscação em um binário pode aumentar a dificuldade da engenharia reversa em ordens de magnitude. No entanto, como ilustrado pelas muitas quebras bem-sucedidas de códigos seriais para Windows e aplicativos Windows, crackers móveis motivados geralmente são bem-sucedidos.

Proteção do lado do servidor

As defesas do lado do servidor funcionam de uma maneira completamente diferente das defesas do lado do cliente. Aqui estão algumas das técnicas usadas no contexto de proteção da API móvel do Pokémon Go.

Limitação de taxa

A limitação de taxa é uma abordagem comum para tentar interromper, ou pelo menos desacelerar, o tráfego automatizado. No início, os scanners de Pokémon conseguiam enviar dezenas de solicitações por segundo, escanear dezenas de células e encontrar todos os Pokémon.

Em 31/07, a Niantic adicionou proteções de limitação de taxa. Se uma conta enviasse várias solicitações de mapa em ~5 segundos, os servidores da Niantic aceitariam apenas a primeira solicitação e descartariam o restante. Os invasores reagiram a esses limites de taxa: a) Adicionando um atraso (5 segundos) entre as solicitações de mapas de seus programas de varredura b) Usando várias contas e vários threads para ignorar o limite de taxa

No caso do Pokémon Go, o uso da limitação de taxa acaba de abrir outro campo de batalha para ataques automatizados: a criação automatizada de contas. Eles descobriram rapidamente que, embora a limitação de taxa seja uma boa técnica básica para controlar a automação de scrapers excessivamente agressivos ou invasores novatos, ela não impede que adversários avançados obtenham solicitações automatizadas.

Bloqueio de IP

O bloqueio de IPs é uma técnica tradicional usada por firewalls de rede padrão ou Web Application Firewalls (WAFs) para descartar solicitações de IPs suspeitos. Existem muitos bancos de dados que rastreiam a reputação de IP e firewalls e WAFs podem recuperar essa inteligência periodicamente.

Em geral, o bloqueio baseado em IP é arriscado e ineficaz. Bloquear cegamente um IP com grande volume de tráfego pode acabar bloqueando o NAT de uma universidade ou corporação. Enquanto isso, muitos bots ou scanners Pokémon podem usar endereços IP dinâmicos residenciais. Esses IPs são compartilhados pelos clientes dos ISPs, portanto, banir um IP por um longo período pode bloquear jogadores legítimos.

Serviços de hospedagem como Amazon Web Services (AWS) e Digital Ocean também são fontes para invasores obterem máquinas virtuais e novos IPs. Quando os invasores usam cartões de crédito roubados, eles podem até obter esses recursos de graça. No entanto, usuários legítimos nunca usarão serviços de hospedagem para navegar na web ou jogar, portanto, bloquear IPs de serviços de hospedagem é uma defesa segura e é comumente usada no lado do servidor. A Niantic pode decidir banir IPs da AWS de acordo com esta postagem no fórum .

Análise do comportamento

A análise comportamental geralmente é a última linha de defesa contra invasores avançados que conseguem contornar outras defesas. Os bots têm comportamentos muito diferentes dos humanos. Por exemplo, uma pessoa real não pode jogar o jogo 24×7, ou capturar 5 Pokémon em um segundo. Embora a análise comportamental pareça uma abordagem promissora, construir um sistema de detecção preciso para lidar com o enorme volume de dados como o Pokémon Go não é uma tarefa fácil.

A Niantic acaba de implementar uma proibição branda para trapaceiros que usam falsificação de GPS para “teletransportar” (ou seja, mover-se repentinamente a uma velocidade impossivelmente rápida). Provavelmente foi uma “proibição branda” por causa de falsos positivos; famílias compartilham contas e as leituras de GPS podem ser imprecisas, fazendo com que alguns casos de uso legítimos pareçam bots.

Por volta de 12 de agosto de 2016, a Niantic publicou uma nota em seu site e destacou que a violação de seus termos de serviço pode resultar no banimento permanente de uma conta do Pokémon Go. Várias regras de proibição contra bots também foram divulgadas não oficialmente . Por exemplo, a regra de captura excessiva de Pokémon bane contas quando elas capturam mais de mil Pokémon em um único dia. Além disso, a Niantic incentiva jogadores legítimos a denunciar trapaceiros ou jogadores inapropriados .

Em nossa experiência, a detecção baseada em modelagem comportamental pode ser extremamente eficaz, mas muitas vezes é técnica ou economicamente inviável de ser desenvolvida internamente. Como a Niantic comentou em seu blog, “lidar com esse problema também tem um custo de oportunidade. Os desenvolvedores precisam gastar tempo controlando esse problema em vez de criar novos recursos.” O maior problema é que desenvolver tecnologia para se defender contra adversários dedicados e tecnicamente experientes, armados com botnets e outras ferramentas projetadas para contornar defesas regulares, exige muitos conjuntos de habilidades altamente especializadas e um tremendo esforço de desenvolvimento.

O jogo não acabou

Assim como o Pokémon Go continua sendo amado pelos jogadores, o jogo entre os criadores de bots e a Niantic também continuará. A defesa contra tráfego automatizado representa um desafio não apenas para jogos, mas para todos os setores. Atividades semelhantes de ataque e defesa estão ocorrendo em aplicativos bancários, de companhias aéreas e de varejo, onde os riscos são ordens de magnitude maiores do que perder alguns Snorlaxes . Bots e ferramentas de ataque relacionadas não são divertidos para empresas quando seus clientes e usuários não conseguem acessar serviços devido ao tráfego automatizado indesejado.