đ§ QuĂ© es un sandbox#
Empieza aquĂ. Sin este documento, el resto del repositorio no se entiende.
El problema de partida#
Cuando ejecutas un programa en tu equipo, ese programa corre como tĂș. Tiene exactamente tus permisos: puede leer cualquier archivo que tĂș puedas leer, conectarse a donde quiera y ver todo lo que tienes abierto.
No hay término medio. O lo ejecutas con todo tu poder, o no lo ejecutas.
Y ejecutas cĂłdigo ajeno constantemente sin pensarlo:
- cada
npm installdescarga decenas de paquetes que ejecutan scripts durante la instalaciĂłn; - cada dependencia tiene sus propias dependencias, y nadie las lee;
- abres el adjunto que te mandaron, el script que te pasó un compañero, el fragmento que generó un modelo.
flowchart LR P["đŠ Programa ajeno"] --> H["đ„ïž Tu equipo"] H --> A["đ Tus archivos"] H --> B["đ Internet"] H --> C["đ ~/.ssh · ~/.aws"] H --> D["âïž Tus procesos"] H --> E["âïž Tus tokens"]
La definiciĂłn#
Un sandbox es un entorno que le entrega a un programa una porciĂłn declarada del sistema âunas carpetas, quizĂĄ algo de red, un techo de memoria y de CPUâ para que haga trabajo real dentro de ella, y donde el resto del sistema no existe.
Las dos mitades importan, y la primera se olvida siempre:
- Se concede. Un sandbox no es una pared: es un espacio de trabajo. Se le
da al programa lo que necesita para hacer su tarea de verdad âleer esta carpeta, escribir en esta otra, hablar con este servidorâ y con eso funciona igual que fuera. Un sandbox donde no se puede hacer nada no sirve para nada.
- Lo demĂĄs no existe. Todo lo que no se concediĂł, desde dentro, no estĂĄ.
Lo importante es cĂłmo se hace cumplir la segunda mitad. No es un aviso de permisos que el programa pueda esquivar ni una promesa de buena conducta: si pide
intenta conectarse, no hay red que usar â no una red bloqueada: no hay pila de red.
flowchart LR
subgraph J["đ El sandbox: la porciĂłn concedida"]
P["đŠ El mismo programa"]
P --> W["đ Su carpeta de trabajo"]
P --> N["đ Los destinos permitidos"]
P --> R["đ Su memoria y su CPU"]
end
P -.->|no existe| B["đïž El resto del disco"]
P -.->|no existe| C["đ Tus claves"]
P -.->|no existe| D["âïž Tus procesos"]
Por eso la pregunta Ăștil no es «¿estĂĄ aislado?», que se responde sĂ o no y no sirve de nada. Es «¿quĂ© porciĂłn del sistema le he dado, y quĂ© hace con ella?»
La analogĂa#
Contratas a un cerrajero.
- Sin sandbox: le das las llaves de toda la casa y te vas a trabajar.
- Con sandbox: entra solo al recibidor, la puerta al resto estĂĄ tapiada, no
hay teléfono, y cuando se va compruebas qué tocó.
Qué se controla#
| Control | Qué decides | Sin él |
|---|---|---|
| Filesystem | QuĂ© ve: una carpeta de entrada y otra de salida | Lee tus claves y escribe donde tĂș escribas |
| Red | Si tiene internet, unos destinos concretos, o ninguno | Exfiltra lo que encuentre y descarga su segunda etapa |
| Procesos | Si ve tus otros programas o solo el suyo | Inspecciona y señaliza procesos ajenos |
| Recursos | CuĂĄnta memoria, cuĂĄnto tiempo, cuĂĄntos procesos | Una carga descontrolada tumba el equipo |
| Privilegios | Qué capabilities conserva | Puede montar, trazar procesos o tocar la red del host |
| Entorno | Qué variables hereda | Un token heredado convierte la ejecución en una filtración |
DĂłnde se declara todo eso#
En un archivo de polĂtica, separado del cĂłdigo. Ni el programa negocia sus permisos, ni quien lo escribiĂł decide sus lĂmites.
{
"filesystem": { "root": "ephemeral", "writable": ["/workspace/output"] },
"network": { "mode": "none" },
"resources": { "memoryMb": 512, "processes": 32 },
"process": { "capabilities": [], "allowedEnvironment": [] }
}
Léelo como una lista de decisiones tuyas. Lo que no aparece ahà no se monta, y lo que no se monta dentro no existe.
flowchart LR A["đ polĂtica.json<br/>lo que se permite"] --> C["âïž sandboxctl"] B["đŠ caso<br/>quĂ© polĂtica usa"] --> C C --> D["đ controles del kernel<br/>namespaces · caps · lĂmites"] D --> E["đą sandbox vivo<br/>y haces tareas dentro"]
Referencia campo a campo en POLICY_REFERENCE.md.
Cinco sandboxes que ya usas#
No es una tĂ©cnica de laboratorio: la usas a diario sin llamarla asĂ.
| DĂłnde | QuĂ© cĂłdigo ajeno ejecuta | Con quĂ© aĂsla |
|---|---|---|
| El navegador | El JavaScript de cada web que abres | namespaces + seccomp · AppContainer |
| El mĂłvil | Cada app instalada | Un UID por app + SELinux |
| Serverless | CĂłdigo de miles de clientes en la misma mĂĄquina | Firecracker, una microVM por invocaciĂłn |
| Los runners de CI | El cĂłdigo de cualquier pull request | VM efĂmera por job |
| Los intĂ©rpretes de IA | CĂłdigo reciĂ©n generado que nadie ha leĂdo | gVisor o microVM, sin red |
Escaparse del sandbox de un navegador se paga por encima de los 200.000 dĂłlares en las competiciones de seguridad. Si fuera fĂĄcil, no valdrĂa tanto.
En qué se parece a una API o a un MCP, y en qué no#
Es la comparaciĂłn mĂĄs Ăștil que se puede hacer, porque los tres controlan quĂ© parte del sistema alcanza un programa. Pero el mecanismo es distinto, y esa diferencia decide cuĂĄl sirve en cada caso.
El malentendido mĂĄs comĂșn, primero#
«Un sandbox recibe instrucciones comoGETyPOST, entonces es una API.»
No, y aclarar esto ordena todo lo demĂĄs. GET y POST son verbos de HTTP: el vocabulario con el que se habla con una API por la red. Un programa dentro de un sandbox no habla HTTP con el sandbox. Lo que hace son llamadas al sistema âopen, read, write, connect, execveâ, que son las instrucciones que cualquier programa le da al sistema operativo, estĂ© o no enjaulado.
Y el sandbox no las recibe: no hay nadie escuchando. Lo que hay es un kernel que, para ese proceso, responde que el fichero no estĂĄ y que no hay red.
La imagen que lo resuelve: con una API tĂș estĂĄs fuera y pides. Con un sandbox tĂș estĂĄs dentro y el suelo decide.
La tabla#
| QuĂ© es | DĂłnde estĂĄs tĂș | Su vocabulario | QuiĂ©n decide | Si el programa NO colabora | |
|---|---|---|---|---|---|
| API | Un catålogo de operaciones que un servicio ofrece. Pides una y te responde | Fuera, llamando a la puerta | GET, POST, DELETE⊠o funciones de una biblioteca | El servicio que la publica | Nada la detiene: el programa conserva todo lo demås del sistema. La API solo acota lo que le pide a ese servicio |
| MCP | Un protocolo que le declara a un modelo de IA qué herramientas tiene | Fuera, pidiendo herramientas | tools/list, tools/call | El servidor de herramientas | Igual: el modelo no usa otras herramientas, pero el proceso que lo ejecuta mantiene sus permisos intactos |
| Sandbox | Un entorno de ejecución con una porción declarada del sistema dentro | Dentro. Es el suelo que pisas | open, read, connect, execve⊠(llamadas al sistema) | El kernel | Puede intentar lo que quiera y el kernel se lo niega. No depende de su buena voluntad |
La diferencia que decide cuĂĄl usar#
Una API y un MCP son fronteras con las que el programa colabora. Funcionan porque el programa decide pedir las cosas por ahĂ.
Un sandbox funciona sobre un programa que no colabora: uno que llama directamente a open("/home/tĂș/.ssh/id_rsa") sin pasar por ninguna API. No hay nada que le impida hacer esa llamada; lo que hay es un kernel que responde que ese fichero no existe.
De ahĂ la regla prĂĄctica:
Si puedes confiar en que el cĂłdigo use solo tu API, no necesitas un sandbox. Si no puedes confiar en eso âporque el cĂłdigo es ajeno, generado o simplemente desconocidoâ, la API no te protege de nada.
Y se combinan, que es lo habitual#
No compiten, y hay un detalle que explica por quĂ© se confunden tanto: un sandbox casi siempre se maneja con una API. En este repositorio, sandboxctl y el panel en 127.0.0.1:9093 levantan jaulas, las apagan y consultan su estado. Esa API gobierna el sandbox desde fuera; no es el sandbox, igual que el mando de una grĂșa no es la grĂșa.
Un agente de IA real usa los tres a la vez:
flowchart LR
M["đ€ Modelo"] -->|"herramientas declaradas"| MCP["đ Servidor MCP"]
MCP -->|"operaciones expuestas"| API["đ API del servicio"]
MCP --> S
subgraph S["đ Sandbox"]
T["âïž La herramienta que ejecuta cĂłdigo"]
end
S -.->|no existe| H["đ El resto de tu equipo"]
El MCP decide quĂ© herramientas hay. La API decide quĂ© operaciones ofrece cada servicio. El sandbox decide quĂ© puede tocar del sistema la herramienta que de verdad ejecuta algo â y es el Ășnico de los tres que sigue en pie si la herramienta hace algo que nadie previĂł. Eso es exactamente el caso 08.
Lo que un sandbox NO es#
- No es un antivirus. No busca amenazas conocidas: limita lo que cualquier
programa puede hacer, conocido o no.
- No es una promesa absoluta. Un sandbox rootless comparte kernel contigo:
contiene muy bien a un script descuidado y mucho peor a alguien con un exploit de kernel en la mano.
- No sustituye a leer el cĂłdigo. Reduce el coste de equivocarte, no la
necesidad de tener criterio.
Siguiente paso#
- Comparativa: sandbox, Docker, WSL y unikernel â en quĂ© se diferencian de verdad
- CatĂĄlogo completo â los 36 casos, con ficha propia cada uno
- Suite de contenciĂłn â cĂłmo se comprueba que contiene