Decenas de millones de personas están explorando el nuevo mundo de Pokémon Go. Resulta que muchos de esos usuarios no son personas en absoluto, sino agentes automatizados o bots. Los bots que juegan a videojuegos no son un fenómeno nuevo, pero Pokémon Go ofrece algunos nuevos casos de uso para ellos. Estos bots han comenzado a interferir en la diversión de todos al saturar los servidores de Pokémon Go con tráfico automatizado. Pokémon Go es un caso de estudio perfecto de cómo funcionan los ataques y defensas automatizados en las API móviles. En Shape nos enfrentamos a este tipo de ataques todos los días, por lo que pensamos que sería bueno analizar con más detalle lo que sucedió con los ataques a la API de Pokémon Go.
Niantic publicó recientemente una entrada en su blog que detalla los problemas que los bots estaban creando a través de la generación de tráfico automatizado, lo que en realidad obstaculizó su lanzamiento en América Latina. El gráfico incluido en la publicación muestra una caída significativa del tráfico de consultas espaciales desde que Niantic implementó contramedidas para la automatización a la 1:00 p. m. (hora del Pacífico) del 8/3. El tráfico automatizado parece haber sido aproximadamente el doble del tráfico de jugadores humanos reales. No es de extrañar que los servidores de Pokémon Go estuvieran tan sobrecargados en las últimas semanas.
Figura 1. El tráfico de consultas espaciales cayó más del 50% desde que Niantic comenzó a bloquear los scrapers. Fuente: Entrada del blog de Niantic
Hay dos tipos de bots Pokémon. El primer tipo de bot automatiza el juego normal y es un infractor común en otras aplicaciones de juegos, automatizando actividades como caminar y atrapar Pokémon. Algunos ejemplos de estos bots son MyGoBot y PokemonGo-Bot . Pero Pokémon Go ha inspirado el desarrollo de un nuevo tipo de bot, llamado Tracker o Mapper, que proporciona la ubicación de los Pokémon. Estos bots potencian los servicios de mapas de Pokémon Go, como Pokevision y Go Radar .
Un bot de API móvil es un programa que imita la comunicación entre una aplicación móvil y sus servidores backend (en este caso, servidores de Niantic). El bot simplemente le dice a los servidores qué acciones se toman y consume la respuesta del servidor.
La figura 2 muestra una captura de pantalla de un mapa de Pokémon Go que marca los Pokémon cercanos dentro de un rango de 3 pasos de una ubicación determinada. Para lograr esto, los creadores de bots suelen seguir estos pasos:
Figura 2. Captura de pantalla de un mapa de Pokémon Go
Usando la aplicación Pokémon Go como ejemplo, examinemos cómo se descifra una aplicación móvil mediante ingeniería inversa para revelar sus secretos. Dado que los atacantes explotaron principalmente la aplicación de Android de Pokémon Go, centrémonos en las grietas y defensas de la aplicación de Android.
La aplicación Pokémon Go y los servidores backend se comunican mediante ProtoBuf sobre SSL. ProtoBuf define el formato de datos transferidos en la red. Por ejemplo, aquí hay un extracto de la definición de ProtoBuf para las estadísticas del jugador:
Pokémon Go fue diseñado a la inversa y publicado en línea por POGOProtos en solo dos semanas. ¿Cómo ocurrió esto tan rápido? Inicialmente, Niantic no utilizaba la fijación de certificados .
La fijación de certificados es un enfoque común utilizado contra ataques Man-in-the-Middle. En resumen, una aplicación móvil solo confía en los certificados de servidor que están integrados en la propia aplicación. Sin la protección de fijación de certificado, un atacante puede configurar fácilmente un proxy como Mitmproxy o Fiddler e instalar el certificado creado por el atacante en su teléfono. Luego puede configurar su teléfono para enrutar el tráfico a través del proxy y rastrear el tráfico entre la aplicación Pokémon Go y los servidores de Niantic. En realidad, existe una herramienta proxy específica de Pokémon Go que facilita esto, llamada pokemon-go-mitm .
El 31 de julio, Niantic implementó un cambio importante tanto en su servidor como en su app Pokémon Go. Se lanzó Pokémon Go 0.31.0 con protección de certificado. Desafortunadamente, el secreto ya se había revelado y el protocolo de comunicación ya estaba disponible públicamente en GitHub. Además, implementar correctamente la fijación de certificados no siempre es fácil. En las secciones posteriores, cubriremos algunas técnicas comúnmente utilizadas por los atacantes para eludir la fijación de certificados.
El paquete de aplicação de Android (APK) es el formato de archivo de paquete utilizado por Android para instalar aplicaciones móviles. Las aplicaciones de Android están escritas principalmente en Java, y el código Java se compila en formato dex y se integra en un archivo apk. Además, las aplicaciones de Android también pueden llamar a bibliotecas compartidas que están escritas en código nativo ( Android NDK ).
Se sabe que los archivos DEX se pueden desensamblar fácilmente en lenguajes SMALI, utilizando herramientas como Baksmali . Luego, herramientas como dex2jar y jd-gui descompilan aún más el archivo dex en código Java, que es fácil de leer. Utilizando estas técnicas, los atacantes descompilaron la aplicación Pokémon Go para Android (versión 0.29.0 y 0.31.0) en código Java. El código de ejemplo que se muestra a continuación implementa la fijación de certificados desde la clase com.nianticlabs.nia.network.NianticTrustManager .
Cuando se expone el código fuente de una aplicação , la ingeniería inversa se convierte en algo obvio. Pokemon Go Xposed usó menos de 100 líneas de código Java para engañar a la aplicación Pokémon Go y hacerle creer que el certificado de MITMProxy era el certificado auténtico de Niantic.
¿Cómo logró esto Pokémon Go Xposed? Con bastante facilidad. La herramienta simplemente se conecta a la llamada de la función checkServerTrusted mencionada en el fragmento de código anterior. El gancho cambia el primer parámetro de la función, cadena , al valor del certificado de Niantic. Esto significa que, independientemente de qué certificado no autorizado utilice el proxy, la aplicación Pokémon Go es engañada para que confíe en el certificado.
Hay muchas herramientas que pueden ayudar a que el desmontaje y el análisis estático por parte de los atacantes sean más difíciles. ProGuard y DexGuard son herramientas que aplican ofuscación al código Java y a los archivos dex. La ofuscación hace que el código sea difícil de leer, incluso en forma descompilada. Otro enfoque es utilizar empaquetadores de Android para cifrar el archivo classes.dex original de las aplicaciones de Android. El archivo dex cifrado se descifra en la memoria durante el tiempo de ejecución, lo que hace que el análisis estático sea extremadamente difícil, si no imposible, para la mayoría de los atacantes. Usar una biblioteca nativa es otra forma de aumentar significativamente la dificultad de realizar ingeniería inversa de la aplicación.
El juego del gato y el ratón más interesante entre los hackers de pokemongodev y Niantic fue en torno al campo llamado “Unknown6”, que estaba contenido en la firma enviada en la solicitud del mapa para obtener Pokémon cercanos en una ubicación. “Unknown6” es uno de los campos no identificados en el protobuf de ingeniería inversa. Inicialmente, no importaba qué valor se le daba a Unknown6; los servidores de Niantic simplemente lo aceptaban. A partir de la 1:00 p. m. (hora del Pacífico) del 8/3, todos los bots de Pokémon Go de repente no pudieron encontrar ningún Pokémon, lo que eventualmente resultó en la importante caída de consultas que se muestra en la Figura 1.
Los piratas informáticos notaron entonces la importancia del campo “Unknown6” en el protocolo, e inicialmente sospecharon que Unknown6 era algún tipo de resumen o HMAC para validar la integridad de la solicitud. Esto despertó un gran interés en la comunidad de desarrolladores de Pokémon y rápidamente se formó un equipo “Unknown6” para intentar descifrar este misterioso campo. El canal de Discord se volvió privado debido al amplio interés de programadores y no programadores, pero un canal de actualización en vivo mantuvo a todos informados sobre el progreso del esfuerzo de descifrado. Después de 3 días y 5 horas, en la tarde del 06/08, el equipo de Unknown6 se alzó con la victoria, lanzando una API de Pokémon Go actualizada que una vez más pudo recuperar Pokémon cercanos.
Si bien aún no se ha publicado la descripción técnica de los detalles del hack, se mencionaron muchas herramientas y tecnologías relevantes en los foros y en la actualización en vivo . IDA-Pro de Hex-Rays es una herramienta profesional capaz de desmontar el código ARM de una biblioteca nativa, y el nuevo descompilador Hex-Rays puede descompilar un archivo de código binario en un formato de estilo C. Estas herramientas permiten a los atacantes realizar análisis dinámicos y depurar la aplicación móvil y sus bibliotecas en tiempo de ejecución. Por supuesto, incluso con herramientas tan poderosas, realizar ingeniería inversa de un programa binario sigue siendo extremadamente desafiante. Sin ninguna ofuscación intencional, el código desensamblado o descompilado ya es difícil de entender y el tamaño del código suele ser enorme. Como ilustración del trabajo complejo e impredecible requerido, el canal de actualización en vivo y una entrevista posterior describieron cómo se identificó la función de cifrado de “Unknown6” en cuestión de horas, pero el equipo dedicó una gran cantidad de tiempo adicional a analizar otro campo llamado “Unknown22”, que resultó no estar relacionado con Unknown6.
Como resultado, la ofuscación todavía tiene muchos beneficios prácticos para proteger las bibliotecas nativas. Un alto nivel de ofuscación en un binario puede aumentar la dificultad de la ingeniería inversa en órdenes de magnitud. Sin embargo, como lo ilustran los numerosos cracks exitosos de códigos de serie para Windows y aplicações de Windows, los crackers móviles motivados a menudo tienen éxito.
Las defensas del lado del servidor funcionan de una manera completamente diferente a las defensas del lado del cliente. A continuación se muestran algunas de las técnicas utilizadas en el contexto de la protección de la API móvil de Pokémon Go.
La limitación de velocidad es un enfoque común para intentar detener, o al menos ralentizar, el tráfico automatizado. En los primeros días, los escáneres Pokémon podían enviar decenas de solicitudes por segundo, escanear decenas de células y encontrar todos los Pokémon.
El 31 de julio, Niantic agregó protecciones de limitación de velocidad. Si una cuenta enviaba varias solicitudes de mapas en un lapso de aproximadamente 5 segundos, los servidores de Niantic solo aceptarían la primera solicitud y descartarían el resto. Los atacantes reaccionaron a estos límites de velocidad mediante: a) Agregar un retraso (5 segundos) entre las solicitudes de mapas de sus programas de escaneo b) Usar múltiples cuentas y múltiples subprocesos para eludir el límite de velocidad
En el caso de Pokémon Go, el uso de limitaciones de velocidad simplemente abrió otro campo de batalla para los ataques automatizados: la creación automatizada de cuentas. Rápidamente descubrieron que, si bien la limitación de velocidad es una buena técnica básica para controlar la automatización de los scrapers demasiado agresivos o los atacantes novatos, no impide que los adversarios avanzados obtengan solicitudes automatizadas.
El bloqueo de IP es una técnica tradicional utilizada por los firewalls de red estándar o los firewalls de aplicação web (WAF) para descartar solicitudes de IP sospechosas. Hay muchas bases de datos que rastrean la reputación de IP y los firewalls y WAF pueden recuperar dicha información periódicamente.
En general, el bloqueo basado en IP es riesgoso e ineficaz. Bloquear ciegamente una IP con un gran volumen de tráfico puede terminar bloqueando el NAT de una universidad o corporación. Mientras tanto, muchos bots o escáneres de Pokémon pueden usar direcciones IP dinámicas residenciales. Estas IP son compartidas por los clientes de los ISP, por lo que prohibir una IP durante un tiempo prolongado puede bloquear a jugadores legítimos.
Los servicios de alojamiento como Amazon Web Services (AWS) y Digital Ocean también son fuentes para que los atacantes obtengan máquinas virtuales y nuevas IP. Cuando los atacantes utilizan tarjetas de crédito robadas, incluso pueden obtener estos recursos de forma gratuita. Sin embargo, los usuarios legítimos nunca utilizarán servicios de alojamiento para navegar por la web o jugar juegos, por lo que bloquear las IP de los servicios de alojamiento es una defensa segura y se utiliza comúnmente en el lado del servidor. Niantic podría decidir prohibir las IP de AWS según esta publicación del foro .
El análisis del comportamiento suele ser la última línea de defensa contra atacantes avanzados que pueden eludir otras defensas. Los bots tienen comportamientos muy diferentes a los humanos. Por ejemplo, una persona real no puede jugar el juego 24 horas al día, 7 días a la semana, ni atrapar 5 Pokémon en un segundo. Si bien el análisis del comportamiento parece un enfoque prometedor, construir un sistema de detección preciso para manejar un volumen de datos enorme como el de Pokémon Go no es una tarea fácil.
Niantic acaba de implementar una prohibición suave para los tramposos que usan la suplantación de GPS para "teletransportarse" (es decir, moverse repentinamente a una velocidad imposiblemente rápida). Probablemente fue una “prohibición suave” debido a los falsos positivos: las familias comparten cuentas y las lecturas del GPS pueden ser inexactas, lo que hace que algunos casos de uso legítimos parezcan bots.
Alrededor del 12 de agosto de 2016, Niantic publicó una nota en su sitio web y describió que la violación de sus términos de servicio puede resultar en una prohibición permanente de una cuenta de Pokémon Go. También se revelaron de manera extraoficial múltiples reglas de prohibición dirigidas a los bots. Por ejemplo, la regla de captura excesiva de Pokémon prohíbe las cuentas cuando capturan más de mil Pokémon en un solo día. Además, Niantic anima a los jugadores legítimos a denunciar a los tramposos o jugadores inapropiados .
En nuestra experiencia, la detección basada en modelos de comportamiento puede ser extremadamente eficaz, pero a menudo resulta técnica o económicamente inviable desarrollarla internamente. Como comentó Niantic en su publicación de blog, “abordar este problema también tiene un costo de oportunidad. “Los desarrolladores tienen que dedicar tiempo a controlar este problema en lugar de crear nuevas funciones”. El problema más importante es que desarrollar tecnología para defenderse de adversarios dedicados y técnicamente expertos, armados con botnets y otras herramientas diseñadas para eludir las defensas regulares, requiere muchas habilidades altamente especializadas y un tremendo esfuerzo de desarrollo.
A medida que Pokémon Go continúa siendo amado por los jugadores, el juego entre los creadores de bots y Niantic también continuará. Defenderse del tráfico automatizado supone un desafío no sólo para el sector del gaming, sino para todas las industrias. Se están llevando a cabo actividades de ataque y defensa similares en aplicaciones bancarias, de aerolíneas y de minoristas, donde lo que está en juego es órdenes de magnitud más alto que perder unos cuantos Snorlaxes . Los bots y las herramientas de ataque relacionadas no son un juego para las empresas cuando sus clientes y usuarios no pueden acceder a los servicios debido al tráfico automatizado no deseado.