BSP Protection y filtraciones

¿Es seguro un mapa de GMod? Revisa el BSP antes de subirlo a tu servidor

¿Puede un mapa de GMod dañar tu servidor? Qué puede hacer lua_run, qué bloquea GMod y cómo revisar las entities y el pakfile de un BSP antes de instalarlo.

Sí, un mapa puede dañar un servidor de GMod, y los riesgos principales se pueden comprobar de antemano. La vía más importante es la entity lua_run: ejecuta en el servidor código Lua almacenado en los datos de entities del mapa. Aparte de eso, un mapa puede perturbar un servidor sin nada de código, por ejemplo con una avalancha de entities. Detectas ambas cosas listando las entities y el pakfile y cargando el mapa primero en un servidor aparte.

Qué puede contener un BSP y qué no

Un BSP no es un programa, sino una colección de bloques de datos llamados lumps. Dos de ellos importan para la seguridad: el lump de entities, una lista de texto de todas las entities con sus propiedades, y el pakfile, un archivo ZIP con archivos incrustados. La estructura completa se explica en ¿Qué es un archivo BSP?. Eso le deja a un mapa dos vías para hacer algo más que mostrar geometría: entities que ejecutan algo y archivos que el juego monta al cargar.

Garry's Mod ha endurecido la segunda vía. Desde los parches de seguridad de diciembre de 2023, el juego comprueba los archivos incrustados contra una whitelist. Lo que no pasa la comprobación no se monta, y la consola muestra:

BSP embedded file failed whitelist check - '<path of the file>'

Las notas del parche de Facepunch mencionan la whitelist por su nombre y enumeran entradas que se permitieron más tarde, como materials/*.raw y scripts/vehicles/*.txt. Facepunch no ha documentado la lista completa. La biblioteca del sistema de archivos de la versión actual del juego contiene una lista de patrones exactamente en ese formato, que cubre entre otras cosas modelos, materiales, sonidos, partículas, navmesh, soundscapes y archivos de texto en maps/ y data_static/, pero ningún patrón para archivos Lua. Que esa lista sea la whitelist es nuestra lectura del archivo y no está confirmado por Facepunch, y no hemos probado en un juego en ejecución si se carga un .lua del pakfile. Así que trata los archivos Lua en un pakfile como una anomalía que el autor debería explicar.

lua_run: código Lua directamente desde el mapa

garrysmod.fgd describe lua_run escuetamente como «Runs Lua Code». La entity tiene un keyvalue Code, el spawnflag «Run code on spawn» y dos inputs: RunCode ejecuta el código almacenado, y RunPassedCode ejecuta código que otro output envía como parámetro. El código se ejecuta en el servidor y tiene allí las mismas capacidades que un addon instalado.

Es una herramienta legítima. El propio gm_construct, que viene con el juego, contiene dos entities lua_run, y una de ellas muestra una pista a los jugadores (abreviado):

{
"targetname" "ColorRoomHint"
"Code" "if ( TRIGGER_PLAYER ) then TRIGGER_PLAYER:SendHint( 'ColorRoom', 0 ) else Msg( 'No Player!!?/n' ) end"
"classname" "lua_run"
}

Así que lo que importa no es si un mapa contiene lua_run, sino lo que dice el código. Al leerlo, fíjate en estas señales de alarma:

  • Acceso a la red, como http.Fetch o HTTP. Un mapa no tiene ninguna necesidad de hablar con un servidor de terceros.
  • Código cargado en tiempo de ejecución mediante RunString o CompileString. El código real está entonces en otra parte, y tú solo estás revisando la cáscara.
  • Cadenas ilegibles, por ejemplo largas secuencias de números.
  • Comandos de consola y rangos, es decir, RunConsoleCommand, game.ConsoleCommand o cambios en los grupos de usuarios.
  • RunPassedCode en outputs. El código no está entonces en la lua_run, sino en el output de otra entity. Así que busca en toda la lista de entities.

No hemos encontrado ningún ajuste del servidor que prohíba a los mapas ejecutar Lua, ni en la wiki de GMod ni en la lista de convars. Garry's Mod solo bloquea ciertos comandos de consola para Lua, entre ellos rcon_password y sv_cheats. Eso no sustituye a leer el código.

Problemas sin una sola línea de código

Entities de comandos. En otros juegos Source, point_servercommand y point_clientcommand envían comandos a la consola. En Garry's Mod ambas están desactivadas: el base.fgd del juego las lista comentadas, con una nota de que están deshabilitadas en GMod, y Facepunch las quitó de Hammer porque no funcionan en Garry's Mod. La wiki de Valve Developer Community cita el abuso como motivo. Si las encuentras en un mapa, el mapa probablemente viene de otro juego.

Avalanchas de entities. Un mapa puede crear entities en tiempo de ejecución, por ejemplo mediante point_template con env_entity_maker o mediante npc_maker, a menudo impulsados por un logic_timer. Si eso funciona sin control, al final todos los edicts acaban en uso. Según la wiki de GMod, el límite ronda las 8176 entities en red; el servidor primero avisa con Warning: free edicts below threshold y, en el peor de los casos, se cierra con ED_Alloc: no free edicts. La causa puede ser tanto un error de construcción como algo intencionado. Cómo contar edicts se explica en el artículo sobre el límite de edicts y «no free edicts».

Datos manipulados. Facepunch sigue reforzando el juego contra mapas que provocan cuelgues. La actualización de noviembre de 2025 enumera, entre otras cosas, protección contra valores sin sentido del fog controller, contra un bucle de recarga mediante player_loadsaved y límites en el número de props estáticos. Así que mantén el servidor actualizado: una versión antigua es más vulnerable a esos mapas.

Contenido. Las texturas y los modelos que faltan o una descarga muy grande no son un ataque, pero ahuyentan a los jugadores.

De dónde viene el archivo

El riesgo depende más del origen que del formato de archivo. El lump de entities es texto plano y se puede modificar con herramientas sencillas. Por tanto, cualquiera que vuelva a subir un mapa puede añadirle una lua_run sin cambiar su nombre ni su aspecto. Con las copias filtradas no sabes quién tocó el archivo por última vez.

Además del propio BSP, el problema puede ser el paquete: si el mapa viene en un archivo comprimido con una carpeta lua o un addon, ese código se ejecuta sin ninguna lua_run. Léelo como cualquier otro addon. En qué fijarte al comprar se explica en comprar mapas de GMod con seguridad.

La revisión antes de instalar

  1. Aclara el origen. Consigue el mapa de su autor o de una plataforma que muestre quién lo subió.
  2. Mira el paquete. Lo esperable es un .bsp, quizá con un navmesh. Lee por completo los archivos Lua y los addons que haya en el paquete.
  3. Lista las entities. El lump de entities es texto plano, así que basta con una búsqueda de texto en el BSP. Busca lua_run, RunPassedCode, point_servercommand y point_clientcommand. El Map Scanner detecta entities de riesgo como point_servercommand o lua_run y comprueba si existe un spawnpoint. Valorar el código te corresponde a ti.
  4. Lista el pakfile. bspzip -dir, desde la carpeta bin de Garry's Mod, muestra cada archivo incrustado con su ruta. El Map Scanner también lista los archivos Lua y de assets incrustados. Lo esperable es materials/, models/, sound/ y similares.
  5. Prueba de forma aislada. Inicia el mapa en un servidor sin datos reales de jugadores y sin acceso a tu base de datos. Lee la consola: ahí aparecen los mensajes de la whitelist, los errores de Lua y los avisos de edicts.
  6. Conserva el archivo revisado. Repite los pasos 3 a 5 con cada actualización.
bspzip -dir rp_example_v2.bsp
bspzip -repack copy_rp_example_v2.bsp

Solo necesitas la segunda línea para los mapas comprimidos. Sus lumps están comprimidos, así que una búsqueda de texto simple en el archivo no encuentra nada, y bspzip -dir también falla. Según su texto de ayuda, -repack sin -compress vuelve a descomprimir el archivo. En nuestra prueba, sin embargo, el bspzip de la versión actual de Garry's Mod se cerró con un mapa comprimido sin ningún mensaje, mientras que el bspzip de Team Fortress 2 descomprimió el mismo archivo. Trabaja sobre una copia cuando lo hagas.

El Map Scanner comprueba además la coherencia del header, los magic bytes, la tabla de lumps y los offsets, y acepta archivos BSP de hasta 50 MB. Lo que un mapper repasa antes de publicar está en la checklist para revisar un BSP antes de publicar.

Preguntas frecuentes

¿Impide sv_allowcslua 0 que los mapas ejecuten Lua?

No. Según la wiki de GMod, sv_allowcslua controla si los clientes pueden usar lua_openscript_cl y lua_run_cl, es decir, sus propios scripts en su propio equipo. El ajuste no tiene nada que ver con la entity lua_run, que se ejecuta en el servidor.

¿Qué hago si encuentro código sospechoso en un mapa?

No lo instales y pregunta al autor para qué sirve el código. Si no recibes una respuesta plausible, denuncia el archivo a la plataforma de la que procede y usa otro mapa.

¿Basta con un escaneo o tengo que probar el mapa igualmente?

Pruébalo igualmente. Un escaneo muestra qué entities y archivos hay dentro del BSP. Lo que hace una cadena lógica en tiempo de ejecución, por ejemplo cuántas entities crea, solo se ve en un servidor en marcha.