Maîtriser les tricheurs de CSGO avec IdentityLogger
(mobeigi.com)- Invex Gaming a exploité des serveurs communautaires CSGO en Australie et en Nouvelle-Zélande de 2014 à 2019, et l’évitement répété des bans alourdissait fortement la charge de revue manuelle des démos pour les administrateurs
- Les bans existants suivaient surtout l’adresse IP et le Steam ID, mais si un tricheur changeait les deux en même temps, le serveur avait du mal à vérifier qu’il s’agissait du même joueur
- IdentityLogger utilisait les cookies persistants du navigateur VGUI intégré à CSGO pour stocker un Tracking ID, puis employait l’adresse IP, le Steam ID et le Tracking ID ensemble comme empreinte
- Après son déploiement sur tous les serveurs en février 2017, même les joueurs ayant changé à la fois leur Steam ID et leur adresse IP étaient réidentifiés via le Tracking ID et bannis immédiatement
- Cette méthode a fonctionné jusqu’au retrait du navigateur VGUI par Valve en octobre 2017 pour renforcer la sécurité, après quoi la technique et le plugin ont été rendus publics
Exploitation d’Invex Gaming et charge liée à la lutte contre la triche
- Invex Gaming était un serveur communautaire CSGO basé en Australie et en Nouvelle-Zélande, exploité de 2014 à 2019
- Les tâches d’exploitation couvraient les forums, la maintenance de l’infrastructure serveur, la gestion des coûts et des dons, l’ajout de modèles de joueurs, la correction des hitboxes, l’automatisation du système VIP, l’écriture de plugins personnalisés, les correctifs d’exploits et de bugs du jeu, la défense contre les DDoS et le traitement des signalements
- Parmi elles, l’identification et le bannissement répétés des tricheurs étaient de loin la tâche la plus monotone et la plus épuisante
- Pour la détection automatique, il existait du code côté serveur et des approches comme Valve Anti-Cheat, mais en raison du cycle permanent entre développeurs de cheats et développeurs d’anti-cheat, il était difficile de détecter automatiquement tous les cheats
- En dernier recours, il fallait donc passer par l’analyse manuelle des démos CSGO, les administrateurs devant juger eux-mêmes si un joueur trichait
Là où les bans par adresse IP et Steam ID échouent
- Un ban classique consiste à stocker des informations identifiables afin de bloquer l’accès à un service
- Les serveurs d’Invex Gaming utilisaient principalement deux identifiants
- Adresse IP : identifiant Internet attribué par un FAI ou un hébergeur
- Steam ID : identifiant unique lié à un compte Steam
- Lorsqu’un joueur était banni, son adresse IP et son Steam ID étaient enregistrés dans la liste des bans, puis toute tentative ultérieure avec la même adresse IP ou le même Steam ID entraînait son expulsion du serveur
- Si quelqu’un revenait avec un nouveau Steam ID mais la même adresse IP, il était possible de rattacher ce nouveau Steam ID au ban existant et de le rebannir
- Même chose si seule l’adresse IP changeait mais que le même Steam ID était utilisé : la nouvelle adresse IP était associée au ban existant
- Le problème apparaissait lorsqu’un tricheur changeait simultanément de Steam ID et d’adresse IP
- Du point de vue du serveur, il s’agissait d’une combinaison jamais vue d’adresse IP et de Steam ID
- Il n’existait alors aucun moyen de la relier au ban précédent, ce qui lui permettait de rejouer
- Même après un nouveau ban, il pouvait continuer à l’éviter en changeant à chaque fois les deux identifiants
- La possibilité de maintenir une liste de VPN populaires et des adresses IP associées a aussi été étudiée, mais l’équipe d’exploitation ne l’appréciait pas en raison de la charge de maintenance continue
- Une analyse ultérieure a montré que le tricheur le plus notoire avait accès à des adresses IP géographiquement dispersées ainsi qu’à plus de 87 comptes Steam ayant acheté CSGO
Les risques de faux positifs créés par l’empreinte d’adresse IP
- Le Steam ID identifie un joueur de manière unique, mais une adresse IP n’est pas un identifiant unique
- Si deux frères se connectaient au serveur depuis le même foyer et qu’un seul trichait, leurs empreintes pouvaient se retrouver mêlées à cause de la même adresse IP, menant au ban des deux
- Le problème existait aussi sur des réseaux partagés, comme une université, où tout le trafic externe sort via une seule adresse IP
- Une personne est bannie pour triche depuis le réseau du campus
- Le Steam ID d’un autre joueur utilisant le même réseau peut alors être relié à ce ban, ainsi que son adresse IP domestique, et être injustement banni
- Invex Gaming avait mis en place un système d’exceptions pour ces cas rares et recommandait de ne pas jouer depuis des réseaux non fiables
Utiliser les cookies du navigateur VGUI comme troisième identifiant
- Début 2017, le problème d’évitement des bans sur les serveurs s’est fortement aggravé, obligeant les administrateurs à continuer de revoir manuellement les démos
- L’enjeu central était d’identifier un même joueur même lorsque son Steam ID et son adresse IP changeaient simultanément
- CSGO disposait d’un navigateur web intégré permettant aux opérateurs de serveur d’afficher un MOTD à la connexion, appelé navigateur VGUI
- Ce navigateur VGUI permettait aux opérateurs de serveur d’ouvrir n’importe quel site web sur l’écran du joueur, avec la possibilité de masquer la fenêtre
- Le navigateur était préauthentifié via les cookies Steam, pouvait être automatiquement connecté aux domaines Steam et autorisait aussi l’exécution côté client du JavaScript envoyé par l’opérateur du serveur
- Le point clé d’IdentityLogger était que le navigateur VGUI prenait en charge les cookies et les conservait entre les sessions
- Les tests ont montré qu’un cookie enregistré par le navigateur VGUI restait présent même après avoir quitté puis relancé CSGO
- Il ne semblait pas y avoir de limite réelle sur la date d’expiration, et des cookies expirant dans plus de 10 ans pouvaient être enregistrés
- Les données des cookies étaient stockées dans un fichier du répertoire d’installation Steam du joueur
- Cette méthode permettait d’attribuer à chaque joueur un troisième identifiant appelé Tracking ID
- Pour apparaître comme un nouveau joueur, il fallait alors changer à la fois de Steam ID, d’adresse IP et de dossier d’installation Steam, et l’équipe estimait qu’aucun joueur n’irait jusqu’à modifier aussi son dossier d’installation Steam
Fonctionnement d’IdentityLogger
- IdentityLogger est un système unifié d’empreinte des joueurs basé sur l’adresse IP, le Steam ID et le Tracking ID
- Lorsqu’un joueur se connecte au serveur, un contrôle de ban est d’abord effectué dans la base de données
- L’adresse IP, le Steam ID et le Tracking ID sont vérifiés
- Si un ban existant est trouvé, le joueur est expulsé du serveur et le nouvel identifiant est rattaché au ban existant
- Pour les joueurs non bannis, le serveur ouvre une page web secrète dans une fenêtre VGUI masquée
- La requête incluait une valeur secrète pour l’authentification et, même si la requête VGUI était générée côté client, le trafic était chiffré en HTTPS
- Un script PHP vérifie si un cookie Tracking ID existe déjà
- S’il n’existe pas, un nouveau Tracking ID est généré et enregistré
- Le Tracking ID est une chaîne alphanumérique aléatoire de 64 caractères comme
TeStsCOhZO1TQsumJkDUOdMMo13ReRLEngrQTg7S49LKT2rBvgPhauzSYbegscOT - Le cookie est finalement stocké dans le fichier
vgui.browser.cookies.datdu répertoire d’installation Steam du joueur
- Le Steam ID, l’adresse IP et le Tracking ID sont enregistrés dans la base de données à chaque connexion du joueur au serveur
- Cette base de données était intégrée à un panneau web permettant aux administrateurs d’examiner les empreintes des joueurs, ainsi qu’à un plugin SourceBans modifié, basé sur un logiciel de gestion des bans pour les jeux utilisant Source
Comment le système empêchait l’évitement des bans
- Par exemple, si un joueur se connecte d’abord avec l’adresse IP
198.51.100.1et le Steam IDSTEAM_1:1:1111, un Tracking ID est créé - Si ce joueur est ensuite banni pour triche, l’adresse IP, le Steam ID et le Tracking ID sont tous ajoutés à la base de données des bans
- Plus tard, si ce même joueur se connecte avec l’adresse IP
100.64.50.74et le Steam IDSTEAM_1:1:3333, la nouvelle adresse IP et le nouveau Steam ID passent le contrôle de ban initial - Mais le Tracking ID déjà enregistré est relié au ban précédent, ce qui empêche de passer la vérification
- Le système rebannit alors immédiatement le joueur et rattache la nouvelle adresse IP et le nouveau Steam ID au ban existant
- Par la suite, quel que soit l’adresse IP ou le Steam ID utilisés, ce joueur est banni dès la connexion à cause du même Tracking ID
Résultats du déploiement en 2017 et publication
- Après les tests, Invex Gaming a déployé IdentityLogger sur tous ses serveurs CSGO en février 2017
- Juste après le déploiement, le nombre de tricheurs bannis a fortement augmenté
- Il est aussi apparu que certains membres de confiance de longue date de la communauté trichaient sur des comptes secrets
- Certains tricheurs ont même demandé directement pourquoi ils avaient été détectés pour évitement de ban alors qu’ils avaient changé de Steam ID et d’adresse IP
- D’autres opérateurs de serveurs ont également manifesté de l’intérêt pour le plugin, certains allant jusqu’à proposer de l’argent
- Comme la technique aurait pu être contournée simplement en supprimant le fichier de cookies si elle avait été largement connue, son implémentation est restée secrète au sein de l’équipe d’administration
- Cette méthode a continué de fonctionner jusqu’au retrait complet du navigateur VGUI par Valve en octobre 2017, dans le cadre d’un renforcement de la sécurité du jeu
- Après la suppression du navigateur VGUI, la technique a été rendue publique et le plugin a lui aussi été publié en open source
1 commentaires
Commentaires sur Hacker News
Dans UT2004, on peut bannir des joueurs par GUID (hachage de clé CD) ou par IP, mais après qu’Epic a abandonné le jeu, les générateurs de clés se sont multipliés, rendant les bannissements par GUID inefficaces, et aujourd’hui les VPN coûtent 2 dollars, donc les bannissements IP ont aussi leurs limites
La principale solution utilisée actuellement consiste à combiner les bannissements IP avec un blocage des VPN en injectant dans le pare-feu toute une base de données de sous-réseaux VPN connus, ainsi qu’une technique d’empreinte similaire qui parcourt la structure de certains dossiers système
Il a été créé pour Tremulous (un fork d’ioquake3) parce que les gens contournaient sans cesse les bannissements IP, mais il peut aussi servir pour d’autres jeux. Ce n’est pas mon projet, mais je connais son auteur, et s’il y a de la demande, on pourrait le forker et l’adapter à un jeu précis ou à un usage plus générique
schachtmeister2 peut aussi utiliser des heuristiques comme
whois -10 "Hosting",whois -13 "VPN",whois +7 "residential"P.-S. : en voyant que le dépôt Git renvoyait une 502, j’ai contacté l’administrateur
Je n’y joue plus en ligne parce que je n’ai plus le niveau, mais quand il me reste 30 minutes, faire rapidement une partie contre l’IA est toujours amusant
Le propriétaire du serveur autorise les connexions avec des comptes non-Steam (versions piratées), donc on ne peut pas s’appuyer sur les bannissements par SteamID comme avec les GUID d’Unreal. Changer un faux ID est probablement un peu pénible car ça se trouve quelque part au fond du dossier d’installation, mais c’est faisable. Le jeu reste assez populaire en Afrique du Nord, dans les anciens pays baltes et les régions alentour, ainsi qu’en Asie du Nord et de l’Ouest, donc sans ces joueurs le serveur serait vide
Du coup, on utilise à la fois la carotte et le bâton. Les joueurs Steam obtiennent presque instantanément le rechargement, sont exemptés de certaines fonctions automatiques un peu agressives de modération/kick, et reçoivent un pseudo réservé avec un tag « VIP ». En gros, pour le prix de quelques clés VPN, ils obtiennent un avantage légitime et la propriété du jeu, avec un coût unique qui va directement au développeur. Sinon, on peut aussi l’obtenir gratuitement en jouant au moins une partie par semaine pendant 5 semaines et en contactant l’équipe via les réseaux sociaux
Côté bâton, au lieu de simplement kick ou bannir, on cherche à bien montrer qu’ils ne sont pas les bienvenus en les rendant volontairement pénibles, pour qu’ils n’aient pas envie de revenir. On peut les désarmer et leur donner l’arme la plus nulle, les téléporter aléatoirement hors de la carte ou coincés dans le sol, lancer
amx_rocketen boucle pour faire un feu d’artifice, utiliseramx_drugpour pousser au maximum l’angle de vue et leur donner un effet d’ivresse, ou les traiter de loser sans skill qui a besoin qu’une IA joue à sa place pour s’amuserIl existe aussi des plugins amx et des commandes considérés comme « illégaux », qu’on évite en général à cause du risque d’abus, mais qui sont utiles dans ce genre de situation. En particulier,
amx_execest assez effrayant, car il permet à un admin d’accéder directement à la console en jeu du client pour exécuter des commandes ou changer des réglages arbitrairesPar exemple, avec des commandes comme
rate 1000,name iCaNtAiM,unbind all,bind y quit,fps_max 50, on peut saboter leur débit réseau, changer leur nom, effacer leurs raccourcis clavier, lier la touche de chat par défaut à la fermeture du jeu, et baisser le FPS maximal à un niveau pas immédiatement visible mais suffisamment agaçant. Revenir aux valeurs par défaut est facile en supprimant le fichier de configuration, mais sans sauvegarde cela peut être très frustrantFait intéressant, beaucoup de serveurs vendent des avantages VIP jusqu’à 20 dollars par mois. Au début, ça m’a choqué, mais j’ai découvert qu’il existe une sorte de cartel opaque où il faut payer assez cher pour être mis en avant à une position correcte dans les navigateurs de serveurs tiers, et qu’une grande partie des revenus part dans ces « boosts »
Quand le propriétaire de notre serveur a arrêté de payer les « boosts » pendant deux mois, le nombre moyen de joueurs est tombé de 14/32 à 3/32, et le pic habituel du week-end, qui montait souvent à 28/32, est devenu au mieux 12/32 un vendredi soir avec un peu de chance. Dès qu’il a recommencé à payer, le nombre de joueurs est reparti à la hausse, et le plus fou, c’est que ça coûte 180 dollars par mois
Avant de participer à l’exploitation du serveur, je pensais qu’un deathmatch amusant, une bonne modération, une faible latence, un serveur performant et le fait d’être dédié à un remake/remix de la deuxième carte la plus populaire du jeu suffiraient à le rendre populaire. Mais pour être visible de la plupart des joueurs, il semble qu’il faille payer un prix excessif aux gardiens déjà en place
C’est comparable au fait d’annoncer à un scraper web que son IP a été bloquée : une telle stratégie ne rapporte rien. Mieux vaut marquer l’IP du scraper en arrière-plan et ne lui servir que des données poubelles mélangées aléatoirement dans la page
À mon avis, la détection de cheat devrait fonctionner pareil. Bannir ne fait que faire perdre un avantage stratégique, et changer d’IP, de clé CD ou de compte n’est qu’un désagrément mineur pour un cheater
C’est un domaine qui m’intéresse à la fois professionnellement et personnellement, donc si vous avez besoin de suggestions, je peux aider
J’aime que l’auteur ait utilisé une adresse TEST-NET-2 de la RFC5737 comme exemple d’adresse IPv4 : « An example of an IPv4 IP address is 198.51.100.1. »
https://www.rfc-editor.org/rfc/rfc5737
J’aimerais vraiment, un jour dans ma carrière, travailler sur un anti-cheat uniquement côté serveur. Ce genre de course aux armements adverse a l’air vraiment passionnant à creuser longtemps et en profondeur.
C’est une bataille perdue d’avance, parce qu’il y a bien plus de joueurs que de développeurs.
Déplacer toutes les actions importantes vers le serveur n’est ni simple ni économique, mais c’est une manière de bloquer la triche de façon plus globale
Et ça devient vraiment difficile si on vise en plus des jeux riches en calculs physiques, un tickrate de 120 (voire plus après des tests supplémentaires), un combat d’action basé sur des contrôles précis, et une montée en charge à l’échelle d’un MMORPG.
Maintenant qu’il existe des aimbots basés sur YOLO, le monde est devenu bien plus compliqué, et la conclusion réaliste, c’est qu’un anti-cheat finit toujours par pouvoir être cassé
Côté client, on peut produire un binaire privé dont le hash n’est pas enregistré par les principaux services anti-cheat, et côté serveur, on ne peut voir que ce que les règles du jeu autorisent
Il n’existe aucun mécanisme pour empêcher des temps de réaction surhumains, et il ne devrait probablement pas y en avoir, donc c’est devenu un problème sans solution
Il faut donc en venir au jugement de la communauté, ce qui est tout aussi ennuyeux. Dans Counter-Strike, le fait que de bons joueurs soient accusés d’être des tricheurs est un vieux problème, et en même temps un problème amusant.
J’ai acheté plusieurs jeux Battlefield il y a quelques années, et certains étaient injouables à cause des tricheurs au speedhack et à l’aimbot. Ça me semblait facile à détecter côté serveur, et je me demandais pourquoi rien n’était fait.
Si le site est hors ligne ou lent et que vous voulez lire l’article, il y a une capture d’écran de la page entière : https://i.imgur.com/SPp6IHX.jpeg
Je ne pensais pas que cet article recevrait autant de trafic.
Cet article ne parle pas d’empêcher les tricheurs, c’est-à-dire de la détection de triche, mais d’empêcher les tricheurs bannis de revenir sans cesse, donc du contournement de bannissement
Surtout aujourd’hui, avec même des cheats matériels comme le DMA, la détection de triche est un tout autre jeu. Personnellement, je pense qu’un des moyens les plus efficaces pour empêcher le contournement de bannissement, c’est simplement de faire réellement payer le jeu.
Dans CS:GO, les gens se soucient assez peu du bannissement d’un compte avec des skins valant des centaines de dollars. Soit ils ont acheté un compte volé pour environ 5 dollars, soit ils paient déjà 30 dollars par mois pour un service de triche
Il y a probablement un énorme recoupement entre les tricheurs fréquents et les baleines pay-to-win
Une manière plus fiable de réduire les tricheurs dans un jeu, c’est le honeypot à tricheurs. Au lieu de bannir un tricheur puis de suivre à nouveau sa trace après l’achat d’un nouveau compte, on le place discrètement dans un matchmaking peuplé uniquement d’autres tricheurs, de bots volontairement agaçants, de faux lag, ou avec parfois des entrées clavier ignorées
Si vous gâchez leur plaisir, ils arrêtent de gâcher le jeu. Et là, la guerre de l’information s’inverse : pour savoir s’ils doivent racheter un compte, ils doivent d’abord déterminer s’ils jouent régulièrement contre des tricheurs ou des bots.
Bien sûr, si un fournisseur négligent finit un jour par faire fuiter des clés TPM, ça pourra devenir falsifiable.
Les joueurs des grands pays passent facilement à côté du sentiment de communauté qu’on trouve dans les petits pays
Quand il n’y a chaque jour que l’équivalent de 3 ou 4 serveurs de joueurs, on apprend vite à se connaître, et ça ajoute énormément de blagues et de plaisir.
C’est bien mieux que les jeux à l’échelle de millions de joueurs où l’on ne reverra probablement jamais les personnes avec qui l’on a fait une partie. Pour la même raison, j’aime aussi les jeux avec des serveurs gérés par la communauté.
On finissait par revenir toujours sur les mêmes serveurs selon qui était connecté, et surtout selon la qualité de sa propre connexion.
L’approche qui consiste à « re-bannir quelqu’un s’il se connecte avec un autre Steam ID mais utilise une adresse IP déjà bannie » fonctionne bien jusqu’à ce qu’on réalise qu’elle punit des joueurs innocents à cause du CGNAT et de la rotation des adresses IP
Les tricheurs savent généralement comment forcer leur routeur à demander une nouvelle IP, et cette IP est ensuite attribuée à quelqu’un d’autre.
Cela dit, c’était assez rare, avec seulement une poignée de signalements en plusieurs mois. Si le serveur avait été plus populaire, je l’aurais rencontré bien plus souvent.
Si « je n’ai partagé la solution et les techniques qu’avec un seul autre administrateur de serveur au Royaume-Uni, en qui j’avais une confiance totale », alors c’était probablement nous
On l’a finalement combiné avec d’autres signaux de fingerprinting, mais la méthode utilisant VGUI était étonnamment efficace. Je crois me souvenir que le navigateur web a été retiré vers 2018, ce qui était dommage. C’était extrêmement puissant pour créer des arbres de compétences personnalisés liés au serveur ou d’autres intégrations amusantes.
« Le trafic lui-même est chiffré en HTTPS, donc même avec un outil de sniffing de paquets comme Wireshark, on ne peut pas trouver le token brut » : si le navigateur intégré utilisait le proxy système et la liste des certificats système, il était alors très facile de déchiffrer le HTTPS avec des outils comme Fiddler ou Burp Suite
La requête se fond aussi banalement parmi les autres, et ces requêtes sont prévisibles. En général, une requête MOTD est tout à fait attendue, donc elle ne paraît pas suspecte
Dans une situation où la méthode de contournement est bien plus simple, comme supprimer un simple fichier local, cela fonctionnait déjà largement assez bien sans avoir à identifier la vraie requête ni à configurer Fiddler ou Burp Suite
Pas besoin de surconcevoir
Cela se fait en quelques clics et, selon le TLS utilisé, il peut falloir le refaire pour chaque connexion, mais ce n’est pas si compliqué
Je sais bien que « il aurait fallu déposer un brevet » était une plaisanterie, mais s’il l’avait fait, il aurait dû divulguer la technique et elle serait immédiatement devenue inutile
Cela n’enlève absolument rien au billet lui-même. C’était une lecture amusante