Ist eine GMod-Map sicher? BSP vor dem Server-Einsatz prüfen
Kann eine GMod-Map deinem Server schaden? Was lua_run darf, was GMod blockiert und wie du Entities und Pakfile einer BSP vor der Installation prüfst.
Ja, eine Map kann einem GMod-Server schaden, und die wesentlichen Risiken kannst du vorher prüfen. Der wichtigste Weg ist die Entity lua_run: Sie führt Lua-Code, der in den Entity-Daten der Map steht, auf dem Server aus. Daneben kann eine Map einen Server ohne jeden Code stören, etwa durch eine Flut an Entities. Beides erkennst du, wenn du Entities und Pakfile auflistest und die Map zuerst auf einem getrennten Server lädst.
Was eine BSP enthalten kann und was nicht
Eine BSP ist kein Programm, sondern eine Sammlung von Datenblöcken, den Lumps. Für die Sicherheit zählen zwei davon: der Entity-Lump, eine Textliste aller Entities mit ihren Eigenschaften, und das Pakfile, ein ZIP-Archiv mit eingebetteten Dateien. Den vollständigen Aufbau erklärt der Artikel Was ist eine BSP-Datei?. Eine Map kann damit auf zwei Wegen mehr tun als Geometrie anzeigen: über Entities, die etwas ausführen, und über Dateien, die das Spiel beim Laden einbindet.
Beim zweiten Weg hat Garry's Mod nachgebessert. Seit den Sicherheits-Patches vom Dezember 2023 prüft das Spiel eingebettete Dateien gegen eine Whitelist. Was durchfällt, wird nicht eingebunden, und in der Konsole steht:
BSP embedded file failed whitelist check - '<Pfad der Datei>'
Die Patch Notes von Facepunch nennen die Whitelist beim Namen und erwähnen nachträglich erlaubte Einträge wie materials/*.raw und scripts/vehicles/*.txt. Die vollständige Liste hat Facepunch nicht dokumentiert. In der Dateisystem-Bibliothek der aktuellen Spielversion steht eine Musterliste in genau diesem Format, unter anderem für Models, Materialien, Sounds, Partikel, Navmesh, Soundscapes und Textdateien unter maps/ und data_static/, aber ohne Muster für Lua-Dateien. Dass diese Liste die Whitelist ist, schließen wir aus der Datei, Facepunch hat es nicht bestätigt, und ob eine .lua im Pakfile geladen wird, haben wir im laufenden Spiel nicht geprüft. Behandle Lua-Dateien im Pakfile deshalb als Auffälligkeit, die der Ersteller erklären sollte.
lua_run: Lua-Code direkt aus der Map
Die garrysmod.fgd beschreibt lua_run knapp mit „Runs Lua Code“. Die Entity hat ein Keyvalue Code, das Spawnflag „Run code on spawn“ und zwei Inputs: RunCode führt den hinterlegten Code aus, RunPassedCode führt Code aus, den ein anderer Output als Parameter mitschickt. Der Code läuft auf dem Server und hat dort dieselben Möglichkeiten wie ein installiertes Addon.
Das ist zunächst ein legitimes Werkzeug. Die mit dem Spiel gelieferte gm_construct enthält selbst zwei lua_run, eine davon zeigt Spielern einen Hinweis an (gekürzt):
{
"targetname" "ColorRoomHint"
"Code" "if ( TRIGGER_PLAYER ) then TRIGGER_PLAYER:SendHint( 'ColorRoom', 0 ) else Msg( 'No Player!!?/n' ) end"
"classname" "lua_run"
}
Entscheidend ist also nicht, ob eine Map lua_run enthält, sondern was im Code steht. Achte beim Lesen auf diese Warnzeichen:
- Netzwerkzugriffe wie
http.FetchoderHTTP. Eine Map muss mit keinem fremden Server sprechen. - Nachgeladener Code über
RunStringoderCompileString. Dann steht der eigentliche Code woanders, und du prüfst nur die Hülle. - Unleserliche Zeichenketten, etwa lange Zahlenfolgen.
- Konsolenbefehle und Ränge, also
RunConsoleCommand,game.ConsoleCommandoder Eingriffe in Benutzergruppen. RunPassedCodein Outputs. Der Code steht dann nicht in derlua_run, sondern im Output einer anderen Entity. Durchsuche deshalb die gesamte Entity-Liste.
Eine Server-Einstellung, die Maps das Ausführen von Lua verbietet, haben wir weder im GMod-Wiki noch in der Convar-Liste gefunden. Garry's Mod sperrt lediglich bestimmte Konsolenbefehle für Lua, darunter rcon_password und sv_cheats. Das Lesen des Codes ersetzt das nicht.
Ärger ohne eine Zeile Code
Befehls-Entities. In anderen Source-Spielen schicken point_servercommand und point_clientcommand Befehle an die Konsole. In Garry's Mod sind beide abgeschaltet: Die base.fgd des Spiels führt sie auskommentiert mit dem Vermerk, sie seien in GMod deaktiviert, und Facepunch hat sie aus Hammer entfernt, weil sie in Garry's Mod nicht funktionieren. Das Valve-Entwicklerwiki nennt Missbrauch als Grund. Findest du sie in einer Map, stammt die Map vermutlich aus einem anderen Spiel.
Entity-Fluten. Eine Map kann zur Laufzeit Entities erzeugen, zum Beispiel über point_template mit env_entity_maker oder über npc_maker, oft angetrieben von einem logic_timer. Läuft das ungebremst, sind irgendwann alle Edicts belegt. Laut GMod-Wiki liegt die Grenze bei rund 8176 vernetzten Entities, der Server meldet vorher Warning: free edicts below threshold und beendet sich im schlimmsten Fall mit ED_Alloc: no free edicts. Dahinter kann ebenso gut ein Baufehler stecken wie Absicht. Wie du Edicts zählst, steht im Artikel Edict-Limit und „no free edicts“.
Präparierte Daten. Facepunch härtet das Spiel laufend gegen Maps, die Abstürze provozieren. Das Update vom November 2025 nennt unter anderem Schutz gegen unsinnige Werte im Fog-Controller, gegen eine Neulade-Schleife über player_loadsaved und Grenzen für die Zahl statischer Props. Die Folgerung für dich: Halte den Server aktuell, denn eine alte Version ist für solche Maps anfälliger.
Inhalte. Fehlende Texturen und Models oder ein sehr großer Download sind kein Angriff, vergraulen aber Spieler.
Woher die Datei kommt
Das Risiko hängt stärker an der Quelle als am Dateiformat. Der Entity-Lump ist Klartext und lässt sich mit einfachen Werkzeugen ändern. Wer eine Map neu hochlädt, kann ihr also eine lua_run hinzufügen, ohne dass sich Name oder Aussehen ändern. Bei geleakten Kopien weißt du nicht, wer die Datei zuletzt angefasst hat.
Neben der BSP selbst kann das Paket das Problem sein: Liegt die Map in einem Archiv mit einem lua-Ordner oder einem Addon, läuft dieser Code ganz ohne lua_run. Lies ihn wie jedes andere Addon. Worauf du beim Kauf achtest, steht in GMod Maps sicher kaufen.
Prüfung vor der Installation
- Quelle klären. Lade die Map vom Ersteller oder von einer Plattform, bei der nachvollziehbar ist, wer sie hochgeladen hat.
- Paket ansehen. Erwartet wird eine
.bsp, eventuell mit Navmesh. Lua-Dateien und Addons im Paket liest du vollständig. - Entities auflisten. Der Entity-Lump ist Klartext, eine Textsuche in der BSP genügt. Suche nach
lua_run,RunPassedCode,point_servercommandundpoint_clientcommand. Der Map Scanner findet riskante Entities wiepoint_servercommandoderlua_runund prüft, ob ein Spawnpoint vorhanden ist. Den Code bewertest du selbst. - Pakfile auflisten.
bspzip -diraus dembin-Ordner von Garry's Mod gibt jede eingebettete Datei mit Pfad aus. Der Map Scanner listet eingebettete Lua- und Asset-Dateien ebenfalls auf. Erwartbar sindmaterials/,models/,sound/und Ähnliches. - Getrennt testen. Starte die Map auf einem Server ohne echte Spielerdaten und ohne Zugang zu deiner Datenbank. Lies die Konsole: Whitelist-Meldungen, Lua-Fehler und Edict-Warnungen stehen dort.
- Geprüfte Datei aufbewahren. Bei jedem Update wiederholst du die Schritte 3 bis 5.
bspzip -dir rp_beispiel_v2.bsp
bspzip -repack kopie_rp_beispiel_v2.bsp
Die zweite Zeile brauchst du nur bei komprimierten Maps. Dort sind die Lumps gepackt, eine einfache Textsuche in der Datei findet nichts, und auch bspzip -dir bricht ab. Laut Hilfetext entpackt -repack ohne -compress die Datei wieder. In unserem Test beendete sich das bspzip der aktuellen Garry's-Mod-Version bei einer komprimierten Map allerdings ohne Meldung, während das bspzip aus Team Fortress 2 dieselbe Datei entpackte. Arbeite dabei mit einer Kopie.
Der Map Scanner prüft außerdem Header, Magic Bytes, Lump-Tabelle und Offsets auf Konsistenz und nimmt BSP-Dateien bis 50 MB an. Welche Punkte ein Mapper vor der Veröffentlichung selbst abarbeitet, zeigt die Checkliste Map vor Release prüfen.
Häufige Fragen
Verhindert sv_allowcslua 0, dass Maps Lua ausführen?
Nein. Laut GMod-Wiki regelt sv_allowcslua, ob Clients lua_openscript_cl und lua_run_cl nutzen dürfen, also eigene Skripte auf ihrem Rechner. Mit der Entity lua_run, die auf dem Server läuft, hat die Einstellung nichts zu tun.
Was mache ich, wenn ich in einer Map verdächtigen Code finde?
Installiere sie nicht und frag den Ersteller, wofür der Code gedacht ist. Bekommst du keine nachvollziehbare Antwort, melde die Datei der Plattform, von der sie stammt, und nutze eine andere Map.
Reicht ein Scan, oder muss ich die Map trotzdem testen?
Teste sie trotzdem. Ein Scan zeigt, welche Entities und Dateien in der BSP stecken. Was eine Logikkette zur Laufzeit anrichtet, etwa wie viele Entities sie erzeugt, siehst du erst auf einem laufenden Server.