Des dizaines de millions de personnes explorent le nouveau monde de Pokémon Go. Il s’avère que beaucoup de ces utilisateurs ne sont pas des personnes, mais des agents automatisés, ou des robots. Les bots de jeu ne sont pas un phénomène nouveau, mais Pokémon Go offre de nouveaux cas d'utilisation pour les bots. Ces robots ont commencé à interférer avec le plaisir de tout le monde en submergeant les serveurs Pokémon Go avec du trafic automatisé. Pokémon Go est une étude de cas parfaite sur la manière dont fonctionnent les attaques et les défenses automatisées sur les API mobiles. Chez Shape, nous sommes confrontés à ce type d'attaques tous les jours, nous avons donc pensé examiner de plus près ce qui s'est passé avec les attaques de l'API Pokémon Go.
Niantic a récemment publié un article de blog détaillant les problèmes créés par les bots via la génération de trafic automatisé, ce qui a en fait entravé leur lancement en Amérique latine. Le graphique inclus dans l'article montre une baisse significative du trafic de requêtes spatiales depuis que Niantic a déployé des contre-mesures pour l'automatisation à 13 heures PT le 08/03. Le trafic automatisé semble avoir été environ deux fois supérieur à celui des vrais joueurs humains. Il n’est pas étonnant que les serveurs de Pokémon Go aient été fortement surchargés ces dernières semaines.
Figure 1. Le trafic de requêtes spatiales a chuté de plus de 50 % depuis que Niantic a commencé à bloquer les scrapers. Source: Article de blog de Niantic
Il existe deux types de robots Pokémon. Le premier type de bot automatise le gameplay normal et est un contrevenant courant sur d'autres applications de jeu, automatisant des activités telles que se promener et attraper des Pokémon. Des exemples de tels robots incluent MyGoBot et PokemonGo-Bot . Mais Pokémon Go a inspiré le développement d'un nouveau type de bot, appelé Tracker ou Mapper, qui fournit la localisation des Pokémon. Ces robots alimentent les services de cartographie Pokémon Go tels que Pokevision et Go Radar .
Un bot API mobile est un programme qui imite la communication entre une application mobile et ses serveurs back-end, dans ce cas les serveurs de Niantic. Le bot indique simplement aux serveurs quelles actions sont entreprises et consomme la réponse du serveur.
La figure 2 montre une capture d'écran d'une carte Pokémon Go qui marque les Pokémon à proximité dans un rayon de 3 pas d'un emplacement donné. Pour y parvenir, les fabricants de robots suivent généralement ces étapes :
Figure 2. Capture d'écran d'une carte Pokémon Go
En prenant l’exemple de l’application Pokémon Go, examinons comment une application mobile est piratée par rétro-ingénierie pour révéler ses secrets. Étant donné que les attaquants ont principalement exploité l’application Android de Pokémon Go, concentrons-nous sur les failles et les défenses des applications Android.
L'application Pokémon Go et les serveurs backend communiquent à l'aide de ProtoBuf sur SSL. ProtoBuf définit le format des données transférées sur le réseau. Par exemple, voici un extrait de la définition ProtoBuf pour les statistiques des joueurs :
Pokémon Go a été rétro-conçu et publié en ligne par POGOProtos en seulement deux semaines. Comment cela a-t-il pu arriver si vite ? Au départ, Niantic n'utilisait pas l'épinglage de certificat .
L'épinglage de certificats est une approche courante utilisée contre les attaques de type « Man-in-the-Middle ». En bref, une application mobile ne fait confiance qu’aux certificats de serveur intégrés à l’application elle-même. Sans protection par épinglage de certificat, un attaquant peut facilement configurer un proxy tel que Mitmproxy ou Fiddler et installer le certificat créé par l'attaquant sur son téléphone. Ensuite, elle peut configurer son téléphone pour acheminer le trafic via le proxy et détecter le trafic entre l'application Pokémon Go et les serveurs Niantic. Il existe en fait un outil proxy spécifique à Pokémon Go qui facilite cela, appelé pokemon-go-mitm .
Le 31 juillet, Niantic a apporté un changement important à la fois sur son serveur et sur son application Pokémon Go. Pokémon Go 0.31.0 a été publié avec une protection par épinglage de certificat. Malheureusement, le chat était sorti du sac et le protocole de communication était déjà disponible publiquement sur GitHub. De plus, il n’est pas toujours facile de mettre en œuvre correctement l’épinglage de certificats. Dans les sections suivantes, nous aborderons certaines techniques couramment utilisées par les attaquants pour contourner l’épinglage de certificat.
Le package d'application Android (APK) est le format de fichier de package utilisé par Android pour installer des applications mobiles. Les applications Android sont principalement écrites en Java, et le code Java est compilé au format dex et intégré dans un fichier apk. De plus, les applications Android peuvent également appeler des bibliothèques partagées qui sont écrites en code natif ( Android NDK ).
Les fichiers Dex sont connus pour être facilement désassemblés en langages SMALI, à l'aide d'outils tels que Baksmali . Ensuite, des outils tels que dex2jar et jd-gui décompilent davantage le fichier dex en code Java, qui est facile à lire. En utilisant ces techniques, les attaquants ont décompilé l’application Android Pokémon Go (version 0.29.0 et 0.31.0) en code Java. L' exemple de code ci-dessous implémente l'épinglage de certificat de la classe com.nianticlabs.nia.network.NianticTrustManager .
Lorsque le code source de l’application est exposé, l’ingénierie inverse devient une évidence. Pokemon Go Xposed a utilisé moins de 100 lignes de code Java pour tromper l'application Pokémon Go en lui faisant croire que le certificat du MITMProxy était le certificat authentique de Niantic.
Comment Pokemon Go Xposed a-t-il réussi cela ? Assez facilement. L'outil se connecte simplement à l'appel de la fonction checkServerTrusted mentionnée dans l'extrait de code ci-dessus. Le hook modifie le premier paramètre de la fonction, chain , par la valeur du certificat de Niantic. Cela signifie que quel que soit le certificat non autorisé utilisé par le proxy, l'application Pokémon Go est amenée à faire confiance au certificat.
Il existe de nombreux outils qui peuvent aider à rendre le démontage et l’analyse statique plus difficiles par les attaquants. ProGuard et DexGuard sont des outils qui appliquent l'obfuscation au code Java et aux fichiers dex. L'obfuscation rend le code difficile à lire, même sous forme décompilée. Une autre approche consiste à utiliser des packers Android pour crypter le fichier classes.dex d'origine des applications Android. Le fichier dex chiffré est déchiffré en mémoire au moment de l'exécution, ce qui rend l'analyse statique extrêmement difficile, voire impossible, pour la plupart des attaquants. L’utilisation d’une bibliothèque native est un autre moyen d’augmenter considérablement la difficulté de la rétro-ingénierie de l’application.
Le jeu du chat et de la souris le plus intéressant entre les hackers de pokemongodev et Niantic se déroulait autour du champ nommé « Unknown6 », qui était contenu dans la signature envoyée dans la demande de carte pour obtenir des Pokémon à proximité d'un endroit. « Unknown6 » est l’un des champs non identifiés dans le protobuf rétro-conçu. Au départ, la valeur attribuée à Unknown6 n'avait pas d'importance ; les serveurs Niantic l'acceptaient simplement. À partir de 13 heures PT le 08/03, tous les robots Pokémon Go n'ont soudainement plus pu trouver de Pokémon, ce qui a finalement entraîné une baisse significative des requêtes dans la figure 1.
Les pirates ont alors remarqué l’importance du champ « Unknown6 » dans le protocole, et ont d’abord suspecté qu’Unknown6 était une sorte de condensé ou de HMAC pour valider l’intégrité de la requête. Cela a suscité un énorme intérêt de la part de la communauté pokemongodev et une équipe « Unknown6 » a été rapidement formée pour tenter de percer ce domaine mystérieux. Le canal Discord est devenu privé en raison du grand intérêt des codeurs et des non-programmeurs, mais un canal de mise à jour en direct a permis à tout le monde de rester informé de l'avancement des efforts de craquage. Après 3 jours et 5 heures, dans l'après-midi du 08/06, l'équipe d'Unknown6 a remporté la victoire en publiant une API Pokémon Go mise à jour qui était à nouveau capable de récupérer les Pokémon à proximité.
Bien que la description technique des détails du piratage n'ait pas encore été publiée , de nombreux outils et technologies pertinents ont été mentionnés sur les forums et la mise à jour en direct . IDA-Pro de Hex-Rays est un outil professionnel capable de désassembler le code ARM d'une bibliothèque native, et le nouveau décompilateur Hex-Rays peut décompiler un fichier de code binaire dans un format de style C. Ces outils permettent aux attaquants d’effectuer une analyse dynamique, de déboguer l’application mobile et ses bibliothèques au moment de l’exécution. Bien sûr, même avec des outils aussi puissants, la rétro-ingénierie d’un programme binaire reste extrêmement difficile. Sans aucune obscurcissement intentionnel, le code désassemblé ou décompilé est déjà difficile à comprendre et la taille du code est souvent énorme. Pour illustrer le travail complexe et imprévisible requis, la chaîne de mise à jour en direct et une interview ultérieure ont décrit comment la fonction de cryptage de « Unknown6 » a été identifiée en quelques heures, mais l’équipe a passé beaucoup de temps supplémentaire à analyser un autre champ nommé « Unknown22 », qui s’est avéré n’avoir aucun rapport avec Unknown6.
Par conséquent, l’obfuscation présente encore de nombreux avantages pratiques pour protéger les bibliothèques natives. Un niveau élevé d’obfuscation dans un binaire peut augmenter la difficulté de la rétro-ingénierie de plusieurs ordres de grandeur. Cependant, comme l'illustrent les nombreux crackages réussis de codes série pour Windows et les applications Windows, les crackers mobiles motivés réussissent souvent.
Les défenses côté serveur fonctionnent d’une manière complètement différente des défenses côté client. Voici quelques-unes des techniques utilisées dans le cadre de la protection de l’API mobile de Pokémon Go.
La limitation du débit est une approche courante pour tenter d’arrêter, ou au moins de ralentir, le trafic automatisé. Au début, les scanners Pokémon étaient capables d'envoyer des dizaines de requêtes par seconde, d'analyser des dizaines de cellules et de trouver tous les Pokémon.
Le 31/07, Niantic a ajouté des protections de limitation de débit. Si un compte envoyait plusieurs demandes de carte en l’espace d’environ 5 secondes, les serveurs de Niantic n’accepteraient que la première demande et rejetteraient les autres. Les attaquants ont réagi à ces limites de débit en : a) Ajoutant un délai (5 secondes) entre les demandes de carte de leurs programmes d'analyse b) Utilisant plusieurs comptes et plusieurs threads pour contourner la limite de débit
Dans le cas de Pokémon Go, l’utilisation de la limitation de débit vient d’ouvrir un autre champ de bataille pour les attaques automatisées : la création automatisée de comptes. Ils ont rapidement découvert que si la limitation du débit est une bonne technique de base pour contrôler l'automatisation contre les scrapers trop agressifs ou les attaquants novices, elle n'empêche pas les adversaires avancés de faire passer des requêtes automatisées.
Le blocage des adresses IP est une technique traditionnelle utilisée par les pare-feu réseau standard ou les pare-feu d'applications Web (WAF) pour supprimer les requêtes provenant d'adresses IP suspectes. Il existe de nombreuses bases de données qui suivent la réputation des adresses IP et les pare-feu et WAF peuvent récupérer périodiquement ces renseignements.
En général, le blocage basé sur IP est risqué et inefficace. Bloquer aveuglément une adresse IP avec un volume de trafic important peut finir par bloquer le NAT d’une université ou d’une entreprise. Pendant ce temps, de nombreux robots ou scanners Pokémon peuvent utiliser des adresses IP dynamiques résidentielles. Ces IP sont partagées par les clients des FAI, donc interdire une IP pendant une longue période peut bloquer les joueurs légitimes.
Les services d'hébergement tels qu'Amazon Web Services (AWS) et Digital Ocean sont également des sources permettant aux attaquants d'obtenir des machines virtuelles ainsi que de nouvelles adresses IP. Lorsque les attaquants utilisent des cartes de crédit volées, ils peuvent même obtenir ces ressources gratuitement. Cependant, les utilisateurs légitimes n'utiliseront jamais les services d'hébergement pour naviguer sur le Web ou jouer à des jeux, donc le blocage des adresses IP des services d'hébergement est une défense sûre et est couramment utilisé côté serveur. Niantic pourrait décider d'interdire les adresses IP d'AWS selon ce message du forum .
L’analyse du comportement est généralement la dernière ligne de défense contre les attaquants avancés capables de contourner d’autres défenses. Les robots ont des comportements très différents de ceux des humains. Par exemple, une personne réelle ne peut pas jouer au jeu 24h/24 et 7j/7, ni attraper 5 Pokémon en une seconde. Bien que l’analyse comportementale semble être une approche prometteuse, créer un système de détection précis pour gérer l’énorme volume de données comme Pokémon Go n’est pas une tâche facile.
Niantic vient de mettre en place une interdiction souple pour les tricheurs qui utilisent l'usurpation GPS pour se « téléporter » (c'est-à-dire se déplacer soudainement à une vitesse incroyablement rapide). Il s’agissait probablement d’une « interdiction souple » en raison de faux positifs ; les familles partagent des comptes et les relevés GPS peuvent être inexacts, ce qui fait que certains cas d’utilisation légitimes ressemblent à des robots.
Vers le 12 août 2016, Niantic a publié une note sur son site Web et a souligné que la violation de ses conditions de service peut entraîner une interdiction permanente d'un compte Pokémon Go. Plusieurs règles d’interdiction ciblant les robots ont également été divulguées de manière officieuse . Par exemple, la règle de surcapture de Pokémon interdit les comptes qui attrapent plus d'un millier de Pokémon en une seule journée. De plus, Niantic encourage les joueurs légitimes à signaler les tricheurs ou les joueurs inappropriés .
D’après notre expérience, la détection basée sur la modélisation comportementale peut être extrêmement efficace, mais elle est souvent techniquement ou économiquement impossible à mettre en place en interne. Comme Niantic l'a commenté dans son article de blog, « traiter ce problème a également un coût d'opportunité. Les développeurs doivent consacrer du temps à contrôler ce problème plutôt qu’à créer de nouvelles fonctionnalités. Le problème le plus important est que la création d’une technologie permettant de se défendre contre des adversaires dévoués et techniquement avertis, armés de botnets et d’autres outils conçus pour contourner les défenses classiques, nécessite de nombreuses compétences hautement spécialisées et un effort de développement considérable.
Alors que Pokémon Go continue d'être apprécié par les joueurs, le jeu entre les créateurs de bots et Niantic se poursuivra également. La défense contre le trafic automatisé représente un défi non seulement pour le secteur des jeux, mais pour toutes les industries. Des activités d'attaque et de défense similaires ont lieu dans les applications bancaires, aériennes et de vente au détail, où les enjeux sont bien plus élevés que la perte de quelques Snorlax . Les robots et les outils d’attaque associés ne sont pas une partie de plaisir pour les entreprises lorsque leurs clients et utilisateurs ne peuvent pas accéder aux services en raison d’un trafic automatisé indésirable.