Volver a todas las publicaciones
Publicado el · por Renaud Deraison

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.

TU PORTÁTIL — un sistema de archivos, un llaveroCÁRCEL DE PROCESOSclaude✗ read ~/.ssh✗ read ~/.awsbloqueado — parece hermético./repo — recién escrito por el agentepackage.json "postinstall": "node x.js"SEGUNDA SHELL — no encarcelada$ npm install corre postinstallotro proceso que la cárcel nunca nombróLLAVERO~/.aws/credentials~/.ssh/id_rsa~/.npmrctokens reales✗ la cárcel rechaza este caminolee creds reales — nadie encarceló esto
El agujero del gato y el ratón. Una cárcel de procesos bloquea que el proceso claude llegue al llavero (el camino punteado, rechazado). Pero la salida real del agente — un repo con un hook postinstall — corre en un proceso hermano del que la cárcel nunca oyó hablar. Abre una segunda shell, ejecuta npm install, y su postinstall lee ~/.aws/credentials libremente y exfiltra, porque en un host cada proceso comparte un sistema de archivos y un llavero. La cárcel trazó su frontera alrededor de lo equivocado: el peligro nunca fue el proceso nombrado, fue la máquina compartida.

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.

VM POR PERFIL — instala lo que sea, corre lo que sea, rompe lo que seaagente · shells lanzadas · npm / pip · código postinstall no confiableel FS solo tiene stubs — aws_secret = stub-… _authToken = stub-… id_rsa = stub-…nada aquí es real, así que nada aquí vale la pena robardescargar un paqueteusar una credencialpush / drop / deleteFRONTERA DEL HIPERVISOR — la única línea que el código de dentro no puede cruzar① Bloquear paquetes maliciososescaneo: OSV + socket.devenfriamiento: < 2 días retenidoel tarball malicioso nunca aterriza② Sin creds que robarstub-token ⇄ real tokenintercambiado en el cableel barrido del host halla placeholders③ Preguntar antes de mutarlectura pasa · escritura pausaconfirmación en el hostves la llamada literalHOST — tokens reales, detrás del intermediario~/.aws · ~/.ssh · ~/.npmrc — nunca entran en la VM, se inyectan solo en el cable, solo para una llamada que permitiste
Una frontera, tres controles, impuestos por debajo del agente. Dentro de la VM el agente hace lo que quiere. Pero cada cruce está mediado por el hipervisor: una descarga de paquete se escanea (OSV + socket.dev) y se retiene si es más joven que el enfriamiento; un uso de credencial topa con un stub que el proxy del host intercambia por el token real en el cable y vuelve a intercambiar de salida; una escritura que cambia el estado se pausa para pedir confirmación en el host. El llavero real está debajo de la línea y nunca entra en la VM. El agente no puede rodear nada de esto, porque no hay camino a través de la frontera salvo por ella.

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.

Donde todo lo demás se queda corto

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
Total — integrado, aplicado Parcial — limitado u opcional Ninguno — sin cubrir

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.