Como o IdentityLogger derrotou trapaceiros no CSGO
(mobeigi.com)- A Invex Gaming operou servidores comunitários de CSGO na Austrália e na Nova Zelândia entre 2014 e 2019, e a evasão recorrente de banimentos aumentava a carga de revisar demos manualmente
- Os banimentos existentes rastreavam principalmente a combinação de endereço IP e Steam ID, mas quando um trapaceiro mudava os dois ao mesmo tempo, ficava difícil para o servidor confirmar que era a mesma pessoa
- O IdentityLogger armazenava um Tracking ID usando cookies persistentes do navegador VGUI embutido no CSGO e usava endereço IP, Steam ID e Tracking ID juntos como impressão digital
- Depois de ser implantado em todos os servidores em fevereiro de 2017, jogadores que mudavam tanto o Steam ID quanto o endereço IP ainda eram identificados novamente pelo Tracking ID e banidos imediatamente
- Esse método funcionou até a Valve remover o navegador VGUI em outubro de 2017 para reforçar a segurança, e depois disso a técnica e o plugin foram divulgados
Operação da Invex Gaming e a carga de combater trapaceiros
- A Invex Gaming era um servidor comunitário de CSGO baseado na Austrália e Nova Zelândia, operando de 2014 a 2019
- As tarefas operacionais incluíam manter o fórum e a infraestrutura dos servidores, gerenciar custos e doações, adicionar modelos de jogador, corrigir hitboxes, automatizar o sistema VIP, escrever plugins personalizados, corrigir exploits e bugs do jogo, defender contra DDoS e processar denúncias
- Entre tudo isso, a tarefa mais tediosa e desgastante era a identificação e o banimento repetidos de trapaceiros
- Havia métodos de detecção automática, como código do lado do servidor e soluções como o Valve Anti-Cheat, mas era difícil capturar automaticamente todos os cheats por causa do ciclo contínuo entre desenvolvedores de cheats e de anticheat
- No fim, o último recurso era a análise manual assistindo demos de CSGO, com administradores decidindo diretamente se um jogador estava trapaceando
Onde o banimento por IP e Steam ID falhava
- Um banimento comum funciona armazenando informações identificáveis para bloquear o acesso a um serviço
- Os servidores da Invex Gaming usavam principalmente dois identificadores
- Endereço IP: identificador de internet atribuído por um ISP ou provedor de hospedagem
- Steam ID: identificador único vinculado a uma conta Steam
- Quando um jogador era banido, o endereço IP e o Steam ID eram armazenados na lista de banidos, e conexões futuras com o mesmo endereço IP ou Steam ID eram expulsas do servidor
- Se a pessoa voltasse com um novo Steam ID, mas com o mesmo endereço IP, era possível vincular esse novo Steam ID ao banimento existente e bani-la de novo
- O mesmo valia para quem mudava apenas o endereço IP e continuava usando o mesmo Steam ID: o novo IP era associado ao banimento anterior
- O problema surgia quando o trapaceiro trocava ao mesmo tempo o Steam ID e o endereço IP
- Para o servidor, era uma combinação inédita de endereço IP e Steam ID
- Não havia forma de relacioná-la a um banimento anterior, então ele podia voltar a jogar
- Mesmo que fosse banido de novo, podia continuar evitando o banimento ao trocar os dois identificadores juntos
- Também foi considerada a manutenção de listas de VPNs populares e seus endereços IP relacionados, mas a equipe não gostava da carga contínua de manutenção
- Em análises posteriores, descobriu-se que o trapaceiro mais notório tinha acesso a endereços IP geograficamente distribuídos e a mais de 87 contas Steam com CSGO comprado
O risco de falsos positivos criado pela impressão digital por IP
- O Steam ID identifica um jogador de forma única, mas o endereço IP não é um identificador único
- Se dois irmãos na mesma casa acessassem o servidor e só um trapaceasse, a impressão digital dos dois poderia se misturar pelo mesmo endereço IP e ambos poderiam acabar banidos
- Também havia problema em redes compartilhadas, como universidades, onde todo o tráfego externo sai por um único endereço IP
- Uma pessoa era banida por trapaça na rede do campus
- O Steam ID e até o IP residencial de outro jogador na mesma rede poderiam ser associados, levando a um banimento injusto
- A Invex Gaming criou um sistema de exceções para esses casos raros e orientava os jogadores a não jogar em redes não confiáveis
Uso de cookies do navegador VGUI como terceiro identificador
- No começo de 2017, o problema de evasão de banimentos no servidor piorou muito, e os administradores ainda precisavam revisar demos manualmente
- O desafio central era reconhecer o mesmo jogador mesmo quando Steam ID e endereço IP mudavam ao mesmo tempo
- O CSGO tinha um navegador web interno padrão que permitia ao operador do servidor mostrar um MOTD na conexão, chamado de navegador VGUI
- O navegador VGUI permitia ao operador do servidor abrir qualquer site na tela do jogador e até ocultar a janela
- Esse navegador vinha pré-autenticado com cookies da Steam, podia fazer login automático em domínios Steam e também permitia execução no cliente de JavaScript enviado pelo operador do servidor
- O ponto central do IdentityLogger era que o navegador VGUI suportava cookies e os mantinha entre sessões
- Testes mostraram que cookies salvos pelo navegador VGUI continuavam lá mesmo após fechar e abrir o CSGO novamente
- Também não parecia haver limite real para a expiração dos cookies, e era possível armazenar cookies com expiração superior a 10 anos
- Os dados dos cookies eram gravados em um arquivo dentro do diretório de instalação da Steam do jogador
- Com isso, foi possível atribuir a cada jogador um terceiro identificador chamado Tracking ID
- Para parecer um jogador novo, seria preciso trocar o Steam ID, o endereço IP e também a pasta de instalação da Steam, e a equipe considerava improvável que alguém trocasse até a pasta da Steam
Fluxo de implementação do IdentityLogger
- IdentityLogger é um sistema integrado que cria a impressão digital de jogadores com base em endereço IP, Steam ID e Tracking ID
- Quando o jogador entra no servidor, primeiro é feita uma verificação de banimento no banco de dados
- Endereço IP, Steam ID e Tracking ID são verificados
- Se já houver um banimento, o jogador é expulso do servidor e o novo identificador é vinculado ao banimento existente
- Para jogadores não banidos, o sistema abre uma página web secreta em uma janela oculta do navegador VGUI
- A requisição era autenticada com um valor secreto e, embora a requisição do navegador VGUI fosse criada no cliente, o tráfego era criptografado com HTTPS
- Um script PHP verifica se o cookie do Tracking ID já existe
- Se não existir, gera e salva um novo Tracking ID
- O Tracking ID é uma string aleatória alfanumérica de 64 caracteres, como
TeStsCOhZO1TQsumJkDUOdMMo13ReRLEngrQTg7S49LKT2rBvgPhauzSYbegscOT - No fim, o cookie é salvo no arquivo
vgui.browser.cookies.datdentro do diretório de instalação da Steam do jogador
- Steam ID, endereço IP e Tracking ID são armazenados no banco de dados toda vez que o jogador entra no servidor
- Esse banco de dados foi integrado a um painel web para investigação de impressões digitais dos jogadores pelos administradores e a um plugin SourceBans modificado, baseado em software de gerenciamento de banimentos para jogos baseados em Source
Como o sistema bloqueava a evasão de banimento
- Por exemplo, se um jogador se conectasse pela primeira vez com o endereço IP
198.51.100.1e o Steam IDSTEAM_1:1:1111, um Tracking ID novo seria gerado - Se esse jogador fosse banido por trapaça, endereço IP, Steam ID e Tracking ID seriam todos inseridos no banco de dados de banimentos
- Mais tarde, se o mesmo jogador se conectasse com o endereço IP
100.64.50.74e o Steam IDSTEAM_1:1:3333, o novo endereço IP e o novo Steam ID passariam na verificação inicial - Mas o Tracking ID já armazenado estaria ligado ao banimento anterior, então ele não passaria na verificação de banimento
- O sistema baniria imediatamente o jogador de novo e vincularia o novo endereço IP e o novo Steam ID ao banimento existente
- Depois disso, independentemente do endereço IP ou Steam ID usado, ele seria banido assim que entrasse por causa do mesmo Tracking ID
Resultados da implantação em 2017 e divulgação
- Após os testes, a Invex Gaming implantou o IdentityLogger em todos os seus servidores de CSGO em fevereiro de 2017
- Logo após a implantação, o número de trapaceiros banidos aumentou bastante
- Até alguns membros confiáveis e antigos da comunidade foram descobertos trapaceando em contas secretas
- Alguns trapaceiros chegaram a perguntar diretamente por que estavam sendo detectados por evasão de banimento mesmo após mudar Steam ID e endereço IP
- Outros operadores de servidor também demonstraram interesse no plugin, e em alguns casos até ofereceram dinheiro
- Como a técnica poderia ser contornada simplesmente apagando o arquivo de cookies se ficasse amplamente conhecida, a implementação foi mantida em segredo dentro da equipe de administração
- Esse método funcionou até outubro de 2017, quando a Valve removeu completamente o navegador VGUI no processo de reforçar a segurança do jogo
- Depois da remoção do navegador VGUI, a técnica foi divulgada e o plugin também foi publicado como open source
1 comentários
Comentários do Hacker News
No UT2004, dá para bloquear pelo GUID do jogador (hash da chave de CD) ou pelo IP, mas, depois que a Epic abandonou o jogo, surgiram muitos geradores de chaves, então o bloqueio por GUID ficou inútil; hoje em dia, também dá para usar VPN por 2 dólares, então o bloqueio por IP tem grandes limitações.
A principal solução que uso hoje é, além do bloqueio por IP, colocar no firewall todos os bancos de dados de sub-redes de VPN conhecidas para fazer bloqueio de VPN, além de uma técnica parecida de fingerprinting que varre a estrutura de certas pastas do sistema.
Ele foi feito para o Tremulous (um fork do ioquake3) porque as pessoas continuavam burlando bloqueios de IP, mas pode ser usado em outros jogos também. Não é meu projeto, mas conheço o autor e, se houver demanda, também daria para fazer um fork e ajustá-lo para um jogo específico ou para uso mais geral.
No schachtmeister2, também dá para usar heurísticas como
whois -10 "Hosting",whois -13 "VPN",whois +7 "residential".Adendo: vi que o repositório Git está retornando 502 e entrei em contato com o administrador.
Não jogo mais online porque meu nível já não acompanha, mas, quando tenho uns 30 minutos livres, ainda é divertido entrar rapidamente em uma partida contra a IA.
O dono do servidor permite conexões de contas non-Steam (cópias piratas), então não dá para depender de bloqueio por SteamID como no GUID do Unreal. Trocar um ID falsificado deve ficar em algum lugar profundo da pasta de instalação, então é um pouco chato, mas possível. O jogo é bastante popular no Norte da África, nos antigos países bálticos e regiões vizinhas, e no norte e oeste da Ásia; sem esses jogadores, o servidor ficaria vazio.
Por isso usamos tanto a cenoura quanto o chicote. Jogadores Steam recebem recarga quase instantânea, isenção de alguns recursos agressivos de automação/kick, apelido reservado e tag “VIP”. Pelo preço de algumas chaves de VPN, eles ganham uma vantagem legítima e a propriedade do jogo, e o custo único vai direto para a desenvolvedora. Ou também é possível conseguir de graça jogando pelo menos 1 partida por semana durante 5 semanas e entrando em contato com a equipe pelas redes sociais.
Do lado do chicote, não apenas expulsamos/bloqueamos; fazemos questão de tornar a experiência incômoda para mostrar que a pessoa realmente não é bem-vinda e para que ela não queira voltar. Coisas como desarmar e dar a pior arma, teleportar aleatoriamente para fora do mapa ou para ficar preso no chão, repetir
amx_rocketpara criar fogos de artifício, usaramx_drugpara aumentar o ângulo de visão ao máximo e aplicar efeito de embriaguez, ou zombar dizendo que é um loser sem habilidade que só se diverte quando uma IA joga por ele.Existem também plugins e comandos amx considerados “ilegais”; em geral, as pessoas evitam porque há grande potencial de abuso, mas em situações assim eles são úteis. Em especial,
amx_execé bem assustador, porque permite que um administrador acesse diretamente o console do jogo do cliente e execute comandos ou configurações arbitrárias.Por exemplo, com comandos como
rate 1000,name iCaNtAiM,unbind all,bind y quit,fps_max 50, dá para estragar a velocidade de rede, mudar o nome, apagar os atalhos de teclado, vincular a tecla padrão de chat a sair do jogo e reduzir o FPS máximo para um valor que não é gritante, mas é irritante. Restaurar os padrões é fácil apagando o arquivo de configuração, mas, se a pessoa não tiver backup das configurações, pode ser muito frustrante.Curiosamente, muitos servidores vendem vantagens VIP por até 20 dólares por mês. No começo fiquei chocado, mas descobri que existe uma espécie de cartel obscuro em que é preciso pagar um bom dinheiro para aparecer em uma posição razoável em navegadores de servidores de terceiros, e que uma parte considerável da receita vai para “boost”.
Quando o dono do nosso servidor parou de pagar pelo “boost” por dois meses, a média de jogadores caiu de 14/32 para 3/32, e o pico de jogadores, que normalmente chegava a 28/32 nos fins de semana, passou a ficar em 12/32 numa sexta à noite com sorte. Assim que ele voltou a pagar, o número de jogadores disparou; a parte absurda é que o custo é de 180 dólares por mês.
Antes de participar da administração, eu achava que um deathmatch divertido, boa moderação, baixa latência, servidor de alto desempenho e um remake/remix dedicado do segundo mapa mais popular do jogo seriam suficientes para ter bastante popularidade. Mas parece que, para ser visto pela maioria dos jogadores, é preciso pagar caro demais aos gatekeepers existentes.
É parecido com avisar a um web scraper que o IP dele foi bloqueado: essa estratégia não traz ganho nenhum. Uma abordagem melhor é marcar nos bastidores os IPs dos scrapers e entregar a eles apenas dados lixo misturados aleatoriamente às páginas.
Vejo a detecção de cheats da mesma forma. Ao bloquear, você só perde uma vantagem estratégica, e trocar IP, chave de CD ou conta é apenas um pequeno incômodo para o cheater.
É uma área que me interessa tanto profissionalmente quanto pessoalmente; se precisarem de sugestões, posso ajudar.
Gostei do fato de o autor ter usado um endereço TEST-NET-2 da RFC5737 como exemplo de IPv4: “An example of an IPv4 IP address is 198.51.100.1.”
https://www.rfc-editor.org/rfc/rfc5737
Em algum momento da carreira, quero muito trabalhar com anti-cheat exclusivamente do lado do servidor. Esse tipo de corrida armamentista adversarial parece muito divertido de pensar a fundo por bastante tempo
Como o número de jogadores é muito maior que o de desenvolvedores, é uma luta perdida
Mover todas as ações importantes para o servidor não é fácil nem barato, mas é uma forma mais abrangente de impedir cheats
Se você acrescenta a isso um jogo com muita simulação física, tickrate de 120 (talvez mais alto depois de testes adicionais), combate de ação baseado em controles precisos e a meta de escalar para o porte de um MMORPG, fica realmente difícil
Agora existem aimbots baseados em YOLO, então o mundo ficou muito mais complicado, e a conclusão realista é que anti-cheat inevitavelmente pode ser quebrado
Do lado do cliente, dá para criar binários privados cujos hashes não estejam registrados nos principais serviços de anti-cheat; do lado do servidor, só dá para ver o que é permitido pelas regras do jogo
Não há mecanismo para impedir tempos de reação sobre-humanos e, provavelmente, nem deveria haver, então passa a ser um problema sem solução
Por isso é preciso julgamento da comunidade, mas isso também é entediante. Em Counter-Strike, bons jogadores serem acusados de cheater é um problema antigo e, ao mesmo tempo, interessante
Alguns anos atrás comprei vários jogos Battlefield, mas vários deles eram injogáveis por causa de cheaters com speedhack e aimbot. Parecia algo fácil de detectar do lado do servidor, e eu ficava pensando por que ninguém fazia nada
Se o site estiver fora do ar ou lento e você quiser ler o texto, há uma captura de tela da página inteira: https://i.imgur.com/SPp6IHX.jpeg
Eu não esperava que o texto recebesse tanto tráfego
Este texto fala sobre impedir que cheaters já banidos voltem repetidamente por meio de evasão de ban, não sobre impedir cheaters, ou seja, detecção de cheats
Detecção de cheats é um jogo completamente diferente, especialmente hoje, com até cheats de hardware como DMA. Pessoalmente, acho que uma das formas mais eficazes de impedir evasores de ban é cobrar dinheiro de verdade pelo jogo
O pessoal de CS:GO não se importa muito mesmo quando uma conta com centenas de dólares em skins é banida. Isso porque compraram a conta roubada de outra pessoa por uns 5 dólares, ou porque já estão pagando 30 dólares por mês pelo serviço de cheat
Imagino que haja uma sobreposição enorme entre cheaters frequentes e baleias pay-to-win
Uma forma mais confiável de reduzir cheaters em um jogo é um honeypot para cheaters. Em vez de banir e depois tentar rastrear de novo o cheater que comprou outra conta, você simplesmente o coloca, silenciosamente, apenas em matchmaking com outros cheaters, bots feitos de propósito para irritar, atrasos falsos e coisas como ignorar teclas pressionadas de vez em quando
Se você estraga a diversão deles, eles param de estragar o jogo. Aí a guerra de informação se inverte: para saber se precisa comprar uma conta nova, ele primeiro precisa descobrir se está jogando regularmente com cheaters ou bots
Claro que, algum dia, se algum fornecedor descuidado vazar chaves de TPM, talvez seja possível falsificá-las
Jogadores de países grandes podem facilmente deixar passar o senso de comunidade que existe em países pequenos
Quando há apenas 3 ou 4 servidores de pessoas jogando todos os dias, todo mundo passa a se conhecer rapidamente, e isso acrescenta muito às piadas e à diversão
É muito melhor do que jogos com milhões de jogadores em que você nunca mais verá alguém com quem acabou de jogar uma partida. Pelo mesmo motivo, também gosto de jogos com servidores administrados pela comunidade
Eu acabava entrando sempre nos mesmos servidores dependendo de quem estava online e, principalmente, de quão boa era a minha conexão
O método de “se conectou com outro Steam ID, mas está usando um endereço IP já banido, então bane de novo” funciona bem só até você perceber que isso pune jogadores inocentes por causa de CGNAT e rotação de endereços IP
Cheaters geralmente sabem como fazer o roteador pedir um IP novo, e esse IP depois é atribuído a outra pessoa
Ainda assim, era bem raro, e ao longo de vários meses os relatos foram poucos. Se o servidor fosse mais popular, teríamos passado por isso com muito mais frequência
Se “compartilhei a solução e as técnicas apenas com outro operador de servidor no Reino Unido em quem confiava totalmente”, então provavelmente éramos nós
No fim, combinamos isso com outros sinais de fingerprinting, mas o método usando VGUI era surpreendentemente eficaz. Pelo que lembro, o navegador web foi removido por volta de 2018, o que foi uma pena. Era muito poderoso, porque dava para criar árvores de habilidades personalizadas integradas ao servidor ou integrações divertidas
A afirmação de que “o tráfego em si é criptografado com HTTPS, então não dá para encontrar o token bruto usando uma ferramenta de sniffing de pacotes como o Wireshark” ignora que, se o navegador embutido usava o proxy do sistema e a lista de certificados do sistema, é muito fácil descriptografar HTTPS com ferramentas como Fiddler ou Burp Suite
A requisição também fica escondida de forma comum entre outras requisições, e essas requisições são as esperadas. Normalmente uma requisição de MOTD obviamente existiria, então não parece suspeita
Numa situação em que o método de contorno é muito mais simples, como apagar um único arquivo local, isso funcionava bem o bastante em comparação a encontrar a requisição real e configurar o Fiddler ou o Burp Suite
Não é preciso projetar além do necessário
Dá para fazer em alguns cliques e, dependendo do TLS usado, talvez seja necessário fazer por conexão, mas não é tão difícil assim
Sei que “deveria ter patenteado” é uma piada, mas, se tivesse patenteado, teria que divulgar a técnica, e ela se tornaria inútil imediatamente
Ainda assim, isso não diminui em nada o texto em si. Foi uma leitura divertida