Sandbox-Escape verhindern
Blockieren Sie den Zugriff auf die debug-Bibliothek, den Missbrauch von rawget/rawset und das Auslaufen von Upvalues
Sandbox-Escape verhindern ist eine kostenlose Lua Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Lua Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Lua Academy-Kurs umfasst insgesamt 4 Lektionen.
Das Escape-Problem
Selbst mit einer Whitelist-Umgebung finden kreative Angreifer möglicherweise Wege, auf die echte globale Umgebung zuzugreifen. Diese Lektion behandelt bekannte Escape-Vektoren und zeigt, wie Sie sie schließen.
Exploit über die Metatabelle von Zeichenfolgen
In Lua verfügen Zeichenfolgen über eine gemeinsame Metatabelle, die die string-Bibliothek zugänglich macht. Sandboxed Code kann eine Zeichenfolge verwenden, um eine Referenz auf string.rep zu erhalten und von dort aus weitere Bibliotheken zu erreichen.
-- Escape vector (before patching):
local s = "hello"
local getenv = s.rep -- reaches string library
-- Fix: use setmetatable on all sandboxed strings (not practical)
-- Better fix: override debug.getmetatable in the sandboxBlockieren mit rawget/rawset
Wenn rawget in der Sandbox verfügbar ist, kann Code damit die Einschränkungen von __index umgehen und direkt aus echten Tabellen lesen.
-- Fix: exclude rawget, rawset, rawequal, rawlen from the sandbox envZugriff auf die debug-Bibliothek
Die debug-Bibliothek kann jedes Upvalue lesen und ändern, einschließlich _ENV. Schließen Sie sie vollständig aus der Sandbox aus.
Tabelle package.loaded
Wenn require oder package zugänglich ist, kann Sandbox-Code auf bereits geladene Module wie os und io zugreifen.
-- Fix: exclude require and package from the sandbox envCoroutinen und Wiederaufnahme
Eine vom Host fortgesetzte Sandbox-Coroutine könnte dazu verwendet werden, Zustandsdaten auszuleiten. Verwenden Sie coroutine.wrap mit Bedacht und setzen Sie Sandbox-Coroutinen niemals mit erhöhten Berechtigungen fort.
Upvalues durchlaufen
Ohne die debug-Bibliothek kann Sandbox-Code keine Upvalues durchlaufen. Wenn jedoch versehentlich debug.getupvalue eingebunden wird, kann damit auf _G zugegriffen werden.
__newindex für safeEnv
Fügen Sie der Metatabelle der Sandbox-Umgebung ein __newindex hinzu, damit Sandbox-Code keine neuen globalen Variablen erstellen kann, die sichere Variablen überschatten.
setmetatable(safeEnv, {
__newindex = function(_, k, v)
-- allow only whitelisted keys or reject
error("Global assignment not allowed: " .. k)
end
})Proxy für die math-Bibliothek
Übergeben Sie nicht die echte math-Tabelle, die ihre Metatabelle mit der Standardbibliothek teilt. Erstellen Sie stattdessen eine flache Kopie, die nur die benötigten Funktionen enthält.
Automatisiertes Testen von Sandbox-Ausbrüchen
Pflegen Sie eine Fuzzing-Testsuite, die bekannte Ausbruchsmuster gegen Ihre Sandbox ausprobiert. Führen Sie sie bei jeder Änderung am Sandbox-Code aus.
Mehrschichtige Absicherung
Keine Sandbox ist perfekt. Kombinieren Sie mehrere Schutzmaßnahmen: eingeschränkte Umgebung + Ausführungslimits + Speicherlimits + Prozessisolierung auf Betriebssystemebene (separater Unterprozess oder Container).
Sandbox auf Betriebssystemebene
Für maximale Sicherheit führen Sie Lua in einem Unterprozess mit Einschränkungen auf Betriebssystemebene aus: seccomp (Linux), App Sandbox (macOS) oder Docker mit einem schreibgeschützten Dateisystem.
Frage zu Sandbox-Ausbrüchen
Warum muss rawget aus einer Sandbox ausgeschlossen werden?
Zusammenfassung: Sandbox-Ausbrüche verhindern
Schließen Sie debug, rawget/rawset, package, require und load aus der Sandbox aus. Schützen Sie die Sandbox-Umgebung mit __newindex. Kopieren Sie Bibliothekstabellen, anstatt auf die Originale zu verweisen. Ergänzen Sie die Absicherung durch Isolation auf Betriebssystemebene, um maximale Sicherheit zu erreichen.
Häufig gestellte Fragen
Ist die Lektion „Sandbox-Escape verhindern“ kostenlos?
Ja — der vollständige Text von „Sandbox-Escape verhindern“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Lua Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Lua Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Sandbox-Escape verhindern“?
Blockieren Sie den Zugriff auf die debug-Bibliothek, den Missbrauch von rawget/rawset und das Auslaufen von Upvalues Du übst Lua Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Lua Academy zu starten?
Keine Vorkenntnisse erforderlich. Lua Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.
Wie lange dauert die Lektion „Sandbox-Escape verhindern“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Lua Academy-Lektion Code schreiben und ausführen?
Ja. Jede Lua Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Das _ENV-Modell in Lua 5.2+
- Eine eingeschränkte Sandbox erstellen
- Sandbox-Escape verhindern
- Ressourcenlimits und Instrumentierung