Sandbox para agentes de IA: ejecuta código aislado sin abrir producción
Un sandbox para agentes de IA es una frontera de capacidades: el modelo propone, pero una política y un runtime aislado deciden qué código o tool puede ejecutarse.
Un sandbox para agentes de IA no es una casilla de «confía en el agente»: es una frontera de capacidades que limita filesystem, red, identidad, tiempo, recursos y datos. El modelo propone una acción; la política y el runtime deciden si puede ejecutarse.
Modelo de amenazas: qué debes asumir
Trata el prompt, los archivos recuperados, la salida de una tool y el código generado como entradas no confiables. Un prompt injection puede intentar revelar instrucciones, leer un secreto montado o convencer al agente de usar una herramienta fuera de objetivo.
También debes cubrir fallos menos vistosos: fuga por DNS o proxy, credenciales heredadas del entorno, volúmenes persistentes compartidos, imágenes base vulnerables, abuso de CPU o memoria, procesos huérfanos, cachés entre tenants y logs que copian secretos.
El atacante no necesita escapar del contenedor para causar daño. Le basta con usar una identidad válida con demasiado alcance, exfiltrar datos por un dominio permitido o dejar un artefacto que otro paso consuma sin verificar.

¿Te está sirviendo? Hay una dosis cada semana
Te resumo herramientas de IA para devs, agentes, MCP, seguridad y workflows en un email de 5 minutos. En español y sin ruido.
Suscribirme gratisSesión, identidad y workspace
Asocia cada ejecución a un conversation_id, tenant_id y session_id distintos. El workspace nace vacío o con un checkout filtrado, tiene una cuota de disco y se destruye al finalizar; si necesitas reanudar, conserva solo artefactos explícitos y vuelve a validar su procedencia.
Puntos a revisar
Lo que conviene comprobar
La identidad del proceso debe ser propia del sandbox y de corta duración. No heredes el token del usuario ni las variables del runner. Emite credenciales con scopes mínimos para una operación concreta, revócalas al terminar y evita que aparezcan en el entorno, el diff o los logs.
La persistencia es una decisión de producto, no una comodidad. Separar historial, artefactos y filesystem evita que una sesión posterior convierta un archivo dejado por otra conversación en una instrucción o un canal de datos.
Broker de comandos con policy gate
Un broker estrecho transforma una intención validada en un proceso con cwd, entorno, timeout y recursos conocidos. Este ejemplo no entrega un shell al modelo: solo permite ejecutar un runner de tests dentro de /workspace y devuelve stdout/stderr truncados.
import { spawn } from "node:child_process";
import path from "node:path";
const ALLOWED = new Set(["pytest", "npm"]);
const ROOT = path.resolve("/workspace");
export async function runCommand(input: { bin: string; args: string[] }) {
if (!ALLOWED.has(input.bin) || input.args.some((arg) => arg.startsWith("-c") || arg.includes(".."))) {
throw new Error("command_denied");
}
const args = input.bin === "pytest" ? ["-q", ...input.args] : ["test", "--", ...input.args];
const child = spawn(input.bin, args, {
cwd: ROOT,
env: { PATH: process.env.PATH ?? "" },
shell: false,
stdio: ["ignore", "pipe", "pipe"],
});
const timer = setTimeout(() => child.kill("SIGKILL"), 15_000);
const chunks: Buffer[] = [];
child.stdout.on("data", (chunk) => chunks.push(chunk));
child.stderr.on("data", (chunk) => chunks.push(chunk));
return await new Promise((resolve, reject) => child.on("close", (code) => {
clearTimeout(timer);
resolve({ code, output: Buffer.concat(chunks).toString("utf8").slice(-8_000) });
}).on("error", reject));
}
En producción añade validación de esquema, límites de CPU y memoria, una allowlist de rutas y un proxy de red. El broker tampoco debe interpretar texto devuelto por el proceso como una nueva orden sin pasar otra vez por la política.
Haz que una denegación sea visible y accionable. Un sandbox que oculta el motivo del rechazo empuja al equipo a ampliar permisos hasta que «funcione». La policy versionada y las métricas de denegación permiten corregir el contrato sin abrir una puerta global.
Efímero o persistente: cómo decidir
Elige efímero cuando el trabajo sea compilación, tests, análisis de una PR, generación de artefactos o ejecución con datos sintéticos. Reduce contaminación entre sesiones y hace más claro el borrado, a cambio de pagar arranque, checkout y caché.
Elige persistencia controlada cuando una tarea larga necesite checkpoints o una dependencia pesada. Persiste un volumen separado por tenant y conversación, cifra, limita retención y restaura desde snapshots verificables; nunca compartas un workspace por conveniencia.
Mide p95 de arranque, tiempo de preparación, cache hit rate, coste por minuto, coste de almacenamiento y tasa de reintentos. La sesión más barata por ejecución puede ser más cara si deja incidentes o exige revisar demasiados permisos.
Preguntas frecuentes
¿Un contenedor ya es un sandbox seguro?
No por sí solo. Reduce superficie, pero debes controlar privilegios, filesystem, red, identidad, recursos, imagen, kernel y ciclo de vida.
¿Puedo permitir que el agente instale paquetes?
Solo en una sesión desechable, con repositorios y versiones permitidos, sin secretos y con coste/tiempo acotados. Para producción, preconstruye imágenes reproducibles.
¿Dónde guardo los secretos que necesita una tool?
Fuera del proceso del agente. Usa un broker o secret manager que emita una operación de mínimo privilegio y redacta el material sensible de las trazas.
¿Qué diferencia hay entre un code interpreter y un sandbox general?
Un code interpreter suele ofrecer una capacidad acotada para ejecutar código; un sandbox general también debe gobernar tools, red, identidad, artefactos y persistencia.
¿Cuándo necesito aprobación humana?
Antes de acciones mutantes o irreversibles: producción, datos reales, permisos, pagos, borrados, publicaciones y cambios que salgan del workspace de la sesión.
¿Cómo pruebo que el aislamiento funciona?
Ejecuta tests negativos y red-team contra rutas, procesos, red, credenciales, caches, artefactos y tenants. La evidencia debe mostrar una denegación, no solo una demo exitosa.
Cómo poner en marcha un sandbox mínimo para un agente
- Clasificar capacidades. Separa lectura, escritura, red, secretos y acciones irreversibles; asigna owner y riesgo a cada tool.
- Crear la sesión. Genera un workspace efímero por conversación, imagen fijada, identidad temporal y cuotas de CPU, memoria, disco y tiempo.
- Cerrar la política. Deniega por defecto y permite solo comandos, rutas, dominios y operaciones de signing explícitos.
- Implementar el broker. Valida esquema y argumentos, usa shell=false, cwd fijo, timeout, límites de salida y un exit code auditable.
- Aislar egress y secretos. Fuerza proxy/allowlist, bloquea redes privadas y entrega operaciones de mínimo privilegio sin montar credenciales.
- Registrar y borrar. Guarda decisiones, duración, consumo y hashes redactados; destruye la sesión y aplica retención a los artefactos.
- Atacar antes de abrir. Ejecuta prompt injection, traversal, exfiltración, abuso de cuota, cross-tenant y reutilización de cache; bloquea el rollout si una prueba cruza la frontera.
Conclusión
La arquitectura ganadora no intenta convencer al modelo de que sea prudente: hace que la prudencia sea una propiedad del runtime. Un sandbox efímero, una identidad estrecha, egress controlado, secretos fuera del proceso, cuotas, auditoría y evals convierten la ejecución de código en una capacidad gobernada y revocable.
Fuentes y referencias
También te puede interesar
Codex con internet: sandbox y seguridadPrompt injection en agentes de IA: guía prácticaOIDC y credenciales efímeras para agentesMCP en producción: seguridad y permisosEvaluación de agentes: tools y trayectoriasRecibe una lectura semanal de herramientas IA para devs
Cada semana te resumo herramientas de IA para devs, agentes, MCP, seguridad y workflows en un email de 5 minutos. En español y sin ruido.
Suscribirme gratis