Análisis de la vulnerabilidad de seguridad de Lua en Factorio
¿Qué es Factorio?
- Factorio es un juego en el que automatizas fábricas para construir un cohete y escapar del planeta
- Se han vendido más de 3,500,000 copias del juego, lo que lo convierte en un objetivo atractivo para investigadores de seguridad
Cómo se usa Lua en el juego
- Lua se usa para implementar la lógica del juego y para crear mods y mapas personalizados
- La comunidad de modding es muy activa y existen miles de mods
- El mod Alien Biomes registra 551K descargas
Exposición del intérprete de Lua a la red
- El modo multijugador de Factorio usa lockstep determinista para sincronizar a los clientes
- Si un jugador ejecuta código Lua, los demás jugadores también deben ejecutar el mismo código
- Esto abre la posibilidad de ejecutar código Lua malicioso a través de la red
Ruta de explotación típica
- Se aloja un servidor de Factorio que ofrece un mapa malicioso
- Cuando el cliente se conecta al servidor, descarga el mapa y ejecuta código Lua
- Se aprovechan debilidades en la implementación de Lua para crear objetos falsos
- Se altera el comportamiento del programa mediante filtración/corrupción de memoria
- Con estas primitivas potentes se logra ejecución de código
Los riesgos del bytecode de Lua
- Lua es un lenguaje interpretado: el código escrito no se ejecuta directamente, sino que se compila a bytecode
- Si se puede ejecutar bytecode directamente, es posible correr bytecode malformado para filtrar o corromper memoria
Validador de bytecode
- Los desarrolladores de Lua implementaron un validador de bytecode para proteger el intérprete de bytecode malicioso, pero se descubrió repetidamente que podía eludirse, por lo que fue eliminado en Lua 5.2
- Los desarrolladores de Factorio implementaron su propio validador de bytecode, pero no es perfecto debido a algunos problemas de off-by-one
Creación de objetos falsos
- Al crear objetos falsos, se puede aprovechar toda la funcionalidad del intérprete
- Se pueden usar cadenas para filtrar datos arbitrarios y arreglos para escribir en memoria arbitraria
- Si se pueden invocar funciones nativas, es posible controlar el flujo de ejecución
Filtración de direcciones
- La función
print de Lua puede filtrar direcciones
- Como fue eliminada en Factorio, se usa confusión de tipos para filtrar direcciones
Entender los TValues
- Lua es un lenguaje dinámico, por lo que el tipo de una variable puede cambiar durante la ejecución
- Internamente, Lua usa la estructura
TValue para representar objetos
TValue tiene las propiedades tipo (tt_) y valor (value_)
Confusión de tipos con FORLOOP
- El opcode
FORLOOP puede provocar confusión de tipos al asumir que el valor inicial del bucle es un número
- Esto permite filtrar direcciones
Doble precisión IEEE 754
- La doble precisión se compone de signo, exponente y mantisa
- Como Lua no representa enteros, se pueden filtrar direcciones de hasta 53 bits sin pérdida de precisión
Búsqueda de objetos falsos
- Es posible buscar objetos falsos entendiendo los Upvalues y los Closures
- Los Upvalues permiten acceder a variables de una función externa
- Si se modifica el bytecode para cambiar el índice de un Upvalue, se pueden buscar objetos falsos
La opinión de GN⁺
- Este artículo es muy útil para entender vulnerabilidades de seguridad en lenguajes dinámicos
- Explica bien los problemas de seguridad que pueden surgir en un juego popular como Factorio
- Vulnerabilidades similares podrían existir en otros proyectos que usan lenguajes como Lua
- Al adoptar nuevas tecnologías o software de código abierto, una revisión de seguridad es indispensable
- Un proyecto similar con funcionalidades parecidas es el sistema de mods de Minecraft
Aún no hay comentarios.