Analyse de la vulnérabilité de sécurité Lua de Factorio
Qu'est-ce que Factorio ?
- Factorio est un jeu dans lequel on automatise des usines pour fabriquer une fusée et s'échapper d'une planète
- Plus de 3 500 000 exemplaires du jeu ont été vendus, ce qui en fait une cible attrayante pour les chercheurs en sécurité
Comment Lua est utilisé dans le jeu
- Lua est utilisé pour implémenter la logique du jeu, ainsi que pour créer des mods et des cartes personnalisées
- La communauté du modding est très active, avec des milliers de mods disponibles
- Le mod Alien Biomes a enregistré 551K téléchargements
Exposition réseau de l'interpréteur Lua
- Le mode multijoueur de Factorio utilise un lockstep déterministe pour synchroniser les clients
- Lorsqu'un joueur exécute du code Lua, les autres joueurs doivent également exécuter le même code
- Cela ouvre la possibilité d'exécuter du code Lua malveillant via le réseau
Chemin d'exploitation habituel
- Héberger un serveur Factorio qui fournit une carte malveillante
- Quand un client se connecte au serveur, il télécharge la carte et exécute le code Lua
- Exploiter une faiblesse de l'implémentation Lua pour créer de faux objets
- Modifier le comportement du programme par fuite/corruption mémoire
- Utiliser ces primitives puissantes pour obtenir une exécution de code
Les risques du bytecode Lua
- Lua est un langage interprété : le code écrit n'est pas exécuté directement, il est compilé en bytecode
- Si le bytecode peut être exécuté directement, un bytecode malformé peut être utilisé pour provoquer des fuites ou des corruptions mémoire
Validateur de bytecode
- Les développeurs de Lua avaient implémenté un validateur de bytecode pour protéger l'interpréteur contre le bytecode malveillant, mais comme des contournements ont été découverts à répétition, il a été supprimé dans Lua 5.2
- Les développeurs de Factorio ont implémenté leur propre validateur de bytecode, mais il n'est pas parfait en raison de certains problèmes off-by-one
Création de faux objets
- En créant de faux objets, il devient possible d'exploiter toutes les fonctionnalités de l'interpréteur
- Les chaînes peuvent servir à divulguer des données arbitraires, et les tableaux à écrire dans une mémoire arbitraire
- S'il est possible d'appeler des fonctions natives, on peut contrôler le flux d'exécution
Fuite d'adresses
- La fonction
print de Lua peut divulguer des adresses
- Comme elle a été supprimée dans Factorio, une méthode de fuite d'adresses reposant sur une confusion de types est utilisée
Comprendre les TValues
- Lua est un langage dynamique, donc le type des variables peut changer à l'exécution
- En interne, Lua utilise la structure
TValue pour représenter les objets
TValue possède les propriétés type (tt_) et valeur (value_)
Confusion de types avec FORLOOP
- L'opcode FORLOOP peut provoquer une confusion de types en considérant la valeur initiale de la boucle comme un nombre
- Cela permet de divulguer des adresses
Double précision IEEE 754
- La double précision est composée d'un signe, d'un exposant et d'une mantisse
- Lua ne représente pas les entiers, ce qui permet de divulguer des adresses jusqu'à 53 bits sans perte de précision
Recherche de faux objets
- En comprenant les upvalues et les closures, il est possible de rechercher de faux objets
- Les upvalues permettent d'accéder aux variables d'une fonction externe
- En modifiant le bytecode pour changer l'index d'une upvalue, il est possible de rechercher de faux objets
L'avis de GN⁺
- Cet article est très utile pour comprendre les vulnérabilités de sécurité des langages dynamiques
- Il explique bien les problèmes de sécurité qui peuvent survenir dans un jeu populaire comme Factorio
- Des vulnérabilités similaires peuvent aussi exister dans d'autres projets utilisant des langages comme Lua
- Lorsqu'on adopte une nouvelle technologie ou un projet open source, une revue de sécurité est indispensable
- Parmi les autres projets dotés de fonctionnalités similaires, on peut citer le système de modding de Minecraft
Aucun commentaire pour le moment.