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.