2 pontos por GN⁺ 2024-01-15 | 1 comentários | Compartilhar no WhatsApp

When Random Isn't

  • Trata-se de uma história de cerca de 10 anos atrás, então peço compreensão por haver partes de que não me lembro com exatidão, já que perdi o código original.
  • Alguns detalhes foram simplificados para que qualquer pessoa interessada em segurança de computadores possa aproveitar.
  • Aos 14 anos, descobri World of Warcraft e fiquei viciado.
  • Descobri os add-ons que permitiam modificar a interface do usuário do jogo e comecei a criar os meus.
  • Os add-ons, feitos na linguagem de programação Lua, eram compostos por alguns arquivos-fonte .lua.
  • Fiquei fascinado pelo fato de o jogo carregar e executar código-fonte que eu mesmo escrevia.

Segurança dos add-ons

  • Ter add-ons programáveis pelo usuário pode parecer uma má ideia, porque isso poderia levar a bots.
  • O sistema criado pela Blizzard era bastante inteligente para impedir comportamentos de programação arbitrários.
  • A maioria dos elementos da UI era puramente decorativa ou informativa, sem praticamente nenhuma restrição.
  • APIs de coleta de informações, como a chamada que exibe a vida do personagem, não tinham restrições.
  • Porém, algumas chamadas de API eram protegidas para que só pudessem ser invocadas pelo código oficial da Blizzard.
  • A maior parte das APIs relacionadas a executar ações reais dentro do jogo era protegida.
  • Em algum momento, até a API para obter a posição no mundo e a direção da câmera passou a ser protegida.
  • Quando se queria criar um botão para lançar uma magia específica, era possível criar um botão especial que executava código em um ambiente seguro ao ser clicado.
  • Esses botões não podiam ser criados, destruídos ou movidos durante o combate, o que impedia automação em batalha.
  • O ambiente seguro permitia definir programaticamente qual magia lançar, mas não permitia a coleta de informações necessária para automação arbitrária.

Um canal de backdoor

  • Alguns anos depois, ao me interessar por programação mais "séria", quase deixei de jogar World of Warcraft.
  • Mesmo assim, continuei com vontade de neutralizar o ambiente seguro.
  • Em vez de usar software de terceiros, eu queria resolver isso como um desafio, usando apenas ferramentas tecnicamente permitidas.
  • Descobri que a função random estava na lista de funções permitidas no ambiente seguro e bolei uma forma de contrabandear informações por meio dela.

Problemas com geradores de números aleatórios

  • Descobriu-se que random era apenas um wrapper simples para a função rand da linguagem C.
  • A implementação de rand era um gerador congruencial linear simples e fraco.
  • Desenvolvi um método para fazer engenharia reversa do estado interno do RNG e usar isso para transmitir informações.

Juntando tudo

  • Depois de conseguir fazer engenharia reversa do estado interno do RNG, tornou-se possível tomar decisões arbitrárias de automação dentro do ambiente seguro.
  • Eu acessava informações no ambiente inseguro para tomar decisões e, no ambiente seguro, executava a ação escolhida de forma "aleatória".

Conclusão

  • Não sei quando a Blizzard corrigiu o problema de o estado do RNG ser fraco e compartilhado, nem se chegou a perceber que isso era um problema.
  • Quando tentei rodar o código novamente alguns anos depois, ele já não funcionava.
  • Era só uma brecha em um videogame que eu nem queria usar de verdade, mas havia algo quase mágico em manipular aquilo que parecia aleatório.

Opinião do GN⁺

  • Este texto oferece um caso interessante sobre segurança de computadores e programação.
  • O processo de explorar uma forma criativa de contornar a segurança dentro do jogo reforça a importância das habilidades de programação e da conscientização sobre vulnerabilidades potenciais.
  • A história de explorar a fraqueza do RNG é um exemplo instrutivo que relembra aos desenvolvedores de software a importância da segurança e dos algoritmos.

1 comentários

 
GN⁺ 2024-01-15
Comentários do Hacker News
  • Um usuário menciona que respondeu, alguns meses atrás, a uma pergunta no StackOverflow sobre "inverter um RNG (gerador de números aleatórios)". Ele atacou o RNG do Java, que usa um design de LCG (gerador congruencial linear) semelhante ao RNG do MSVC, produzindo uma saída com truncamento do estado interno, então o método de ataque é muito parecido.

    • Compartilha a experiência de ter respondido a uma pergunta semelhante sobre "inversão de RNG" no StackOverflow. Tanto o RNG do Java quanto o do MSVC usam um design LCG, o que permite ataques semelhantes.
  • Outro usuário especula que, se o servidor estiver usando o mesmo RNG, isso poderia teoricamente ser explorado caso se tenha um servidor com baixa utilização, baixo ping, a capacidade de obter uma janela precisa do estado atual do RNG e a capacidade de gerar rapidamente outros eventos com alta volatilidade econômica.

    • Especula sobre a possibilidade de explorar isso sob certas condições, caso o servidor use o mesmo RNG.
  • Outro usuário aponta que o RNG congruencial linear em questão gera apenas 12445 números distintos antes de se repetir, e comenta que faria sentido usar parâmetros melhores para esse algoritmo.

    • Aponta o problema de o RNG congruencial linear gerar um conjunto limitado de números e depois se repetir, destacando a necessidade de melhorar o algoritmo.
  • Um usuário diz que World of Warcraft (WoW) foi o que despertou seu interesse por programação: o jogo foi lançado quando ele tinha 6 anos, e, quando surgiram servidores privados, ele passou a se interessar por como criar seus próprios NPCs. Com isso, aprendeu Lua, como compilar o core de servidores privados, SVN, como aplicar patches etc.

    • Compartilha a experiência de como WoW despertou seu interesse por programação. Aprendeu habilidades de programação por meio de servidores privados e do estudo de Lua.
  • Um usuário compartilha uma citação de John von Neumann dizendo que todo método de gerar números aleatórios é pecado, e argumenta que um procedimento aritmético estrito não é um método de geração de números aleatórios.

    • Cita a visão de John von Neumann sobre geração de números aleatórios. Enfatiza que um procedimento aritmético estrito não é um método de geração de aleatoriedade.
  • Um usuário diz que escreveu um script para a casa de leilões de WoW, que escaneava todos os leilões para comprar itens subvalorizados e recolocá-los à venda. Se alguém baixasse o preço, o script podia cancelar e republicar o item por um valor um pouco menor.

    • Compartilha a experiência de obter ouro infinito usando um script na casa de leilões de WoW.
  • Há um usuário que menciona um caso em que o Hacker News foi hackeado por causa de números aleatórios fracos. Ele fornece um link relacionado.

    • Menciona um caso em que o Hacker News foi hackeado devido a números aleatórios fracos, apontando um problema de segurança.
  • Há um usuário que usa a expressão "quando variáveis não variam e constantes não são constantes".

    • Usa uma expressão satírica sobre o papel de variáveis e constantes na programação.
  • Um usuário que não jogou WoW, mas ouviu que muitos addons usavam chat privado como meio de comunicação, comenta que, se existir uma forma, as pessoas inevitavelmente a encontrarão e a usarão.

    • Diz ter ouvido que addons de WoW usavam chat privado como meio de comunicação, e opina que as pessoas acabam encontrando e usando qualquer método de comunicação disponível.
  • Sobre os incentivos econômicos ligados ao RNG, um usuário comenta que, quando não há nada realmente em jogo (por exemplo, em jogos), até um RNG imperfeito pode ser suficiente. Mas, quando há dinheiro envolvido ou a segurança é importante (como em carteiras de criptomoedas ou cassinos online), a qualidade do RNG se torna crucial.

    • Aponta que, em situações pouco críticas como jogos, um RNG imperfeito pode bastar, mas, quando valor financeiro ou segurança entram em cena, a qualidade do RNG é extremamente importante.