MarkTechPostPublicación de la fuente

Conoce el sandbox-runtime de Anthropic: sandboxing a nivel de sistema operativo para agentes de IA, sin contenedores

En este artículo, hablaremos de la sandbox-runtime (srt)de Anthropic, de reciente tendencia y código abierto, el sandbox a nivel de sistema operativo que hay detrás de la herramienta bash aislada de Claude Code. El sandbox-runtime de Anthropic limita qué archivos puede tocar un proceso y qué hosts puede alcanzar.

En este artículo, hablaremos de la sandbox-runtime (srt)de Anthropic, de reciente tendencia y código abierto, el sandbox a nivel de sistema operativo que hay detrás de la herramienta bash aislada de Claude Code. El sandbox-runtime de Anthropic limita qué archivos puede tocar un proceso y qué hosts puede alcanzar. Lo hace sin iniciar un contenedor. Tampoco está ligado a Claude Code. Tus propios agentes, servidores MCP locales y programas simples de línea de comandos pueden ejecutarse dentro de él.

TL;DR

  • Tamaño: paquete npm @anthropic-ai/sandbox-runtime v0.0.81, unos 11.4 MB descomprimido, Apache-2.0, Node.js 22.12+.
  • Funciona en: cualquier máquina de desarrollo o servidor de CI con macOS o Linux. macOS usa Seatbelt; Linux necesita bubblewrap, socat y ripgrep. Windows está en alfa.
  • Rendimiento: el sandboxing redujo los avisos de permisos de Claude Code en un 84% en el uso interno de Anthropic (autoreportado).
  • Lo mejor: un 84% menos de avisos de permisos, con límites de archivos y red aplicados a todo el árbol de procesos.
  • Lo peor: todavía es una vista previa de investigación en beta, y el soporte de Windows está en alfa.

¿Qué es el sandbox-runtime de Anthropic?

El sandbox-runtime de Anthropic es una herramienta de código abierto que envuelve cualquier proceso con restricciones de sistema de archivos y de red. Se instala con npm install -g @anthropic-ai/sandbox-runtime, y luego se antepone a un comando srt. Funciona como CLI y como biblioteca de TypeScript.

¿Cómo funciona sandbox-runtime en macOS, Linux y Windows?

srt utiliza las primitivas de aislamiento propias de cada sistema operativo. Sus restricciones cubren todo el árbol de procesos, incluidos scripts y subprocesos.

  • macOS: sandbox-exec con perfiles de Seatbelt generados dinámicamente. Solo se requiere ripgrep.
  • Linux: bubblewrap con el namespace de red eliminado. También necesita socat y ripgrep.
  • Windows (alfa): una cuenta dedicada srt-sandbox , un cerco de salida mediante Windows Filtering Platform y ACLs de archivos explícitas.

El tráfico sale únicamente a través de proxies HTTP y SOCKS5 que se ejecutan en el host. En Linux, esos proxies están detrás de sockets Unix montados mediante bind en el sandbox. En macOS, el perfil de Seatbelt solo permite un puerto de localhost. Los proxies aplican después tu lista de dominios permitidos y denegados.

¿Por qué necesita tanto el aislamiento del sistema de archivos como el de la red?

El equipo de Anthropic sostiene que la frontera 1 sin la otra falla. Sin aislamiento de red, un agente con inyección de prompt podría exfiltrar claves SSH. Sin aislamiento del sistema de archivos, podría escapar del sandbox y obtener acceso a la red.

Los valores predeterminados de srt siguen esa lógica. Las lecturas se permiten en todas partes salvo que se denieguen. Las escrituras se deniegan en todas partes salvo que se permitan. El acceso a la red se deniega a menos que un dominio esté en la lista de permitidos.

¿Cómo se hace sandbox de un servidor MCP o de tu propio agente?

Para un servidor MCP, cambia el command en .mcp.json de npx a srt. Pasa el comando original como argumentos. Las reglas quedan entonces en ~/.srt-settings.json:

Copiar código
{
  "network": { "allowedDomains": ["api.github.com", "*.npmjs.org"], "deniedDomains": [] },
  "filesystem": { "denyRead": ["~/.ssh"], "allowWrite": ["."], "denyWrite": [".env"] }
}

Para tu propio agente, la biblioteca expone SandboxManager. Llama a initialize(config) para iniciar los proxies. Luego wrapWithSandbox() devuelve una cadena de comando envuelta que puedes ejecutar.

¿Qué significa la cifra del 84%?

Anthropic informa que el sandboxing redujo las solicitudes de permiso en un 84% en el uso interno de Claude Code. Es una cifra autoinformada, no un benchmark externo. El objetivo es la fatiga de aprobación. Los desarrolladores que hacen clic en «aprobar» todo el día dejan de leer lo que aprueban. Una frontera fija permite al agente trabajar libremente dentro de ella y preguntar solo en el borde.

Back</button> <button class="btn pri" id="fnext">Siguiente paso </button> <button class="btn" id="fplay">Reproducción automática</button> </div> </div> <div class="pane" id="p-sim"> <div class="sim"> <div> <div class="card"> <h5>network.allowedDomains</h5> <label class="chk"><input type="checkbox" id="d-anth" checked> anthropic.com</label> <label class="chk"><input type="checkbox" id="d-npm"> *.npmjs.org</label> <label class="chk"><input type="checkbox" id="d-gh"> github.com</label> <h5 style="margin-top:12px">filesystem</h5> <label class="chk"><input type="checkbox" id="f-ssh" checked> denyRead: ~/.ssh</label> <label class="chk"><input type="checkbox" id="f-env" checked> denyWrite: .env</label> </div> </div> <div> <div class="cmds" id="cmds"> <button class="cmd" data-c="0">srt "cat README.md"</button> <button class="cmd" data-c="1">srt "cat ~/.ssh/id_rsa"</button> <button class="cmd" data-c="2">srt "curl anthropic.com"</button> <button class="cmd" data-c="3">srt "curl example.com"</button> <button class="cmd" data-c="4">srt "npm install"</button> <button class="cmd" data-c="5">srt "echo KEY=1 &gt;&gt; .env"</button> </div> <div class="term" id="term" style="margin-top:10px"><span class="dim">Elige un comando. Cambia la configuración para ver qué cambia.</span></div> <div class="why" id="why"></div> </div> </div> </div> <div class="pane" id="p-plat"> <div class="plat"> <div class="pc on" data-p="0"><h4>macOS</h4><span class="tag t-g">Compatible</span><ul><li>sandbox-exec</li><li>Perfiles de Seatbelt</li><li>Necesita ripgrep</li></ul></div> <div class="pc" data-p="1"><h4>Linux</h4><span class="tag t-g">Compatible</span><ul><li>bubblewrap</li><li>Sin namespace de red</li><li>socat + ripgrep</li></ul></div> <div class="pc" data-p="2"><h4>Windows</h4><span class="tag t-o">Alfa</span><ul><li>srt-sandbox account</li><li>Valla de salida WFP</li><li>Instalación única</li></ul></div> </div> <div class="desc pdetail" id="pdesc"></div> </div> <div class="pane" id="p-defs"> <div class="defs"> <div class="dc"><div class="kicker">Lectura</div><div class="big" style="color:#b5cc94">Permitir</div><p>Permitido en todas partes por defecto. Zonas denegadas como ~/.ssh; se vuelven a permitir con allowRead.</p></div> <div class="dc"><div class="kicker">Escritura</div><div class="big" style="color:#ef7a73">Denegar</div><p>Denegado en todas partes por defecto. Se abren rutas como "." y /tmp con allowWrite.</p></div> <div class="dc"><div class="kicker">Red</div><div class="big" style="color:#ef7a73">Denegar</div><p>Sin acceso por defecto. Cada host debe coincidir con allowedDomains.</p></div> </div> <div class="bars" id="bars"> <div class="kicker" style="margin-bottom:4px">Solicitudes de permiso de Claude Code (indexado)</div> <div class="bar"><div class="lb"><span>Sin sandbox</span><span>100</span></div><div class="bg"><div class="fg" data-w="100" style="background:var(--muted)"></div></div></div> <div class="bar"><div class="lb"><span>Con sandbox</span><span>16</span></div><div class="bg"><div class="fg" data-w="16" style="background:var(--orange)"></div></div></div> <div class="note">84% menos solicitudes en el uso interno de Anthropic (autoinformado, entrada de ingeniería de octubre de 2025). Indexado a 100.</div> </div> </div> <div class="pane" id="p-cmp"> <div class="tblwrap"> <table> <thead><tr><th></th><th>srt</th><th>Codex CLI</th><th>Docker Sandboxes</th><th>E2B</th></tr></thead> <tbody> <tr class="row"><td>Aislamiento</td><td class="hl">Primitivas del SO</td><td>Primitivas del SO</td><td>microVM</td><td>microVM Firecracker</td></tr> <tr class="row"><td>Se ejecuta</td><td class="hl">Local</td><td>Local</td><td>Local</td><td>Nube / BYOC</td></tr> <tr class="row"><td>Contenedor o VM</td><td class="hl">No</td><td>No</td><td>Sí</td><td>Sí</td></tr> <tr class="row"><td>Red por defecto</td><td class="hl">Denegar todo</td><td>Apagada (conmutable)</td><td>Política elegida</td><td>Activada</td></tr> <tr class="row"><td>Lista de dominios permitidos</td><td class="hl">Comodines + puertos</td><td>No revelado</td><td>Comodines + puertos</td><td>allowOut, comodines</td></tr> <tr class="row"><td>Licencia</td><td class="hl">Apache-2.0</td><td>Apache-2.0</td><td>No revelado</td><td>Apache-2.0 (SDK)</td></tr> </tbody> </table> </div> </div> <div class="ft"><span>Fuentes: github.com/anthropics/sandbox-runtime · anthropic.com/engineering · v0.0.81</span><span class="mtp">Creado por Marktechpost</span></div> </div> <script> (function(){ var R=document.getElementById('srt-x'); function post(){try{parent.postMessage({srtH:R.offsetHeight+40},'*')}catch(e){}} var tabs=R.querySelectorAll('.tab'); tabs.forEach(function(b){b.addEventListener('click',function(){ tabs.forEach(function(x){x.classList.remove('on')});b.classList.add('on'); R.querySelectorAll('.pane').forEach(function(p){p.classList.remove('on')}); var t=b.getAttribute('data-t');document.getElementById('p-'+t).classList.add('on'); if(t==='defs')bars();if(t==='cmp')rows();setTimeout(post,60); })}); // flujo var steps=[ ['Tu agente ejecuta un comando','El agente, el servidor MCP o la herramienta CLI emite un comando. No se modifica; srt simplemente lo envuelve.',0,'act'], ['srt construye la política','srt carga ~/.srt-settings.json (o los valores predeterminados integrados) e inicia proxies HTTP y SOCKS5 en el host.',1,'act'], ['El SO aplica el límite','Seatbelt (macOS), bubblewrap (Linux) o una barrera WFP (Windows alpha) aplican reglas de archivos a todo el árbol de procesos.',2,'act'], ['Todo el tráfico pasa por el proxy','El sandbox no tiene ruta directa hacia afuera. En Linux, el namespace de red se elimina; los proxies se alcanzan mediante sockets Unix.',3,'act'], ['Host permitido: la conexión procede','Un host en allowedDomains pasa, tras una verificación de que no resuelve a la dirección loopback ni a IPs de metadatos de la nube.',4,'ok'], ['Host desconocido: bloqueado o consultado','Un host denegado o no listado es rechazado, o un callback de tipo ask decide. La violación se registra para que el agente la lea.',4,'bad'] ]; var fi=0,timer=null; function draw(){ var s=steps[fi];var ns=R.querySelectorAll('.node'); ns.forEach(function(n,i){n.classList.remove('act','ok','bad');if(i<s[2])n.classList.add('act')}); ns[s[2]].classList.add(s[3]); var pk=document.getElementById('pkt');pk.style.left=(s[2]*22)+'%'; pk. style.background=s[3]==='ok'?'#788c5d':s[3]==='bad'?'#d4504a':'#d97757'; document.getElementById('fdesc').innerHTML='<h4>Paso '+(fi+1)+' de '+steps.length+': '+s[0]+'</h4>'+s[1]; } document.getElementById('fnext').onclick=function(){fi=(fi+1)%steps.length;draw()}; document.getElementById('fprev').onclick=function(){fi=(fi-1+steps.length)%steps.length;draw()}; document.getElementById('fplay').onclick=function(){ if(timer){clearInterval(timer);timer=null;this.textContent='Reproducción automática';return} this.textContent='Pausa';timer=setInterval(function(){fi=(fi+1)%steps.length;draw()},1800); }; draw(); // sim function on(id){return document.getElementById(id).checked} var C=[ function(){return [1,'# Anthropic Sandbox Runtime (srt) ...','Las lecturas están permitidas por defecto, y el directorio actual es legible.']}, function(){return on('f-ssh')?[0,'cat: ~/.ssh/id_rsa: Operation not permitted','~/.ssh está en denyRead, por lo que la clave no puede leerse.']:[1,'-----BEGIN OPENSSH PRIVATE KEY----- ...','Sin una regla denyRead, las lecturas están abiertas en todas partes. Deniega los secretos explícitamente.']}, function(){return on('d-anth')?[1,'<html>...</html>','anthropic.com está en allowedDomains, así que el proxy lo reenvía.']:[0,'Connection blocked by network allowlist','Ninguna coincidencia en la allowlist: la red es de denegación por defecto.']}, function(){return [0,'Connection blocked by network allowlist','example.com no está en la allowlist.']}, function(){return on('d-npm')?[1,'paquetes instalados (salida ilustrativa)','*.npmjs.org está en la allowlist, por lo que el registro es alcanzable.']:[0,'npm ERR! network request to registry.npmjs.org failed\nConnection blocked by network allowlist','El clásico equilibrio: demasiado estricto, y las instalaciones fallan.']}, function(){return on('f-env')?[0,'bash: .env: Operation not permitted','denyWrite prevalece sobre allowWrite, por lo que .env permanece protegido dentro del proyecto.']:[1,'(escrito)','"." está en allowWrite, por lo que la escritura tiene éxito.']} ]; var busy=false; R.querySelectorAll('.cmd').forEach(function(b){b. addEventListener('click',function(){ if(busy)return;busy=true;var r=C[+b.getAttribute('data-c')]();var t=document.getElementById('term'); t.innerHTML='<span class="p">$</span> '+b.textContent.replace(/</g,'&lt;')+'\n<span class="dim">Ejecutándose dentro del sandbox...</span>'; document.getElementById('why').textContent=''; setTimeout(function(){ t.innerHTML='<span class="p">$</span> '+b.textContent.replace(/</g,'&lt;')+'\n<span class="'+(r[0]?'ok':'no')+'">'+(r[0]?'✓ ':'✗ ')+r[1].replace(/</g,'&lt;')+'</span>'; document.getElementById('why').textContent=r[2];busy=false;post(); },650); })}); // plataformas var P=['macOS utiliza la herramienta sandbox-exec integrada con perfiles de Seatbelt generados por cada ejecución. El perfil permite solo 1 puerto de localhost, donde escuchan los proxies de srt. Las violaciones pueden leerse del registro del sistema en tiempo real.', 'Linux utiliza bubblewrap y elimina por completo el namespace de red. Los proxies se alcanzan mediante sockets Unix montados mediante bind dentro del sandbox. Ubuntu 24.04+ necesita un cambio en AppArmor para los namespaces de usuario.', 'Windows (alpha) ejecuta los comandos como una cuenta dedicada srt-sandbox. Un filtro WFP a nivel de máquina bloquea su tráfico saliente excepto hacia los puertos del proxy. La configuración necesita 1 instalación con privilegios elevados.']; var pcs=R.querySelectorAll('.pc'); function pd(i){pcs.forEach(function(x){x.classList.remove('on')});pcs[i].classList.add('on');document.getElementById('pdesc').innerHTML='<h4>'+pcs[i].querySelector('h4').textContent+'</h4>'+P[i];post()} pcs.forEach(function(c,i){c.addEventListener('click',function(){pd(i)})});pd(0); function bars(){R.querySelectorAll('.fg').forEach(function(f){f.style.width='0';setTimeout(function(){f.style.width=f.getAttribute('data-w')+'%'},80)})} function rows(){R.querySelectorAll('tr.row').forEach(function(r,i){r.classList.remove('in');setTimeout(function(){r.classList.add('in')},90*i+60)})} window.addEventListener('load',post);window. addEventListener('resize',post);setTimeout(post,300); })(); </script> </body> </html> ">

El verdadero equilibrio: listas de permitidos estrictas frente a agentes funcionales

Los agentes de programación hacen más que editar archivos. Instalan dependencias, descargan documentación y llaman a APIs. Si la lista de permitidos es demasiado estricta, npm install falla. Si es demasiado laxa, el sandbox protege poco. srt ofrece varios controles para ese punto intermedio:

  • Comodines y puertos: entradas como *.npmjs.org o api.example.com:443.
  • Callback de consulta: decide los hosts que ninguna regla cubre, y puede devolver una razón que el modelo lee.
  • Listas de permitidos por comando: abre un registro para 1 sola invocación.
  • Actualizaciones en vivo: --control-fd intercambia las listas de red mientras un comando se ejecuta.
  • Verificación de direcciones resueltas: bloquea nombres permitidos que se resuelven a IPs de loopback o de metadatos de la nube.
  • Razones de dominios denegados: indican al agente la alternativa autorizada, como un remoto de git HTTPS..

¿Cómo se compara con otros sandboxes para agentes?

CaracterísticaAnthropic sandbox-runtimeOpenAI Codex CLI sandboxDocker SandboxesE2B
AislamientoPrimitivas del sistema operativo: Seatbelt, bubblewrap, cuenta de Windows + WFPPrimitivas del sistema operativo: Seatbelt, bubblewrap, sandbox nativo de WindowsmicroVM por sandboxmicroVM Firecracker por sesión
Dónde se ejecutaMáquina localMáquina localMáquina localNube o BYOC (AWS, GCP)
Se necesita contenedor o VMNoNoSí (microVM)Sí (microVM administrada)
Usar fuera de su propio agenteSí, CLI + biblioteca para cualquier procesoIntegrado en CodexSí, CLI de sbx para agentes de códigoSí, SDKs de JS y Python
Red por defectoDenegar todo; proxy con lista de permitidosDesactivado en workspace-write; opción de configuraciónPolítica elegida en el primer inicio (p. ej. deny-all, balanced)Activado por defecto; se puede desactivar
Lista de permitidos de dominiosSí, comodines + puertosNo revelado (documentado como interruptor de encendido/apagado)Sí, comodines + puertosSí, allowOut con comodines (basado en SNI/Host)
LicenciaApache-2.0Apache-2.0No reveladoApache-2.0 (SDK)
EstadoVista previa de investigación beta; Windows en alphaSe incluye en Codex CLIProducto en producciónProducto en producción

Conclusiones clave

  • srt aísla en sandbox cualquier proceso a nivel del sistema operativo, sin necesidad de contenedor.
  • Seatbelt en macOS, bubblewrap en Linux, Windows en alpha.
  • La red está denegada por defecto; cada conexión pasa por un proxy de lista de permitidos del lado del host.
  • Anthropic informa de un 84% menos de solicitudes de permiso en Claude Code (interno).
  • La amplitud de la lista de permitidos es el verdadero dial de seguridad; dominios amplios pueden filtrar datos.


Echa un vistazo al repositorio de GitHub, la publicación de ingeniería de Anthropic y los documentos de sandboxing de Claude Code. Todo el mérito es del investigador de este proyecto. Además, no dudes en seguirnos en Twitter y no olvides unirte a nuestro SubReddit de ML con más de 150k y suscribirte a nuestro boletín. ¡Espera! ¿estás en Telegram? ahora también puedes unirte a nosotros en Telegram.

¿Necesitas colaborar con nosotros para promocionar tu repositorio de GitHub O página de Hugging Face O lanzamiento de producto O webinar, etc.? Conéctate con nosotros

La entrada Conoce sandbox-runtime de Anthropic: sandboxing a nivel de sistema operativo para agentes de IA, sin contenedores apareció primero en MarkTechPost.

Fuente original

MarkTechPost

Notas sobre el contenido

La publicación original y los derechos pertenecen a la fuente.

Traducción automática · Consulte el original