- 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
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
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
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
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
O verdadeiro bug é que concluir a autenticação não é uma condição obrigatória para iniciar um multiplayer que não seja LAN
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...
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
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?
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çaMesmo assim, a Valve realmente precisa atualizar essa parte
Ainda assim, concordo com a conclusão, e ela faz sentido