Proyectos / Agent Sandbox Boundaries

Agent Sandbox Boundaries

Ejecutor efímero con Wasmtime que permite observar los límites de CPU, tiempo transcurrido, memoria invitada y capacidades de acceso al sistema de archivos y la red.

Autor: · Python 3.11.9 y Wasmtime 50.0.1 · Licencia: MIT

Ficha publicada: · Ficha actualizada:

Repositorio · Evidencia original · Release v0.1.0

Problema y utilidad para agentes

Un tiempo máximo en un subproceso no impide que el código generado acceda al sistema de archivos, se conecte a la red o aumente su consumo de memoria. El mecanismo real de aislamiento debe ser explícito.

El ejecutor procesa WebAssembly binario de tipo core con límites y una interfaz WASI restringida. Rechaza las solicitudes de política no admitidas en lugar de ignorarlas.

Arquitectura

  1. Validar la política. Acepta únicamente Wasm binario con límites, cero escrituras del invitado a disco, acceso de red denegado y límites de memoria invitada admitidos.
  2. Aplicar los límites con Wasmtime. Cada ejecución usa un proceso de trabajo y un almacén nuevos, límites POSIX de CPU, presupuesto de instrucciones, límites de memoria y tablas del invitado y un plazo de tiempo transcurrido controlado por el proceso padre.
  3. No conceder capacidades implícitas. WASI Preview 1 no hereda entorno, argumentos, archivos, directorios ni sockets. Los procesos de trabajo y directorios temporales se limpian al terminar.

Qué demuestra

  • Pruebas controladas de recorrido de rutas y límites de recursos con archivos señuelo sintéticos propios.
  • Rechazo explícito de cuotas de disco positivas, acceso de red y límites de memoria del proceso que no se admiten.
  • Registro de la política, el hash del módulo y el resultado observado en cada prueba de límites.

Resultados publicados

Diecinueve pruebas de límites y tres comprobaciones de perfiles no admitidos se ejecutaron una vez en un Intel Xeon W-3223, con 48 GiB de RAM, Python 3.11.9 y Wasmtime 50.0.1.

La matriz comprueba estados y valores esperados, la integridad de los archivos señuelo y la ausencia de archivos creados. Las pruebas de CPU y tiempo transcurrido se ejecutaron bajo el bloqueo exclusivo compartido para mediciones.

Límites de aislamiento observados

Resumen de resultados ·
LímiteResultado observado
CPU y ejecuciónAgotamiento del presupuesto de instrucciones y terminación por límite de CPU del sistema operativo
Tiempo transcurridoLa espera bloqueante de WASI se detuvo al vencer el plazo del proceso padre
Memoria invitadaCrecimiento denegado; memoria sobredimensionada rechazada; acceso inválido detenido
Sistema de archivosEl recorrido de rutas, el acceso a archivos señuelo y la creación de archivos devolvieron un error de descriptor inválido
RedEnvío por socket denegado; importación para crear sockets rechazada
Ciclo de vidaArgumentos y entorno vacíos; estado nuevo de la instancia
Todos los resultados registrados19/19 coincidieron
Perfiles no admitidos3/3 rechazados

Wasmtime aporta el mecanismo de aislamiento; el subproceso controla el ciclo de vida y los plazos. Estas observaciones son evidencia sintética de regresión, no una certificación de seguridad ni una garantía de que sea imposible escapar.

Reproducir

Python 3.11.9 en macOS o Linux, con Wasmtime fijado en 50.0.1. Instalá los requisitos del repositorio antes de ejecutar las comprobaciones.

El comando de estrés usa el bloqueo compartido del espacio de trabajo original. En otra instalación, aplicá un bloqueo exclusivo equivalente al mismo módulo de experimento. No ejecutes cargas de estrés concurrentes y usá una ruta de salida nueva. El comando de regresión sin estrés es independiente.

Comprobar los límites admitidos

git clone https://github.com/lucioduran/agent-sandbox-boundaries.git
cd agent-sandbox-boundaries
git checkout f67487bb807ca84bb1801eaee7cc81f072f71ac4
python3.11 -m venv .venv
. .venv/bin/activate
python -m pip install -r requirements-dev.txt
python -m pytest -q -m 'not stress'

Repetir el experimento local

OMP_NUM_THREADS=1 MKL_NUM_THREADS=1 OPENBLAS_NUM_THREADS=1 python3 /Users/luchoduran/Sites/open-source-projects/.coordination/benchmark_lock.py .venv/bin/python -m experiments.reproduce --output build/new-boundaries.json

Alcance y límites

  • Los límites de memoria cubren la memoria lineal invitada, no la memoria residente total del proceso de trabajo, las asignaciones del compilador ni toda la memoria del anfitrión.
  • Se confía en el entorno de ejecución y en el sistema operativo. Un motor comprometido queda fuera de este límite.
  • No se admiten montajes del sistema de archivos con escritura, cuotas de disco positivas, captura de salida ni listas de destinos de red permitidos. La evidencia de red comprueba capacidades denegadas, no el comportamiento de un cortafuegos a nivel de paquetes.
  • Solo se admite Wasm de tipo core con WASI Preview 1 en macOS y Linux. Windows y los componentes de Preview 2 se rechazan por defecto. Los llamadores deben limitar la concurrencia.

Fuentes y revisión

El informe registra el momento de ejecución, la revisión de implementación y los hashes de fuentes y módulos. La release revisada contiene esa evidencia. Los hashes de las pruebas con rutas absolutas de archivos señuelo dependen de la ruta temporal original.