API do Pokémon Go – Uma análise mais detalhada dos ataques automatizados

Ecossistema F5 | 16 de agosto de 2016

Dezenas de milhões de pessoas estão explorando o novo mundo de Pokémon Go. Acontece que muitos desses usuários não são pessoas, mas agentes automatizados, ou bots. Bots que jogam não são um fenômeno novo, mas Pokémon Go oferece alguns novos casos de uso para eles. Esses bots começaram a atrapalhar a diversão de todos ao sobrecarregar os servidores de 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 ataque todos os dias, então decidimos analisar mais de perto o que aconteceu com os ataques à API de Pokémon Go.

Ataque à API do Pokémon Go

A Niantic publicou recentemente uma postagem no blog detalhando os problemas causados pelos bots por meio da geração de tráfego automatizado, que chegou a prejudicar o lançamento na América Latina. O gráfico incluído na postagem mostra uma queda significativa no tráfego de consultas espaciais desde que a Niantic implementou medidas contra a automação, às 13h (horário do Pacífico) de 03/08. Ao que tudo indica, o tráfego automatizado era cerca de duas vezes maior que o gerado por jogadores reais. Não é de admirar que os servidores do Pokémon Go tenham ficado tão 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 scrapers. Fonte: Publicação no blog da Niantic

Conhecendo os bots de Pokémon

Existem dois tipos de bots de Pokémon. O primeiro tipo automatiza a jogabilidade normal e costuma ser um problema recorrente em outros aplicativos de jogos, automatizando atividades como caminhar e capturar Pokémon. Alguns exemplos desses bots são o MyGoBot e o PokemonGo-Bot. Mas o Pokémon Go inspirou o desenvolvimento de um novo tipo de bot, chamado de Rastreador ou Mapeador, que informa a localização dos Pokémon. Esses bots viabilizam serviços de mapeamento do Pokémon Go, como o Pokevision e o Go Radar.

Como funciona um bot de Pokémon Go

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

A Figura 2 mostra uma captura de tela de um mapa do Pokémon Go que indica os Pokémon próximos em um raio de três passos de um determinado local. Para isso, os criadores de bots geralmente seguem estas etapas:

  1. Faça a engenharia reversa do protocolo de comunicação entre o aplicativo móvel e o servidor de back-end. O criador do bot joga, captura as comunicações entre o aplicativo e o 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 executar ações. Nesse caso, obter a localização de Pokémon próximos requer apenas uma solicitação com uma coordenada de GPS específica, sem precisar realmente caminhar até o local físico. O desafio para o bot é evitar ser detectado pelo servidor e parecer uma pessoa de verdade.
  3. Ofereça recursos relacionados, como integração com o Google Maps, ou inclua uma funcionalidade de mapeamento própria do bot para o usuário.

mapa

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

Ataques e defesas de aplicativos móveis

Usando o aplicativo Pokémon Go como exemplo, vamos analisar como um aplicativo móvel é violado por meio de engenharia reversa para revelar seus segredos. Como os invasores exploraram principalmente o aplicativo do Pokémon Go para Android, vamos nos concentrar nas técnicas de violação e proteção de aplicativos Android.

Engenharia reversa do protocolo

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

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

O Pokémon Go passou por engenharia reversa e foi publicado online pelo POGOProtos em apenas duas semanas. Como isso aconteceu tão rapidamente? Inicialmente, a Niantic não usava fixação de certificado.

A fixação de certificado é uma abordagem comum usada contra ataques man-in-the-middle. Em resumo, um aplicativo móvel confia apenas nos certificados de servidor incorporados ao próprio aplicativo. Sem a proteção da fixação de certificado, um invasor pode facilmente configurar um proxy como Mitmproxy ou Fiddler e instalar no celular o certificado criado pelo invasor. Em seguida, pode configurar o celular para encaminhar o tráfego pelo proxy e interceptar o tráfego entre o aplicativo Pokémon Go e os servidores da Niantic. Existe até uma ferramenta de proxy específica para o Pokémon Go que facilita esse processo, chamada pokemon-go-mitm.

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

Análise estática do 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 a um arquivo APK. Além disso, os aplicativos Android também podem chamar bibliotecas compartilhadas escritas em código nativo (Android NDK).

Sabe-se que os arquivos Dex podem ser 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, 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 de um aplicativo é exposto, a engenharia reversa se torna muito simples. Pokemon Go Xposed usou menos de 100 linhas de código Java para fazer o aplicativo Pokémon Go acreditar que o certificado do MITMProxy era o certificado autêntico da Niantic.

Como o Pokemon Go Xposed conseguiu fazer isso? Com bastante facilidade. A ferramenta simplesmente intercepta a chamada da função checkServerTrusted mencionada no trecho de código acima. O hook altera o primeiro parâmetro da função, chain, para o valor do certificado da Niantic. Isso significa que, independentemente do certificado não autorizado usado pelo proxy, o aplicativo Pokémon Go é induzido a confiar no certificado.

Há 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 aos arquivos dex. A ofuscação dificulta a leitura do código, mesmo quando descompilado. Outra abordagem é usar empacotadores Android para criptografar o arquivo classes.dex original dos aplicativos Android. O arquivo dex criptografado é descriptografado na memória durante a 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 forma de aumentar significativamente a dificuldade de realizar engenharia reversa no aplicativo.

Engenharia reversa da biblioteca nativa

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

Os hackers então perceberam a importância do campo “Unknown6” no protocolo e, inicialmente, suspeitaram que Unknown6 fosse algum tipo de resumo criptográfico ou HMAC usado para validar a integridade da solicitação. Isso despertou um enorme interesse na comunidade pokemongodev e uma equipe “Unknown6” foi rapidamente formada para tentar decifrar o misterioso campo. O canal do Discord se tornou privado devido ao grande interesse de programadores e não programadores, mas um canal de atualizações ao vivo manteve todos informados sobre o andamento dos esforços para decifrá-lo. Após 3 dias e 5 horas, na tarde de 06/08, a equipe Unknown6 declarou vitória e lançou uma versão atualizada da API do Pokémon Go que voltou a conseguir localizar Pokémon nas proximidades.

Embora a descrição técnica dos detalhes da invasão ainda não tenha sido publicada, muitas ferramentas e tecnologias relevantes foram mencionadas nos fóruns e no canal de atualizações ao vivo. IDA-Pro da Hex-Rays é uma ferramenta profissional capaz de desmontar o código ARM de uma biblioteca nativa, e o novo descompilador da Hex-Rays pode descompilar um arquivo de código binário para um formato semelhante ao 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, a engenharia reversa de um programa binário continua sendo extremamente desafiadora. Mesmo sem qualquer ofuscação intencional, o código desmontado ou descompilado já é difícil de entender, e seu tamanho costuma ser enorme. Para ilustrar a complexidade e a imprevisibilidade do trabalho necessário, o canal de atualizações ao vivo e uma entrevista posterior relataram que a função de criptografia de “Unknown6” foi identificada em poucas horas, mas a equipe passou muito mais tempo analisando outro campo chamado “Unknown22”, que acabou não tendo relação com Unknown6.

Como resultado, a ofuscação ainda oferece muitos benefícios práticos para a proteção de bibliotecas nativas. Um alto nível de ofuscação em um arquivo binário pode aumentar em várias ordens de grandeza a dificuldade da engenharia reversa. No entanto, como demonstram as inúmeras violações bem-sucedidas de códigos seriais do Windows e de aplicativos para Windows, crackers de dispositivos móveis motivados muitas vezes conseguem atingir seus objetivos.

Proteção no lado do servidor

As defesas do lado do servidor funcionam de maneira completamente diferente das defesas do lado do cliente. Veja algumas das técnicas usadas para proteger a API móvel do Pokémon Go.

Limitação de taxa

A limitação de taxa é uma abordagem comum para tentar impedir 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 um intervalo de aproximadamente 5 segundos, os servidores da Niantic aceitariam apenas a primeira solicitação e descartariam as demais. Os invasores reagiram a esses limites das seguintes formas: a) adicionando um intervalo de 5 segundos entre as solicitações de mapa feitas por seus programas de varredura; b) usando várias contas e múltiplas threads para contornar o limite de taxa.

No caso do Pokémon Go, o uso da limitação de taxa apenas abriu outra frente de batalha para ataques automatizados: a criação automatizada de contas. Eles logo descobriram que, embora a limitação de taxa seja uma boa técnica básica para controlar a automação de scrapers excessivamente agressivos ou de invasores iniciantes, ela não impede que adversários avançados consigam enviar solicitações automatizadas.

Bloqueio de IP

O bloqueio de IPs é uma técnica tradicional usada por firewalls de rede convencionais ou firewalls de aplicações web (WAFs) para descartar solicitações provenientes de IPs suspeitos. Há muitos bancos de dados que monitoram a reputação de IPs, e os firewalls e WAFs podem consultar periodicamente essas informações.

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

Serviços de hospedagem como Amazon Web Services (AWS) e Digital Ocean também permitem que invasores obtenham máquinas virtuais e novos endereços IP. Quando usam cartões de crédito roubados, eles podem até obter esses recursos gratuitamente. No entanto, usuários legítimos nunca usam serviços de hospedagem para navegar na web ou jogar, portanto, bloquear IPs desses serviços é uma medida de defesa segura e comumente adotada no lado do servidor. Segundo esta publicação no fórum, a Niantic pode decidir bloquear IPs da AWS.

Análise de comportamento

A análise comportamental costuma ser a última linha de defesa contra invasores avançados capazes de contornar outras proteções. Os bots apresentam comportamentos muito diferentes dos humanos. Por exemplo, uma pessoa de verdade não consegue jogar 24 horas por dia, 7 dias por semana, nem capturar 5 Pokémon em um segundo. Embora a análise comportamental pareça uma abordagem promissora, criar um sistema de detecção preciso para lidar com o enorme volume de dados de um jogo como Pokémon Go não é uma tarefa fácil.

A Niantic acaba de implementar um banimento temporário para trapaceiros que usam falsificação de GPS para se “teletransportar” (ou seja, deslocar-se repentinamente a uma velocidade impossível). Provavelmente foi um “banimento temporário” devido aos falsos positivos; famílias compartilham contas, e as leituras de GPS podem ser imprecisas, fazendo com que alguns usos legítimos pareçam ser de bots.

Por volta de 12 de agosto de 2016, a Niantic publicou uma nota em seu site, informando que a violação de seus termos de serviço poderia resultar no banimento permanente de uma conta do Pokémon Go. Várias regras de banimento voltadas para bots também foram divulgadas extraoficialmente. Por exemplo, a regra de captura excessiva de Pokémon bane contas que capturam mais de mil Pokémon em um único dia. Além disso, a Niantic incentiva os jogadores legítimos a denunciar trapaceiros ou jogadores com comportamento inadequado.

Em nossa experiência, a detecção baseada em modelagem comportamental pode ser extremamente eficaz, mas muitas vezes é técnica ou economicamente inviável desenvolvê-la internamente. Como a Niantic comentou em uma publicação em seu blog, “lidar com esse problema também tem um custo de oportunidade. Os desenvolvedores precisam dedicar tempo a controlar esse problema em vez de criar novos recursos”. A questão mais importante é que desenvolver uma tecnologia capaz de oferecer proteção contra adversários determinados e com amplo conhecimento técnico, munidos de botnets e outras ferramentas projetadas para contornar as defesas convencionais, exige diversas competências altamente especializadas e um enorme esforço de desenvolvimento.

O jogo ainda não acabou

Enquanto Pokémon Go continuar sendo adorado pelos jogadores, a disputa entre os criadores de bots e a Niantic também continuará. A defesa contra o tráfego automatizado representa um desafio não apenas para o setor de jogos, mas para todos os setores. Atividades semelhantes de ataque e defesa estão ocorrendo em aplicativos de bancos, companhias aéreas e varejistas, nos quais há muito mais em jogo do que perder alguns Snorlax. Bots e ferramentas de ataque relacionadas deixam de ser brincadeira para as empresas quando seus clientes e usuários não conseguem acessar os serviços devido ao tráfego automatizado indesejado.

Compartilhar

Publicações relacionadas no blog

Entrega e proteção de agentes de IA em fábricas de IA: F5 para a arquitetura de referência NVIDIA OpenShell para agentes de IA seguros
Ecossistema F5 | 21/10/2026

Entrega e proteção de agentes de IA em fábricas de IA: F5 para a arquitetura de referência NVIDIA OpenShell para agentes de IA seguros

As soluções da F5 ampliam a Arquitetura de Referência NVIDIA OpenShell para agentes de IA seguros.

Como medir – e minimizar – o custo total de propriedade do seu Kubernetes
Ecossistema F5 | 10/12/2020

Como medir – e minimizar – o custo total de propriedade do seu Kubernetes

O Kubernetes pode ser baixado e executado gratuitamente, mas sua manutenção está longe de não ter custos. Assim como outras grandes plataformas de código aberto que são “gratuitas” apenas em um sentido simplista, o Kubernetes quase certamente exigirá investimentos para ser implantado e operado.

As-Code: a pilha de TI contínua
Ecossistema F5 | 08/10/2018

As-Code: a pilha de TI contínua

Infraestrutura, configuração, pipeline, operações. De repente, tudo é “como código”. Lori MacVittie busca esclarecer a terminologia e identificar os diferentes componentes de uma stack contínua de TI.

O estado da entrega de aplicações em 2017: automação, APIs e DevOps
Ecossistema F5 | 17/04/2017

O estado da entrega de aplicações em 2017: automação, APIs e DevOps

Explore o relatório State of Application Delivery de 2017. Leia o blog retrospectivo da F5 sobre o início da ascensão das redes declarativas e dos pipelines de DevOps.

DevOps Summit: onde a rede foi convidada para a festa
Ecossistema F5 | 11/06/2015

DevOps Summit: onde a rede foi convidada para a festa

No DevOps Summit NY, falou-se muito não apenas sobre DevOps, mas também sobre contêineres, IoT e microsserviços. As sessões se concentraram não só na mudança cultural necessária para crescer em escala com uma abordagem DevOps, mas também fizeram questão de incluir...

F5 e Nutanix convergem em infraestrutura no .NEXT
Ecossistema F5 | 08/06/2015

F5 e Nutanix convergem em infraestrutura no .NEXT

Aplicações empresariais como Microsoft SharePoint e Exchange, juntamente com a VDI, continuam sendo a espinha dorsal da sua empresa. A produtividade, embora não seja tão atraente quanto o lucro, é um fator essencial para o sucesso das operações empresariais atuais. Deixar de...