2 pontos por GN⁺ 2024-06-30 | Ainda não há comentários. | Compartilhar no WhatsApp

Análise da vulnerabilidade de segurança do Lua no Factorio

O que é Factorio?

  • Factorio é um jogo em que você automatiza fábricas para construir um foguete e escapar do planeta
  • Mais de 3.500.000 cópias do jogo foram vendidas, o que o torna um alvo atraente para pesquisadores de segurança

Como o Lua é usado no jogo

  • Lua é usado para implementar a lógica do jogo e para criar mods e mapas personalizados
  • A comunidade de modding é muito ativa, com milhares de mods disponíveis
  • O mod Alien Biomes registrou 551 mil downloads

Exposição do interpretador Lua à rede

  • O modo multijogador de Factorio usa deterministic lockstep para sincronizar os clientes
  • Se um jogador executar código Lua, os outros jogadores também precisam executar o mesmo código
  • Isso cria a possibilidade de executar código Lua malicioso pela rede

Caminho típico de exploração

  • Hospedar um servidor de Factorio que ofereça um mapa malicioso
  • Quando o cliente se conecta ao servidor, ele baixa o mapa e executa o código Lua
  • Explorar fragilidades na implementação do Lua para criar objetos falsos
  • Alterar o comportamento do programa por meio de vazamento/corrupção de memória
  • Usar esses primitivos poderosos para obter execução de código

O risco do bytecode Lua

  • Lua é uma linguagem interpretada: o código escrito não é executado diretamente, mas compilado em bytecode
  • Se for possível executar bytecode diretamente, é possível rodar bytecode inválido para vazar ou corromper memória

Verificador de bytecode

  • Os desenvolvedores do Lua implementaram um verificador de bytecode para proteger o interpretador contra bytecode malicioso, mas como repetidamente foram encontradas formas de contorná-lo, ele foi removido no Lua 5.2
  • Os desenvolvedores de Factorio implementaram seu próprio verificador de bytecode, mas ele não é perfeito devido a alguns problemas de off-by-one

Criação de objetos falsos

  • Ao criar objetos falsos, é possível aproveitar todas as funcionalidades do interpretador
  • Strings podem ser usadas para vazar dados arbitrários, e arrays permitem escrever em memória arbitrária
  • Se for possível chamar funções nativas, dá para controlar o fluxo de execução

Vazamento de endereços

  • A função print do Lua pode vazar endereços
  • Como ela foi removida no Factorio, usa-se confusão de tipos para vazar endereços

Entendendo TValues

  • Lua é uma linguagem dinâmica, então o tipo de uma variável pode mudar durante a execução
  • Internamente, o Lua usa a estrutura TValue para representar objetos
  • TValue possui os atributos de tipo (tt_) e valor (value_)

Confusão de tipos com FORLOOP

  • O opcode FORLOOP pode causar confusão de tipos ao tratar o valor inicial do loop como número
  • Isso permite vazar endereços

Precisão dupla IEEE 754

  • A precisão dupla é composta por sinal, expoente e mantissa
  • Como o Lua não representa inteiros, é possível vazar endereços de até 53 bits sem perda de precisão

Busca por objetos falsos

  • É possível procurar objetos falsos entendendo Upvalues e Closures
  • Upvalues permitem acessar variáveis de funções externas
  • Ao modificar o bytecode para alterar o índice de um Upvalue, é possível localizar objetos falsos

Opinião do GN⁺

  • Este texto é muito útil para entender vulnerabilidades de segurança em linguagens dinâmicas
  • Ele explica bem os problemas de segurança que podem surgir em jogos populares como Factorio
  • Vulnerabilidades semelhantes podem existir em outros projetos que usam linguagens como Lua
  • Ao adotar novas tecnologias ou open source, uma revisão de segurança é indispensável
  • Um projeto semelhante em funcionalidade é o sistema de mods do Minecraft

Ainda não há comentários.

Ainda não há comentários.