Satélite Intermedio–Avanzado Seguridad agéntica

Sandbox y permisos: lo que vuelve operable a un agente

Permisos por herramienta y recurso, sandbox de ejecución, presupuestos duros y HITL en el punto irreversible: los guardrails que vuelven operable a un agente, y cómo se testean.

Antes de leer: Nociones de contenedores.

Subtítulo: Los guardrails que separan una demo de algo operable —permisos por herramienta y recurso, sandbox de ejecución, presupuestos duros y aprobación humana en el punto exacto— y por qué cada uno se testea probando que la acción prohibida se rechaza.

Nota de alcance. Ejemplos ilustrativos sobre sistemas ficticios. Las herramientas de aislamiento y sus modos cambian rápido; los detalles concretos revalidalos contra tu plataforma. Acá se testean defensas propias, no se ataca nada ajeno.


Resumen ejecutivo

  • Una demo de agente y un agente que se puede operar se parecen en el video y se diferencian en todo lo demás: la diferencia son los guardrails. La demo muestra lo que el agente puede hacer; lo operable define lo que no puede.
  • Los permisos se dan por herramienta y por recurso, no por agente entero: allowlists explícitas, read-only por defecto, y modos de aprobación para lo que escribe.
  • Ejecutar código generado sin sandbox es ejecutar código no revisado en tu máquina: el sandbox no es un lujo de la ejecución de código, es su condición.
  • Los presupuestos de tokens, tiempo y dinero son un corte duro, no una advertencia. Una advertencia que no frena nada es un comentario, no un control.
  • El HITL se pone en el punto irreversible exacto, no en todos lados; y decidir qué se pregunta y cuándo es diseño de UX de seguridad. Todo guardrail se testea probando que lo prohibido efectivamente se rechaza.

Al terminar vas a poder diseñar permisos por herramienta y recurso, decidir qué ejecutar en sandbox, poner presupuestos como corte duro, ubicar el HITL en el punto de no retorno y escribir la prueba negativa que verifica que cada guardrail frena.


1. El problema: la demo funciona; lo operable es otra cosa

Un agente que en una demo abre el navegador, busca, edita un archivo y corre un script es hipnótico. También es, tal cual está, imposible de poner en producción sobre datos o infraestructura reales. La demo optimiza para mostrar capacidad; la operación exige lo contrario: acotar qué puede pasar cuando nadie está mirando y una instrucción hostil se cuela en el contexto.

Esa distancia tiene nombre: guardrails. No son un accesorio que se agrega si sobra tiempo; son lo que convierte “el agente puede hacer X” en “el agente puede hacer X solo bajo estas condiciones”. El pilar de esta colección mostró por qué la seguridad de un agente es una condición de diseño; este artículo baja esa idea a los cuatro controles concretos que la hacen operable, y a cómo se prueba cada uno.

2. Permisos por herramienta y por recurso

El primer error es razonar en términos de “el agente tiene acceso”. El acceso no es del agente: es de cada herramienta sobre cada recurso. Un agente con diez tools tiene diez superficies distintas, y cada una merece su propio permiso.

Tres reglas ordenan el diseño:

  • Allowlist, no denylist. Se enumera lo permitido, no lo prohibido. Una denylist siempre olvida un caso; una allowlist falla cerrada: lo que no está listado, no se puede.
  • Read-only por defecto. Una herramienta arranca sin capacidad de escritura, y la escritura se concede explícitamente y acotada. Leer un ticket y cerrar un ticket son permisos separados.
  • Modos de aprobación por herramienta. Cada tool declara si corre sola, si pide confirmación, o si está deshabilitada en este contexto. La misma herramienta puede ser automática en staging y requerir aprobación en producción.

El permiso, además, es por recurso, no solo por tipo de acción. “Puede escribir en el repositorio” es demasiado grueso; “puede comentar en issues de este repo, no hacer push a main” es un permiso operable. Es la misma autorización por objeto que gobierna una API: un token no habilita a tocar cualquier cosa, sino un objeto específico bajo una regla. El threat modeling de una API de transferencias desarrolla esa lógica de autorización por objeto y función que acá se traslada a las herramientas.

3. Sandbox de ejecución: correr lo generado es correr lo no revisado

Cuando un agente ejecuta código —el que él mismo escribió o el que encontró—, aparece la regla más dura del capítulo: ejecutar código generado sin sandbox es ejecutar código no revisado en tu máquina. Nadie leyó ese código antes de correrlo; asumir que es inofensivo porque lo produjo el agente es exactamente la confianza que un atacante necesita.

El sandbox es el entorno aislado donde esa ejecución ocurre sin poder dañar el resto:

  • Contenedores o microVMs que aíslan el proceso del host.
  • Filesystem efímero: se crea para la tarea y se destruye al terminar; nada persiste ni escala privilegios entre corridas.
  • Perfil de red restringido: sin salida a Internet por defecto, o con una allowlist mínima de destinos. Esto no es solo higiene: cortar la red corta un canal de salida de la tríada letal. Un sandbox sin red vuelve la exfiltración mucho más difícil aunque la inyección haya funcionado.

El sandbox no es opcional cuando hay ejecución de código. Un agente que corre scripts contra tu filesystem real, con red abierta y permisos del usuario, no tiene un problema de seguridad potencial: tiene uno actual esperando el input correcto.

4. Presupuestos como corte duro, no como advertencia

Un agente decide su propio control de flujo, así que puede iterar de más: reintentar, ramificar, quedar en loop. Sin un techo, eso se traduce en costo —de tokens, de tiempo, de dinero real cuando cada acción llama a un servicio pago—. La lección negativa de los loops autónomos de 2023 fue exactamente esa: sin freno, divagan y queman presupuesto.

La regla es que el presupuesto sea un corte duro, no una advertencia. Un log que dice “llevás muchos tokens” no frena nada; es un comentario. Un corte duro aborta la corrida al tocar el techo: tantos tokens, tantos segundos, tanto gasto, y el agente se detiene con un estado explícito de “presupuesto agotado”. Esa condición de parada por presupuesto es parte del diseño del agente antes que de su seguridad, y tiene su propio desarrollo en Condición de parada y presupuestos del agente. Desde la óptica de seguridad, agrega algo: un presupuesto duro acota también el daño de un agente secuestrado, que no puede iterar indefinidamente ejecutando la voluntad del atacante.

5. HITL en el punto irreversible, y la UX de qué se pregunta

El human-in-the-loop es el guardrail que detiene al agente para pedir aprobación antes de una acción que no se puede deshacer. Su valor depende por completo de dónde se coloca. Pedir confirmación en cada paso convierte al agente en un formulario tedioso y entrena al humano para apretar “sí” sin leer —fatiga de aprobación, que es peor que no preguntar—. Pedirla en ninguno deja pasar lo irreversible.

El HITL va en el punto de no retorno exacto: mandar el mail, mover el dinero, borrar el recurso, publicar el cambio. Y ahí aparece un diseño que es, literalmente, UX de seguridad: qué se pregunta y cuándo.

   acción que el agente quiere ejecutar


     ¿es reversible y de bajo impacto?
        │                     │
       sí                     no
        ▼                     ▼
   correr sola          pedir aprobación
   (auto)               en el punto exacto

              ┌──────────────┴──────────────┐
              │  mostrar: qué acción,        │
              │  sobre qué recurso,          │
              │  con qué efecto irreversible │
              └──────────────┬──────────────┘
                     aprueba  │  rechaza
                        ▼      │     ▼
                    ejecutar   │   abortar + registrar

Una buena pregunta de aprobación muestra la acción concreta, el recurso afectado y el efecto —no un genérico “¿continuar?”—. La aprobación informada es un control; el clic reflejo no lo es.

6. Cómo se testea que un guardrail realmente frena

Un guardrail no probado es decoración. Y la prueba de un guardrail no es que la acción permitida funcione: es que la acción prohibida se rechace. Es la misma idea del gate que valida al gate del red teaming como regresión: se verifica el control en la dirección del bloqueo, no en la del paso feliz. Un permiso read-only del que solo probaste que lee, sin probar que la escritura se deniega, no está verificado: está supuesto.

ControlQué previeneCómo se testea
Allowlist de herramientasUso de una tool no autorizada en este contextoInvocar una herramienta fuera de la lista y verificar que se rechaza
Read-only por recursoEscritura o borrado no autorizadosIntentar la escritura prohibida y verificar denegación + que el recurso no cambió
Sandbox sin redExfiltración y acceso al host desde código generadoCorrer una tarea que intente salir a la red y verificar que no hay salida
Filesystem efímeroPersistencia y escalada entre corridasEscribir un archivo, terminar la tarea y verificar que no sobrevive
Presupuesto duroLoops y costo sin techoForzar una corrida larga y verificar que aborta al tocar el límite
HITL en lo irreversibleAcción de no retorno sin aprobaciónDisparar la acción y verificar que queda pendiente, sin ejecutarse, hasta aprobación

Cada fila es una prueba negativa: define una acción que no debe ocurrir y verifica que el guardrail la frena. Corridas en CI, son la evidencia de que “el agente está acotado” es un hecho medible y no una intención. Es el mismo criterio de siempre: un control existe en el diseño, pero solo una prueba demuestra que funciona.

Este satélite baja a controles concretos el marco del pilar La tríada letal: cada guardrail de acá rompe o adelgaza una de sus patas. Para el corte por presupuesto como condición de parada del agente, Condición de parada y presupuestos del agente.

Relacionados en el blog

esc
↑↓ navegar abrir