1 pontos por GN⁺ 2024-01-14 | 1 comentários | Compartilhar no WhatsApp
  • A antiga desconexão No user logon de Counter-Strike também pode ser reproduzida no CS2, e se você se conectar ao servidor rápido demais logo após iniciar o jogo, a validação do Steam ID pode nem começar
  • O ponto central é que, durante a inicialização do CS2.exe, o loop levelload é encerrado cedo demais antes de concluir a validação Steam3, e o servidor processa a conexão com um Steam ID ainda não validado
  • Nos logs da Esportal, até usuários normais tiveram STEAM USERID validated registrado cerca de 1 minuto e 20 segundos após a conexão, enquanto usuários com falha eram desconectados 2 a 3 minutos depois com failure code 8 em STEAMAUTH e NETWORK_DISCONNECT_STEAM_LOGON
  • Reinstalar o jogo, verificar arquivos, reiniciar o Steam, reiniciar o PC e desativar o Wi‑Fi não corrigem a causa raiz; é preciso abrir o CS2 primeiro e esperar de 5 a 10 segundos no menu principal
  • A Esportal corrigiu em 10 de janeiro de 2024 o comportamento de executar steam://connect/<IP>:<Port> antes de o CS2.exe estar totalmente inicializado, e depois disso a proporção de tickets relacionados caiu para 0%

O problema No user logon repetido por anos

  • A desconexão No user logon de Counter-Strike é conhecida como um problema que ocorre aleatoriamente durante a partida, e foi relatada repetidamente em vários fóruns e no fórum oficial de suporte da Valve entre 2008 e 2023
  • No user logon e No steam logon, visto em alguns posts, podem tecnicamente ser nomes diferentes para a mesma causa raiz
  • As soluções amplamente difundidas na internet não corrigem a causa raiz
    • reinstalar o jogo
    • verificar os arquivos do jogo
    • reiniciar o Steam
    • reiniciar o computador
    • desativar o Wi‑Fi
  • O CS2 substituiu o CS:GO em 27 de setembro de 2023, e usuários comuns não puderam mais jogar CS:GO
  • O escopo de bug bounty do HackerOne da Valve não incluía cs2.exe, e relatórios do CS2 Limited Test também apareciam como fora de escopo

Aumento repentino de relatos na Esportal

  • A Esportal já havia enfrentado esse problema no CS:GO no passado, e o primeiro caso registrado foi em 2019-11-15 19:15:32 CET, enquanto a última ocorrência em CS:GO foi em 2023-09-26 21:38:01 CET, um dia antes da substituição pelo CS2
  • No início do CS2, o problema parecia ter desaparecido, mas os relatos dos usuários aumentaram na primeira semana de janeiro de 2024
    • 2024-01-03: 6% dos tickets do dia
    • 2024-01-05~06: 18%
    • 2024-01-07: 23%
    • 2024-01-08: 10%
    • 2024-01-09: 9%
  • Os relatos se concentravam principalmente entre 13h e 17h CET, o que corresponde a 04h~08h no horário de Washington, onde a Valve está localizada
  • Antes, os relatos se distribuíam de forma relativamente uniforme ao longo do dia, mas o problema recém-observado se concentrava em horários específicos
  • Jogadores fora da Esportal também sofriam o mesmo problema, então não era algo exclusivo de uma plataforma específica

Sintomas: validação lenta do Steam e skins desaparecendo

  • O erro observado No user logon acontecia 2 a 3 minutos depois de o jogador entrar no servidor, e esse intervalo era bastante consistente
  • Um colega disse: “por alguns minutos depois de entrar no jogo, as skins não aparecem no CS2”, e jogadores fora da Esportal também relataram skins ausentes
  • Como as skins estão ligadas à propriedade do Steam ID, a ausência de skins pessoais antes de aparecerem sugere que o jogador talvez ainda não tivesse sido autenticado corretamente pelo Steam
  • Em logs de usuários normais, STEAM USERID validated era registrado cerca de 1 minuto e 20 segundos após a conexão
16:39:55: "Alice<1><>" connected
16:41:14: "Alice<1><>" STEAM USERID validated
17:17:32: "Alice<1><CT>" disconnected (reason "NETWORK_DISCONNECT_DISCONNECT_BY_USER")
  • Em logs antigos anteriores a 3 de janeiro de 2024, a validação do Steam era concluída em 2 a 3 segundos após a conexão
  • Durante a noite em Washington, era possível reproduzir o problema diretamente; durante o dia em Washington, não era

NETWORK_DISCONNECT_STEAM_LOGON e failure code 8

  • Nos logs de usuários com falha, a conexão era encerrada com NETWORK_DISCONNECT_STEAM_LOGON logo após STEAMAUTH: Client Bob received failure code 8
16:40:13: "Bob<6><>" connected
16:43:02: STEAMAUTH: Client Bob received failure code 8
16:43:02: "Bob<6><TERRORIST>" disconnected (reason "NETWORK_DISCONNECT_STEAM_LOGON")
  • NETWORK_DISCONNECT_STEAM_LOGON parece ser o identificador interno da mensagem No user logon vista pelo usuário
  • A string STEAMAUTH: Client %s received failure code %d foi encontrada em libengine2.so, e os resultados foram comparados com sv_steamauth.cpp do código-fonte vazado de CS:GO e com o trabalho de engenharia reversa
  • A função relacionada no CS2 desconecta o cliente de acordo com o valor de eAuthSessionResponse
    • 1: k_EAuthSessionResponseUserNotConnectedToSteam
    • 7: k_EAuthSessionResponseAuthTicketInvalidAlreadyUsed
    • 8: k_EAuthSessionResponseAuthTicketInvalid
  • O failure code 8 aparentemente corresponde a k_EAuthSessionResponseAuthTicketInvalid, exibido quando a validação Steam3 falha

Fluxo de validação Steam3

  • O cliente de jogo CS2.exe envia seu próprio Steam ID ao se conectar ao servidor do jogo
  • O servidor do jogo então consulta os servidores Steam3 para verificar se esse Steam ID é válido e se a conta possui o jogo
  • Enquanto espera a resposta da validação, o jogador ainda pode continuar jogando no servidor, mas skins pessoais podem não aparecer
  • Se o servidor Steam3 responder “yes”, o servidor do jogo confia nessa informação e pode aplicar dados pessoais como skins
  • Se o servidor Steam3 responder “no”, o servidor do jogo desconecta o cliente com NETWORK_DISCONNECT_STEAM_LOGON
  • Durante a noite em Washington, quando as respostas do Steam3 ficavam lentas, a validação levava cerca de 1 minuto e 20 segundos para ser concluída

Verificação de confiança do CS2.exe e o cliente Steam

  • O simples fato de um Steam ID ser válido não prova que aquela instância de CS2.exe seja realmente o jogo da conta Steam conectada na mesma máquina
  • O CS2.exe precisa se comunicar com o Steam.exe da mesma máquina para confirmar que o Steam ID enviado corresponde à conta Steam atualmente conectada
  • Quando o Steam.exe confirma essa correspondência, os servidores Steam3 armazenam temporariamente a informação de que aquele Steam ID é válido para o CS2
  • Entre as possíveis razões para o Steam3 responder “no”, as duas mais próximas do problema real foram reduzidas a estas
    • a instância de CS2.exe não é confiável
    • o servidor Steam3 ainda não conhece a informação de Steam ID daquela instância de CS2.exe

Pista no lado do cliente: NETWORK_DISCONNECT_LOOPSHUTDOWN

  • Nos logs de falha, NETWORK_DISCONNECT_LOOPSHUTDOWN aparece antes de NETWORK_DISCONNECT_STEAM_LOGON
16:40:03: "Bob<6><>" connected
16:40:08: "Bob<6><Unassigned>" disconnected (reason "NETWORK_DISCONNECT_LOOPSHUTDOWN")
16:40:13: "Bob<6><>" connected
16:43:02: STEAMAUTH: Client Bob received failure code 8
16:43:02: "Bob<6><TERRORIST>" disconnected (reason "NETWORK_DISCONNECT_STEAM_LOGON")
  • Depois de NETWORK_DISCONNECT_LOOPSHUTDOWN, o jogo tenta se reconectar automaticamente após 5 segundos
  • Essa primeira desconexão não é iniciada pelo servidor do jogo, mas pelo próprio CS2.exe
  • Portanto, a causa raiz estava no cliente do jogo, não no servidor

O loop levelload do Source 2 e a ordem de inicialização

  • O motor Source 2 executa apenas um loop ativo por vez, e esse loop repete processamento de tarefas em segundo plano e entrada do usuário até que um objetivo específico seja concluído
  • O loop executado por último após a inicialização do CS2.exe é o loop game, responsável pela interação real do menu e pela jogabilidade
  • Na saída do console, o estado de autenticação do Steam aparece como OK imediatamente antes da transição para o loop game
[SteamNetSockets] AuthStatus (steamid:<redacted>):  OK  (OK)
[Client] CL:  CLoopModeLevelLoad::MaybeSwitchToGameLoop switching to "game" loopmode with addons ()
[EngineServiceManager] SwitchToLoop game requested:  id [1] addons []
  • levelload é o loop de inicialização executado quando o CS2 começa, e aparentemente carrega as telas iniciais, como o vídeo de introdução e o menu principal, mesmo que não seja um mapa de jogo real
  • Uma das últimas tarefas de levelload é iniciar a validação Steam3 a partir do CS2.exe, passando pelo Steam.exe

Causa direta do bug

  • O CS2 só pode ser considerado totalmente inicializado depois que o loop levelload termina com sucesso
  • Se a inicialização de levelload for encerrada antes de terminar, a validação Steam3 não começa
  • Nessa situação, a instância de CS2.exe fica quebrada e não se recupera até que o CS2 seja reiniciado novamente
  • O fluxo do bug é o seguinte
    • CS2.exe inicia
    • o loop levelload começa
    • levelload é encerrado antes de iniciar a validação Steam3
    • o loop game conecta ao servidor do jogo com um Steam ID ainda não validado
    • o servidor do jogo consulta o Steam3
    • até cerca de 2 minutos e 50 segundos depois, recebe uma resposta de falha e desconecta com No user logon
  • Embora o texto trate do problema com base no exemplo e nos nomes do CS2, há um bug equivalente também em CS:GO e Counter-Strike: Source, mudando apenas os nomes técnicos e o modo de funcionamento

Formas de conexão que disparam o bug

  • O problema é uma race condition relacionada à forma como o CS2 é iniciado
  • A maneira de quase certamente disparar o bug é conectar diretamente a um servidor de jogo quando o CS2 ainda não está aberto
  • Formas arriscadas de conexão incluem
    • conectar a um servidor a partir de um navegador de servidores externo enquanto o CS2 não está rodando ou acabou de iniciar
    • entrar no jogo de um amigo pela lista de amigos da Steam enquanto o CS2 não está rodando ou acabou de iniciar
    • conectar diretamente de fora usando o protocolo de navegador Steam, como steam://connect/127.0.0.1:27015
  • Se essas ações forem feitas antes de o CS2 terminar a inicialização completa, a chance de o problema ocorrer aumenta
  • A proporção das causas foi resumida com a analogia: “90% forma de iniciar o Counter-Strike, 3% velocidade do computador, 3% velocidade do usuário, 3% fase da lua, 1% problema real de configuração do usuário”

Como realmente resolver

  • O que não fazer
    • reinstalar o jogo
    • verificar os arquivos do jogo
    • reiniciar o Steam
    • reiniciar o computador
    • desativar o Wi‑Fi
    • conectar a um servidor de jogo externamente antes de o CS2 iniciar
  • Em vez disso, abra o CS2 primeiro e espere o tempo suficiente antes de entrar no servidor
  • A referência é esperar até que o console do jogo esteja disponível, ou aguardar 5 a 10 segundos depois que o vídeo de introdução aparecer
  • Para confirmar com certeza, depois de iniciar o CS2 digite status no console do jogo e verifique a linha abaixo
[EngineServiceManager] @ Current  :  game

Resultado da correção na Esportal

  • O motivo de o usuário com falha Bob ter conseguido validar com sucesso 9 minutos depois na segunda tentativa é que ele reiniciou o CS2 e, dessa vez, o bug não ocorreu por azar
  • Depois que um Steam ID é validado uma vez, ele não falha mais naquela mesma instância do jogo, a menos que o cliente Steam seja fechado
  • Até 10 de janeiro de 2024, a Esportal fazia a conexão com o servidor de matchmaking via steam://connect/<IP>:<Port> assim que o processo CS2.exe surgia, mesmo antes da inicialização completa
  • Depois de corrigir esse comportamento e distribuir a mudança para todos os jogadores da Esportal, os tickets relacionados pararam
  • A proporção de tickets diários de No user logon chegou a 23% em 2024-01-07, mas caiu para 0% de 2024-01-10 a 2024-01-12

1 comentários

 
GN⁺ 2024-01-14
Comentários do Hacker News
  • O fluxo do diagrama está mais próximo do que a Steam chama de Session Tickets, e na prática é um pouco mais sutil
    O cliente do jogo solicita um ticket de sessão aos servidores da Steam e depois entrega ao servidor do jogo um ticket que prova que ele é um determinado Steam ID
    Em seguida, o servidor do jogo precisa validar online pela Web API da Steam se esse ticket foi usado várias vezes ou adulterado
    Parece que o cliente de CS2 não consegue lidar corretamente com a resposta atrasada no processo de obtenção do ticket de sessão
    O fluxo está detalhado aqui: https://partner.steamgames.com/doc/features/auth#3
    Se funcionasse como no diagrama do texto, seria bem preocupante, porque um atacante poderia disputar a entrada no servidor usando o Steam ID da vítima

    • Sim, no geral provavelmente se trata de tickets de sessão, e o texto aparentemente não deixou isso claro
      O problema parece estar no fato de o jogo ser interrompido antes de realmente criar o ticket de sessão, ou enquanto espera uma resposta lenta dos servidores da Steam, e acabar se conectando ao servidor do jogo sem ticket
    • Sim, tecnicamente esse fluxo está correto, e achei que isso não era tão importante para a explicação do problema, mas concordo que deveria ter sido dito com mais clareza
  • O texto é excelente, mas o rastreamento e a conclusão não se encaixam perfeitamente
    Dizer “como o Counter-Strike inicia: 90% da responsabilidade” e ao mesmo tempo dizer que jogadores do mundo todo tiveram o mesmo problema também fora do Esportal e que isso foi confirmado por causa da manutenção da madrugada em Washington são coisas difíceis de conciliar
    Se 90% da responsabilidade fosse o modo de inicialização, o problema não estaria distribuído pelos horários de manutenção
    O ponto central parece ser “a validação do Steam ID começa logo antes do loop do jogo iniciar” e “se a inicialização de levelload não terminar, a validação Steam3 não começa porque essa é a etapa final”
    Ou seja, se os servidores steam3 ficarem muito lentos no horário de manutenção, esse processo se alonga, e nesse intervalo aumenta a chance de iniciar o jogo e interromper o loop
    Então “como o Counter-Strike inicia” também está certo, mas uma frase como “o estado da lua: 3% da responsabilidade” na prática está apontando para o horário de manutenção, então fica um pouco desalinhada
    Seria bom incluir também um conselho como “entre 13h e 17h CET, que é o horário de manutenção da Valve, espere alguns minutos a mais”
    De qualquer forma, já passei por esse problema, e a solução de “esperar um pouco para o carregamento terminar” é a mais prática e razoável que já ouvi até agora

    • Há lacunas nos detalhes da explicação e da conclusão, mas também é difícil ter certeza de que essa interpretação esteja totalmente correta
      Em CS:GO o mesmo problema existia mesmo fora do horário de manutenção, e em CS2 ele só foi observado no horário de manutenção
      No fim, os bugs de CS:GO e CS2 podem ter tido naturezas diferentes, mas como CS:GO foi substituído por CS2, já não há mais como provar isso
  • Muito tempo atrás, antes de existir Steam, eu fiz uma ferramenta que mostrava a lista de jogadores ativos e pontuações para que fosse possível ver em qual servidor um amigo entrou e entrar direto em seguida
    Enquanto fazia essa ferramenta, enviei um pacote inválido por engano para um servidor em teste e o servidor caiu
    Ainda tenho o código-fonte escrito em Delphi, e se bugs de 10 anos atrás ainda continuam aí, fico curioso se isso ainda hoje conseguiria derrubar servidores

    • Dá para testar? :D
  • O verdadeiro bug é que concluir a autenticação não é uma condição obrigatória para iniciar um multiplayer que não seja LAN

    • Ou então o problema é o fluxo de validação do ticket de sessão depender da conexão entre o servidor do jogo e os servidores de autenticação da Valve. Esses servidores de autenticação parecem ser muito lentos às vezes
      Uma forma mais rápida e robusta talvez fosse o cliente Steam obter e guardar da Valve um token assinado com validade de algumas horas, e enviar esse token sempre que se conectasse a um servidor de jogo
      O servidor de jogo poderia validá-lo localmente com um certificado público emitido pela Valve e distribuído junto com o conteúdo do servidor
  • Alguns parágrafos passam uma sensação de “chapéu em cima de chapéu”
    Você já tem parágrafos meio meméticos, e ainda empilha sarcasmo por cima, então algo que funcionaria melhor com mais sutileza acaba parecendo exagerado
    Como outras pessoas disseram, seria melhor ir ao ponto mais rápido

  • Foi uma leitura muito divertida. Fico curioso se daria para investigar quedas repentinas do cliente do jogo da mesma forma
    Queria saber se a verificação de integridade do executável também roda durante a execução e se, quando uma delas falha em tempo de execução, aparece alguma outra mensagem de desconexão
    Parece o tipo de coisa que mereceria recompensa, como aquele texto que analisou por que o tempo de carregamento do GTA V era tão longo: https://nee.lv/2021/02/28/How-I-cut-GTA-Online-loading-times...

    • Fico curioso sobre a quais quedas repentinas você está se referindo
      Em teoria dá para investigar crashes, mas a Valve não salva relatórios de crash no disco, ela os envia ao servidor
      Se você não conseguir capturá-los em tempo real com um depurador acoplado, a análise fica mais difícil e, por causa do VAC, é complicado, mas não impossível. Basta desativar o VAC
  • Colocar no começo do texto um resumo para quem chegou pesquisando pela solução do problema parece atencioso
    Mas logo em seguida você diz “o que não fazer”, e a ação prática que a pessoa realmente pode tomar acaba escondida numa frase no meio de um texto quilométrico
    Seria melhor colocar a solução alternativa no resumo

    • Parece quase uma piada cruel. Resumo: não faça isso; em vez disso, leia o texto inteiro!
    • “Texto quilométrico”, em unidade de medida, dá algo como apertar Page Down umas 25 vezes; em unidade livre, algo na escala de CTRL+F
    • Justo, então editei para um resumo melhor
  • Estou falando isso porque tenho na cabeça uma preferência por escrita no estilo Strunk and White, então ignore se quiser
    Se você quiser feedback, eu recomendaria uma edição pesada para deixar o texto muito mais direto e conciso
    Dá para escrever textos longos, mas depois de alguns minutos as explicações extras e as anedotas foram se acumulando e eu perdi o fio principal bem rápido
    Quando ainda entra uma imagem de referência a Inception, fica mais a sensação de um monte de coisas não relacionadas juntas do que de um texto informativo
    Pense no que você quer dizer, diga isso, e depois volte e confira se realmente disse só isso
    O resto fica mais perto de treino de digitação do que de escrita. Se você tem 3 ou 4 coisas para dizer, simplesmente diga só essas coisas

  • O texto foi ótimo, mas ainda sobraram algumas perguntas
    O levelloadloop só roda ao iniciar o jogo, e não ao entrar num servidor e carregar um mapa?
    Se o problema é o loop terminar antes de o processo de autenticação da Steam começar, então por que a lentidão causada pela manutenção se torna importante?

    • A primeira está certa, ele só roda ao iniciar o jogo
      Esse nome de loop parece estar ligado a jogos single-player como Portal, onde os níveis mudam sem interrupção, então esse nome faz bem mais sentido nesse contexto
      Quanto à segunda, é verdade que há uma lacuna na explicação e eu não sei a resposta
      Mas é certo que esse método corrige o problema. É bem possível que os detalhes da conclusão estejam incompletos, mas por enquanto não sinto necessidade de investigar mais a fundo
  • O texto do programa de recompensas da Valve diz que inclui “a plataforma Steam e jogos atuais desenvolvidos e publicados pela Valve”
    Também diz que, a partir de 14 de junho de 2023 às 10h PDT, novos relatórios de CS:GO estão fora do escopo, e relatos sobre o CS2 Limited Test também estão atualmente fora do escopo
    A Valve realmente é fraca em segurança, mas lendo a descrição completa no HackerOne de forma mais ampla, pessoalmente eu consideraria isso dentro do escopo
    Eles não atualizaram a aba “Scope” para excluir csgo.exe, então isso por si só já não inspira muita confiança
    Mesmo assim, a Valve realmente precisa atualizar essa parte

    • Não tem como saber, porque a Valve nem responde a um pedido simples perguntando se isso está no escopo
      Ainda assim, concordo com a conclusão, e ela faz sentido