0Pricing
Lua Academy · Lección

Prevención de escapes del sandbox

Bloquee el acceso a la biblioteca debug, el uso indebido de rawget/rawset y las fugas de upvalues.

Prevención de escapes del sandbox es una lección gratuita de Lua Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Lua Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Lua Academy incluye 4 lecciones en total.

El problema de los escapes

Incluso con un entorno de lista blanca, unos atacantes ingeniosos podrían encontrar formas de acceder al entorno global real. Esta lección aborda los vectores de escape conocidos y cómo cerrarlos.

Exploit de la metatabla de strings

En Lua, las cadenas tienen una metatabla compartida que expone la biblioteca de strings. El código del sandbox puede utilizar una cadena para obtener una referencia a string.rep y, a partir de ahí, acceder a otras bibliotecas.

-- 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 sandbox

Bloqueo mediante rawget/rawset

Si rawget está disponible en el sandbox, el código puede utilizarlo para eludir las restricciones de __index y leer directamente de las tablas reales.

-- Fix: exclude rawget, rawset, rawequal, rawlen from the sandbox env

Acceso a la biblioteca debug

La biblioteca debug puede leer y modificar cualquier upvalue, incluido _ENV. Exclúyala por completo del sandbox.

Tabla package.loaded

Si require o package están accesibles, el código en el sandbox puede acceder a módulos ya cargados, incluidos os e io.

-- Fix: exclude require and package from the sandbox env

Corutinas y reanudación

Una corutina en el sandbox que el host reanude podría utilizarse para extraer el estado. Use coroutine.wrap con cuidado y no reanude corutinas del sandbox con privilegios elevados.

Recorrido de upvalues

Sin la biblioteca de depuración, el código en el sandbox no puede recorrer los upvalues. Sin embargo, si debug.getupvalue se incluye accidentalmente, puede utilizarse para acceder a _G.

__newindex en safeEnv

Añada un __newindex a la metatabla del entorno del sandbox para impedir que el código en el sandbox cree nuevos globales que oculten los seguros.

setmetatable(safeEnv, {
  __newindex = function(_, k, v)
    -- allow only whitelisted keys or reject
    error("Global assignment not allowed: " .. k)
  end
})

Proxy para la biblioteca math

En lugar de pasar la tabla math real (que comparte una metatabla con la biblioteca estándar), cree una copia superficial que contenga únicamente las funciones necesarias.

Pruebas automatizadas de escapes

Mantenga un conjunto de pruebas de fuzzing que pruebe patrones de escape conocidos contra su sandbox. Ejecútelo cada vez que cambie el código del sandbox.

Defensa en profundidad

Ningún sandbox es perfecto. Combine varias defensas: entorno restringido + límites de instrucciones + límites de memoria + aislamiento de procesos a nivel del sistema operativo (un subproceso o contenedor independiente).

Sandbox a nivel del sistema operativo

Para obtener la máxima seguridad, ejecute Lua en un subproceso con restricciones a nivel del sistema operativo: seccomp (Linux), App Sandbox (macOS) o Docker con un sistema de archivos de solo lectura.

Pregunta sobre escapes del sandbox

¿Por qué debe excluirse rawget de un sandbox?

Resumen: prevención de escapes del sandbox

Excluya debug, rawget/rawset, package, require y load del sandbox. Proteja el entorno del sandbox con __newindex. Copie las tablas de las bibliotecas en lugar de hacer referencia a las originales. Añada aislamiento a nivel del sistema operativo para obtener la máxima seguridad.

Preguntas frecuentes

¿La lección «Prevención de escapes del sandbox» es gratis?

Sí — el texto completo de «Prevención de escapes del sandbox» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Lua Academy, actualiza a CoddyKit PRO. El curso de Lua Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Prevención de escapes del sandbox»?

Bloquee el acceso a la biblioteca debug, el uso indebido de rawget/rawset y las fugas de upvalues. Practicas Lua Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Lua Academy?

No se requiere experiencia previa. Lua Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.

¿Cuánto tiempo toma la lección «Prevención de escapes del sandbox»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Lua Academy?

Sí. Cada lección de Lua Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. El modelo _ENV en Lua 5.2+
  2. Construcción de un sandbox restringido
  3. Prevención de escapes del sandbox
  4. Límites de recursos e instrumentación
← Volver a Lua Academy