Por qué Bromure Agentic Coding no es un sandbox
Un sandbox le pide a un desarrollador que renuncie a la velocidad que hace que un agente de programación valga la pena — pre-aprobar cada dependencia, mantener una lista de dominios permitidos, no tocar nunca un paquete que la organización no haya verificado. Así que los desarrolladores lo apagan. Bromure Agentic Coding rechaza ese trato. No restringe lo que hace el agente; traza una sola línea dura en el hipervisor y te deja hacer cualquier cosa por dentro. Este es el argumento fundacional de por qué una frontera le gana a un sandbox, y las tres garantías que la frontera hace ciertas: ninguna credencial que robar, tokens amplios estrechados en el cable, y ataques de cadena de suministro detenidos antes de que el tarball aterrice — más la cuarta que la línea ahora hace cierta: inyecciones de prompt atrapadas en el contenido que el agente lee, antes de que el modelo las obedezca.
Un sandbox ofrece un trato: renuncia a parte de lo que hace útil a un agente de programación, y a cambio te mantendrá a salvo. Los desarrolladores rechazan ese trato cada vez — apagan el sandbox, o nunca lo encienden — y hacen bien. La tarea de un agente es moverse rápido por territorio desordenado y sin verificar. Bromure Agentic Coding no restringe eso. Traza una sola línea dura, en el hipervisor, y te deja hacer lo que quieras por dentro de ella.
Un artículo fundacional — escrito una vez, para que el resto apunte a él. No sobre un incidente. Sobre por qué construimos Bromure Agentic Coding como lo hicimos, y por qué «es un sandbox» es la descripción que no dejamos de corregir.
Un desarrollador no es un sysadmin.
La razón para poner un agente de programación en tu máquina es la velocidad — la concreta: traer un paquete que nadie en tu empresa ha verificado, a las once de la noche, para ver si una idea se sostiene. Probar la librería, ejecutar su ejemplo, tirarlo si no encaja. Eso no es un defecto que disciplinar fuera de la gente. Es el flujo de trabajo, y toda la razón por la que vale la pena tener el agente.
Así que cualquier modelo que te haga pre-aprobar cada dependencia, o que haga que alguien mantenga una lista de dominios que el agente puede alcanzar, está en guerra con lo que protege. Ralentiza la única actividad para la que fue desplegado — y un control que estorba al envío tiene exactamente un destino: lo apagan. Un control que un desarrollador apaga para sacar el trabajo adelante nunca fue un control.
«Monta un mirror privado y verificado» se pierde el punto del mismo modo: los paquetes que importan para experimentar son los que nadie ha verificado todavía. Un mirror de dependencias aprobadas es un mirror de las ideas de ayer.
Así que la pregunta no es cómo impedir que los desarrolladores toquen código sin verificar. Tienen que hacerlo; ese es el trabajo. Es cómo dejarles tocarlo todo, libremente, sin que su llavero forme parte del trato.
El sandbox hecho para producción no encaja en el banco de pruebas.
El primer recurso es un sandbox de red — los contenedores blindados, los de NVIDIA, las recetas de Docker-Compose que circulan. La forma es siempre la misma: enumerar los hosts que el agente puede alcanzar, denegar el resto. Funciona de maravilla cuando el agente tiene una tarea conocida y estrecha. Un agente de producción hablando con tres servicios internos y un endpoint de modelo vive detrás de una lista de permitidos para siempre, porque la lista es corta y deja de cambiar.
La ideación no tiene lista corta, y nunca deja de cambiar. Nadie quiere mantener una lista blanca de cada registro, CDN, host de Git y API puntual que un experimento podría alcanzar — nunca está terminada, crece cada tarde, y el día que bloquea algo legítimo es el día que el desarrollador la desactiva para desbloquearse. La lista de permitidos no está mal; asegura un agente cuyo alcance ya se conoce. Todo el valor del banco de pruebas es que el alcance no se conoce todavía.
Toma una tarde concreta. Un desarrollador tiene archivos de configuración
de Node que han crecido a decenas de megabytes, y el parser de YAML que
usa se atraganta con ellos. Hay varios candidatos — js-yaml, yaml,
yaml-js — y la única forma de saber cuál sobrevive a un archivo de 40 MB
sin reventar el heap es instalar los tres y lanzarles el archivo. Abrir un
ticket para meter tres librerías en el mirror privado para poder
compararlas es exactamente al revés: el desarrollador quiere probar
primero y promover al ganador al mirror, no al contrario. La verificación
previa es la puerta por la que existe el experimento para cruzar.
Hay un problema más silencioso debajo. Estas herramientas blindan al
agente en producción — desplegado, acotado, supervisado. Pero un
compromiso de la cadena de suministro aterriza en el portátil del
desarrollador, en mitad del experimento, con credenciales reales en
~/.aws y ~/.npmrc porque ahí es donde los desarrolladores las
guardan. El modelo es más fuerte donde no están los ataques, y ausente
donde sí están.
El sandbox del gato y el ratón pierde la segunda ronda.
El otro instinto es dejar al agente en el host y encarcelar el proceso —
bloquear que el proceso claude lea ~/.ssh y ~/.aws. Parece
hermético, hasta que recuerdas que la tarea del agente es escribir código,
y el código corre en la misma máquina.
El agente arma el esqueleto de un proyecto. Luego tú — o el agente, o una
segunda herramienta — ejecutas npm install en el repo que acaba de
escribir. Ese npm install no es el proceso encarcelado. Su hook
postinstall lee ~/.aws/credentials como cualquier otro programa en tu
portátil, porque es exactamente eso: otro programa, compartiendo el único
sistema de archivos y el único llavero con todo lo demás que ejecutas.
La cárcel trazó su frontera alrededor de un proceso. El peligro nunca fue
el proceso; fue que cada proceso en la máquina comparte un sistema de
archivos y un llavero. Así que parcheas — encarcelas también la shell,
luego node, luego el gestor de paquetes — y el atacante sigue
encontrando una puerta que no cerraste, porque en un host siempre hay otro
proceso, otro camino a los mismos secretos. Ese es el juego, y la casa
siempre tiene otra puerta.
Traza la línea una vez, con el hipervisor.
Bromure deja de jugar moviendo la frontera un nivel hacia abajo. El agente, las shells que lanza, los paquetes que instala, y cualquier código que esos paquetes ejecuten viven todos dentro de una VM Linux por perfil. Tus credenciales reales nunca entran en ella.
La diferencia es el tipo de línea. Una cárcel de procesos es una política sobre un proceso, y un proceso hermano la esquiva. La frontera de la VM es el muro entre el invitado y el host, impuesto por el hipervisor — el mismo muro que impide que una VM lea la memoria de otra. No hay syscall para cruzarlo. El código de dentro no puede razonar su camino hasta tu llavero, porque el llavero no está en su mundo en absoluto.
Y dentro de esa línea, eres libre. Instala el paquete sin verificar.
Corre su postinstall. Deja que el agente reescriba la config de tu
shell, llene el disco, rompa el toolchain. La VM es desechable y nunca
contuvo nada que importe. Esa libertad es todo el punto — exactamente lo
que un sandbox quita y lo que una frontera limpia devuelve. No consigues
seguridad haciendo el banco de pruebas menos útil; la consigues haciendo
del banco un lugar donde, para empezar, no había nada valioso en la sala.
Esa misma línea es donde tres garantías dejan de ser consejos que el agente puede invalidar y se convierten en hechos impuestos por debajo de él — porque todo lo que la VM hace hacia el exterior tiene que cruzarla.
Tres cosas que la línea hace ciertas.
Ninguna credencial que robar — el secreto nunca estuvo en la sala.
Los tokens reales se quedan en el host. La VM recibe stubs: archivos
de credenciales sintácticamente válidos cuyo contenido no significa nada
en la internet pública. Cuando el agente hace una llamada legítima que
necesita un token real, un proxy del host intercambia el stub por el
secreto real en el cable y lo vuelve a intercambiar de salida en la
respuesta. Una dependencia comprometida que barre el sistema de archivos
buscando ~/.aws/credentials, ~/.npmrc o id_rsa encuentra
placeholders. Esto es el intercambio de tokens: la credencial existe,
el agente la usa para lo que es, y la copia que podría robarse no existe
en ningún sitio que el mundo del agente pueda alcanzar.
Estrechar el token amplio — preguntar antes de usar, preguntar antes de mutar.
Los tokens reales suelen ser más amplios que la tarea. El intermediario
mantiene las concesiones de corta vida y acotadas, y — la parte que se gana
el sustento — trata una lectura y una escritura de forma distinta. Una
lectura pasa. Una llamada que cambia el estado — un git push, un
DROP TABLE, un Terminate* de AWS — se pausa en la frontera y te
pregunta, en el host, mostrando la operación literal, no un resumen que
escribió el agente.
Eso cambia lo que significa un token amplio. Uno que podría borrar producción solo puede hacerlo cuando un humano vio la llamada exacta y dijo que sí; el alcance impreso en la credencial deja de ser el radio de impacto. El agente no puede pre-aprobarse a sí mismo, bajar el modo, ni leer la concesión — la decisión vive al otro lado de la línea. Cuando un agente borró una base de datos de producción en nueve segundos, el principio era el mismo: lo que quiere ejecutar el comando no debería ser lo que decide que es seguro.
No seas el primero en enterarte — cadena de suministro detenida en la puerta.
El mejor momento para detener un paquete envenenado es antes de que
aterrice. Cada descarga cruza la frontera, así que el proxy la escanea —
OSV para CVE conocidos, socket.dev para lo que las bases de datos
aún no han pillado: scripts de instalación maliciosos, typosquats, el
compromiso publicado hace una hora. Y aplica un enfriamiento: cualquier
versión de los últimos dos días (ajustable) simplemente no es instalable
mientras el ecosistema se pone al día. Toda la ventana de un gusano es el
hueco entre publicar y retirar; rechazar paquetes de un día es negarse
a ser el canario. Los hooks postinstall se quitan del tarball a la
entrada, con el hash arreglado para que la instalación siga verificando —
así que el paquete que aterriza aterriza inerte. Nada de esto le pide al
desarrollador que verifique nada. Traen lo que quieran; la frontera es lo
que espera.
La mayoría de las herramientas cubren una capa. Bromure las cubre todas.
Aislamiento, mantener los secretos fuera del agente, acotar cómo se usan, escanear la cadena de suministro, atrapar la inyección de prompts: el campo suele elegir solo una. Aquí está el mismo modelo de amenazas del agente aplicado a las herramientas a las que recurre la gente, y dónde termina cada una.
| Protección | Dev ContainerVS Code | nonokernel sandbox | agent-vaultoctokraft | Agent VaultInfisical | Docker SandboxesmicroVM | BromureAgentic Coding |
|---|---|---|---|---|---|---|
Frontera de aislamiento Dónde se detiene el radio de daño | Mismo contenedor, kernel compartido | Allowlists de kernel, sin kernel propio | El agente corre en el sitio | Solo proxy; agente sin aislar | microVM, su propio kernel | VM por hardware, su propio kernel |
Mantener los secretos fuera del agente ¿Puede llegar a leer la credencial real? | Reenvía el agente SSH + creds de git | Bloquea archivos de claves; intermedia algunos | Entran por pipe; sin ruta de lectura | El proxy las adjunta en el cable | El proxy del host inyecta cabeceras | Stub intercambiado en el cable |
Alcance y aprobación de credenciales Límites por uso, solo lectura, caducidad, consentimiento | Sin acotar por uso | Flujo de aprobación + filtro de egress | TTL por secreto; bloquea shells | Filtro de egress por endpoint | Allowlist de dominios; el código en la VM aún puede usarla | Consentimiento por destino + TTL |
Escaneo de la cadena de suministro Atrapar paquetes maliciosos / vulnerables | Sin escaneo del registro | Solo firmas, sin escaneo de paquetes | Fuera de alcance | Fuera de alcance | Sin escaneo de paquetes | Age-gate, OSV, socket.dev |
Detección de inyección de prompts Escanea contenido no confiable y archivos de reglas | — | — | — | — | — | PromptGuard + ModernBERT |
Registro de auditoría Registrar lo que hizo el agente | Solo logs del contenedor | Auditoría local inmutable | — | Registro de solicitudes | Registro de solicitudes | Traza de sesión completa, cifrada |
Inventario de cadena de suministro(Enterprise) Un registro de cada paquete descargado | — | — | — | — | — | Cada dependencia + veredicto, con búsqueda |
Uso de tokens(Enterprise) Qué archivos consumen más tokens | — | — | — | — | — | Por archivo, repo y modelo |
Ocultar un token no es lo mismo que gobernar su uso. Docker Sandboxes mantiene el valor real fuera de la VM, pero su proxy igualmente adjunta esa credencial a cualquier solicitud saliente que haga la sandbox, así que un paquete comprometido instalado por un lado puede gastarla contra un servicio de la allowlist sin verla nunca. Solo Bromure escanea el paquete antes de que se ejecute y condiciona cada uso — consentimiento, solo lectura, un TTL — aplicando los cinco controles en una sola frontera que el agente no puede rodear.
Recopilado de la documentación pública de cada proyecto, junio de 2026. Aquí, agent-vault se refiere a octokraft/agent-vault (inyección de secretos por pipe), distinto del Agent Vault de Infisical (proxy de credenciales HTTP). Docker Sandboxes es una vista previa experimental cuyas credenciales intermediadas siguen siendo utilizables por cualquier cosa dentro de la VM. El inventario de paquetes de toda la flota y los desgloses de uso de tokens se ofrecen en Bromure Enterprise Manager. Estas herramientas cambian rápido: ¿ves algo desactualizado? Avísanos.
La cuarta cosa: una instrucción en los datos no es una orden.
Las tres garantías de arriba comparten una suposición que vale la pena
hacer explícita: todas defienden contra código que toma algo — una
credencial, un token, la oportunidad de ejecutarse de un tarball recién
publicado. Hay un ataque que no toma nada. Simplemente le dice al
agente qué hacer. Una línea enterrada en un README que el agente lee,
una cadena en una página descargada, una frase en la salida de una
herramienta, una directiva oculta en el CLAUDE.md que el agente trata
como órdenes permanentes — el modelo la ingiere como contexto y la
obedece como instrucción. Filtra el archivo. Debilita la comprobación.
Sáltate el test. Un sandbox no tiene opinión sobre nada de esto, porque
nada cruzó un muro que él vigile: la instrucción llegó como datos, en
contenido que el agente debía leer.
Pero sí cruzó la línea — todo lo que el modelo ve la cruza. Así que
desde la 2.4.0, la frontera lo lee primero, en el
dispositivo, del lado del host. Un clasificador local PromptGuard
puntúa el contenido no confiable que fluye hacia el modelo — lecturas
de archivos, descargas web, salida de herramientas — en busca de
instrucciones que no pintan nada ahí. Y los archivos de reglas que un
agente obedece sin cuestionar — CLAUDE.md, AGENTS.md, GROK.md —
reciben una doble pasada más severa: un escaneo determinista de Unicode
invisible, trucos de texto bidireccional y metadirectivas del tipo
«ignora las instrucciones anteriores», más un clasificador ModernBERT
afinado para el abuso de redacción serena que un filtro de palabras
clave pasa por alto. Por perfil eliges los dientes: registrarlo en el
Security Log, preguntar y ver el texto marcado, o bloquear la
solicitud antes de que el modelo vea siquiera el tramo envenenado. Nada
sale del Mac.
La colocación es el mismo argumento que las otras tres. A un agente que ya se ha tragado una inyección no se le puede confiar el reportarla — la primera instrucción de la inyección suele ser alguna versión de no menciones esto. El detector no le pregunta al agente. Lee el tráfico al otro lado de la línea, donde la persuasión del agente no llega.
Donde la línea no te salva.
Una frontera es una forma concreta, no una palabra mágica. Cuatro bordes honestos:
El perfil es de larga vida, así que la persistencia persiste.
Un perfil de Bromure no es un disco desechable. Una carga que se escribe a sí misma en una ruta de arranque puede despertar en la siguiente sesión — ante un invitado sin claves del host y un intermediario que solo habla tokens de corta vida, confirmados y acotados. Presencia en una sala sin nada dentro, pero presencia al fin y al cabo.
Una escritura que apruebas es una escritura que ocurre.
La confirmación atrapa la llamada de la que el agente no te avisó. No
lee tu diff. Aprueba un git push y Bromure lo reenvía — incluyendo,
en principio, un workflow envenenado que no notaste. Mueve la decisión
hacia ti y muestra la operación real; leerla sigue siendo tarea tuya.
El enfriamiento es una ventana, no un muro.
Dos días están ajustados al hueco observado entre publicar y retirar. Un atacante paciente puede sentarse sobre una versión comprometida más allá del enfriamiento y ser instalable al tercer día. Mata de hambre a los gusanos del mismo día; no avala un paquete que simplemente se hizo viejo. socket.dev y OSV todavía tienen que hacer su parte.
Acota el intermediario a propósito.
El aislamiento contiene la explosión; la acotación decide cuán grande pudo haber sido. Un perfil que solo lee un repo no debería tener un token que lo escribe; uno que nunca publica no debería tener ningún token de publicación. La línea mantiene los secretos fuera de la VM — qué secretos existen en absoluto sigue siendo decisión tuya.
La línea que mantendremos.
Aquí va el compromiso. Un desarrollador no debería tener que convertirse en sysadmin — mantener una lista de permitidos, autorizar de antemano cada dependencia, renunciar a la velocidad que hizo que un agente valiera la pena — para conservar su llavero. Un sandbox hace de la seguridad un trato contra la utilidad, y los desarrolladores, sensatamente, siguen eligiendo la utilidad. Una frontera rechaza el trato: haz cualquier cosa por dentro, porque el dentro es prescindible, y las cuatro cosas que importan — tus credenciales, el alcance de tus tokens, los paquetes que te llegan, las instrucciones que llegan a tu modelo — se deciden en una línea con la que el código de dentro no puede discutir.
Por eso «es un sandbox» es la descripción que no dejaremos de corregir. Un sandbox restringe al agente. Bromure restringe la frontera, y libera al agente. Bromure Agentic Coding es gratis, de código abierto, y disponible hoy.