From 62447258b22a46339af9caaa510986e4d78e4fb5 Mon Sep 17 00:00:00 2001 From: architect-bot Date: Mon, 17 Aug 2026 20:33:28 +0000 Subject: [PATCH] WIP checkpoint: Research and design GDScript sandboxing approach --- sandbox_probe/probe2.gd | 78 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 sandbox_probe/probe2.gd diff --git a/sandbox_probe/probe2.gd b/sandbox_probe/probe2.gd new file mode 100644 index 0000000..fc585eb --- /dev/null +++ b/sandbox_probe/probe2.gd @@ -0,0 +1,78 @@ +extends Node + +func _ready(): + print("=== SANDBOX PROBE 2: ScriptServer & Restrictions ===") + probe_scriptserver() + probe_script_restrictions() + probe_engine_restrictions() + probe_global_scope() + probe_classdb() + probe_script_extension() + print("=== SANDBOX PROBE 2 END ===") + get_tree().quit() + +func probe_scriptserver(): + print("--- ScriptServer ---") + # Is ScriptServer available? It's a static class in Godot 4. + print("ScriptServer exists: ", ClassDB.class_exists("ScriptServer")) + if ClassDB.class_exists("ScriptServer"): + # What methods does it expose? + var methods = ClassDB.class_get_method_list("ScriptServer") + for m in methods: + print(" ScriptServer method: ", m.name, " args=", m.args.size()) + +func probe_script_restrictions(): + print("--- Script restrictions ---") + # Can we restrict script loading via ProjectSettings? + var keys = [ + "debug/gdscript/warnings/", + "debug/gdscript/", + "application/run/", + ] + for k in keys: + var settings = ProjectSettings.get_setting(k) + print(" ProjectSettings['", k, "'] = ", settings) + +func probe_engine_restrictions(): + print("--- Engine restrictions ---") + # Check if there's any sandbox/restriction setting + var all_settings = ProjectSettings.get_property_list() + var sandbox_like = [] + for s in all_settings: + var name = String(s.name) + if "sandbox" in name.to_lower() or "restrict" in name.to_lower() or "security" in name.to_lower(): + sandbox_like.append(name) + print(" Sandbox/restrict/security settings found: ", sandbox_like) + +func probe_global_scope(): + print("--- Global scope ---") + # What global classes/functions are available to scripts? + # Check if we can enumerate global scope + var global_classes = [] + if ClassDB.class_exists("GlobalScope"): + var methods = ClassDB.class_get_method_list("GlobalScope") + for m in methods: + global_classes.append(m.name) + print(" GlobalScope methods count: ", global_classes.size()) + # Key dangerous globals + var dangerous = ["OS", "FileAccess", "DirAccess", "TCPServer", "HTTPClient", "ProjectSettings", "Engine", "ResourceLoader", "ClassDB", "Expression", "JavaScriptBridge"] + for d in dangerous: + print(" Class '", d, "' exists: ", ClassDB.class_exists(d)) + +func probe_classdb(): + print("--- ClassDB ---") + # Can scripts access ClassDB to instantiate arbitrary classes? + print(" ClassDB.class_exists('Node') = ", ClassDB.class_exists("Node")) + # Can we get all classes? + var all_classes = ClassDB.get_class_list() + print(" ClassDB.get_class_list().size() = ", all_classes.size()) + +func probe_script_extension(): + print("--- Script extension / custom interpreter ---") + # Check if ScriptExtension exists (for custom script languages) + print(" ScriptExtension exists: ", ClassDB.class_exists("ScriptExtension")) + # Check GDScript internals + print(" GDScript class exists: ", ClassDB.class_exists("GDScript")) + var gd_methods = ClassDB.class_get_method_list("GDScript") + for m in gd_methods: + print(" GDScript method: ", m.name)