Analyse der Lua-Sicherheitslücke in Factorio
Was ist Factorio?
- Factorio ist ein Spiel, in dem man Fabriken automatisiert, um eine Rakete zu bauen und dem Planeten zu entkommen
- Es wurden mehr als 3.500.000 Exemplare des Spiels verkauft, was es zu einem attraktiven Ziel für Sicherheitsforscher macht
Wie Lua im Spiel verwendet wird
- Lua wird verwendet, um die Spiellogik zu implementieren sowie Mods und benutzerdefinierte Karten zu erstellen
- Die Modding-Community ist sehr aktiv, und es gibt Tausende von Mods
- Der Mod Alien Biomes verzeichnete 551K Downloads
Netzwerk-Exposition des Lua-Interpreters
- Der Multiplayer-Modus von Factorio verwendet deterministischen Lockstep, um Clients zu synchronisieren
- Wenn ein Spieler Lua-Code ausführt, müssen andere Spieler denselben Code ebenfalls ausführen
- Dadurch entsteht die Möglichkeit, bösartigen Lua-Code über das Netzwerk auszuführen
Typischer Exploit-Pfad
- Ein Factorio-Server wird mit einer bösartigen Karte gehostet
- Wenn ein Client eine Verbindung zum Server herstellt, lädt er die Karte herunter und führt den Lua-Code aus
- Schwächen in der Lua-Implementierung werden ausgenutzt, um gefälschte Objekte zu erzeugen
- Über Speicherlecks oder Speicherkorruption wird das Verhalten des Programms verändert
- Mithilfe dieser mächtigen Primitives wird Codeausführung erreicht
Die Gefährlichkeit von Lua-Bytecode
- Lua ist eine Interpretersprache; geschriebener Code wird nicht direkt ausgeführt, sondern in Bytecode kompiliert
- Wenn Bytecode direkt ausgeführt werden kann, lässt sich fehlerhafter Bytecode ausführen, um Speicher offenzulegen oder zu beschädigen
Bytecode-Validator
- Die Lua-Entwickler implementierten einen Bytecode-Validator, um den Interpreter vor bösartigem Bytecode zu schützen, doch es wurden wiederholt Möglichkeiten zur Umgehung gefunden, weshalb er in Lua 5.2 entfernt wurde
- Die Factorio-Entwickler implementierten einen eigenen Bytecode-Validator, dieser ist jedoch aufgrund einiger Off-by-one-Probleme nicht perfekt
Erzeugung gefälschter Objekte
- Durch das Erzeugen gefälschter Objekte lassen sich sämtliche Funktionen des Interpreters ausnutzen
- Mit Strings können beliebige Daten offengelegt werden, und mit Arrays sind Schreibzugriffe auf beliebigen Speicher möglich
- Wenn native Funktionen aufgerufen werden können, lässt sich der Ausführungsfluss kontrollieren
Adressleck
- Die
print-Funktion von Lua kann Adressen offenlegen
- In Factorio wurde sie entfernt, daher wird stattdessen eine Methode mit Type Confusion verwendet, um Adressen offenzulegen
TValues verstehen
- Lua ist eine dynamische Sprache, bei der sich der Typ einer Variablen zur Laufzeit ändern kann
- Intern verwendet Lua die
TValue-Struktur, um Objekte darzustellen
TValue besitzt die Eigenschaften Typ (tt_) und Wert (value_)
Type Confusion mit FORLOOP
- Der Opcode
FORLOOP kann Type Confusion auslösen, da er den Initialwert der Schleife als Zahl behandelt
- Dadurch lassen sich Adressen offenlegen
IEEE-754-Doppelte Genauigkeit
- Doppelte Genauigkeit besteht aus Vorzeichen, Exponent und Mantisse
- Lua stellt keine Integer dar, daher können Adressen bis 53 Bit ohne Präzisionsverlust offengelegt werden
Suche nach gefälschten Objekten
- Durch das Verständnis von Upvalues und Closures lassen sich gefälschte Objekte finden
- Upvalues ermöglichen den Zugriff auf Variablen aus äußeren Funktionen
- Wenn durch Änderungen am Bytecode der Index eines Upvalue verändert wird, lassen sich gefälschte Objekte finden
Meinung von GN⁺
- Dieser Artikel ist sehr hilfreich, um Sicherheitslücken in dynamischen Sprachen zu verstehen
- Er erklärt gut, welche Sicherheitsprobleme in beliebten Spielen wie Factorio auftreten können
- Ähnliche Schwachstellen können auch in anderen Projekten existieren, die Sprachen wie Lua verwenden
- Bei der Einführung neuer Technologien oder von Open Source ist eine Sicherheitsprüfung unerlässlich
- Ein anderes Projekt mit ähnlicher Funktionalität ist das Modding-System von Minecraft
Noch keine Kommentare.