MarkTechPostPublication de la source

Découvrez sandbox-runtime d'Anthropic : l'isolation au niveau du système d'exploitation pour les agents IA, sans conteneurs

Dans cet article, nous allons présenter le tout récent projet open source d'Anthropic qui fait parler de lui : sandbox-runtime (srt), le bac à sable au niveau du système d'exploitation qui se cache derrière l'outil bash isolé de Claude Code. Le sandbox-runtime d'Anthropic limite les fichiers qu'un processus peut toucher et les hôtes qu'il peut joindre.

Dans cet article, nous allons présenter le tout récent projet open source d'Anthropic qui fait parler de lui : sandbox-runtime (srt), le bac à sable au niveau du système d'exploitation qui se cache derrière l'outil bash isolé de Claude Code. Le sandbox-runtime d'Anthropic limite les fichiers qu'un processus peut toucher et les hôtes qu'il peut joindre. Il le fait sans lancer de conteneur. Il n'est pas non plus lié à Claude Code. Vos propres agents, vos serveurs MCP locaux et de simples programmes en ligne de commande peuvent s'exécuter à l'intérieur.

TL;DR

  • Taille : paquet npm @anthropic-ai/sandbox-runtime v0.0.81, environ 11.4 Mo décompressé, Apache-2.0, Node.js 22.12+.
  • Fonctionne sur : n'importe quelle machine de développement macOS ou Linux, ou serveur CI. macOS utilise Seatbelt ; Linux a besoin de bubblewrap, socat et ripgrep. Windows est en version alpha.
  • Performance : l'isolation a réduit de 84% les demandes d'autorisation de Claude Code selon l'usage interne d'Anthropic (déclaré par l'éditeur).
  • Points forts : 84% de demandes d'autorisation en moins, avec des limites de fichiers et de réseau appliquées à l'ensemble de l'arborescence de processus.
  • Points faibles : toujours un aperçu de recherche en version bêta, la prise en charge de Windows est alpha.

Qu'est-ce que le sandbox-runtime d'Anthropic ?

Le sandbox-runtime d'Anthropic est un outil open source qui enveloppe n'importe quel processus dans des restrictions de système de fichiers et de réseau. Vous l'installez avec npm install -g @anthropic-ai/sandbox-runtime, puis préfixez une commande avec srt. Il fonctionne comme une CLI et comme une bibliothèque TypeScript.

Comment sandbox-runtime fonctionne-t-il sur macOS, Linux et Windows ?

srt utilise les primitives d'isolation propres à chaque système d'exploitation. Ses restrictions couvrent l'ensemble de l'arborescence de processus, y compris les scripts et les sous-processus.

  • macOS : sandbox-exec avec des profils Seatbelt générés dynamiquement. Seul ripgrep est requis.
  • Linux : bubblewrap avec l'espace de noms réseau supprimé. Il nécessite aussi socat et ripgrep.
  • Windows (alpha) : un compte dédié srt-sandbox , une barrière de sortie Windows Filtering Platform et des ACL de fichiers explicites.

Le trafic ne sort que via des proxys HTTP et SOCKS5 exécutés sur l'hôte. Sur Linux, ces proxys se trouvent derrière des sockets Unix montés par liaison (bind-mounted) dans le bac à sable. Sur macOS, le profil Seatbelt n'autorise qu'un seul port localhost. Les proxys appliquent ensuite votre liste d'autorisation et votre liste de refus de domaines.

Pourquoi faut-il à la fois une isolation du système de fichiers et du réseau ?

L'équipe d'Anthropic soutient qu'une frontière 1 sans l'autre échoue. Sans isolation réseau, un agent victime d'une injection de prompt pourrait exfiltrer des clés SSH. Sans isolation du système de fichiers, il pourrait s'échapper du bac à sable et obtenir un accès réseau.

Les valeurs par défaut de srt suivent cette logique. Les lectures sont autorisées partout sauf refus. Les écritures sont refusées partout sauf autorisation. L'accès réseau est refusé sauf si un domaine est sur liste d'autorisation.

Comment mettre en bac à sable un serveur MCP ou votre propre agent ?

Pour un serveur MCP, modifiez le command dans .mcp.json de npx à srt. Passez la commande originale en arguments. Les règles résident alors dans ~/.srt-settings.json:

Copier le Code
{
  "network": { "allowedDomains": ["api.github.com", "*.npmjs.org"], "deniedDomains": [] },
  "filesystem": { "denyRead": ["~/.ssh"], "allowWrite": ["."], "denyWrite": [".env"] }
}

Pour votre propre agent, la bibliothèque expose SandboxManager. Appelez initialize(config) pour démarrer les proxys. Ensuite, wrapWithSandbox() renvoie une chaîne de commande enveloppée que vous pouvez lancer.

Que signifie le chiffre de 84 % ?

Anthropic rapporte que le bac à sable a réduit les demandes de permission de 84 % dans l'utilisation interne de Claude Code. C'est un chiffre auto-déclaré, pas un benchmark externe. La cible est la fatigue d'approbation. Les développeurs qui cliquent sur « approuver » toute la journée finissent par ne plus lire ce qu'ils approuvent. Une frontière fixe permet à l'agent de travailler librement à l'intérieur et de ne demander qu'aux limites.

Back</button> <button class="btn pri" id="fnext">Étape suivante </button> <button class="btn" id="fplay">Lecture automatique</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">Choisissez une commande. Basculez la configuration pour voir ce qui change.</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">Pris en charge</span><ul><li>sandbox-exec</li><li>Profils Seatbelt</li><li>Nécessite ripgrep</li></ul></div> <div class="pc" data-p="1"><h4>Linux</h4><span class="tag t-g">Pris en charge</span><ul><li>bubblewrap</li><li>Pas d'espace de noms réseau</li><li>socat + ripgrep</li></ul></div> <div class="pc" data-p="2"><h4>Windows</h4><span class="tag t-o">Alpha</span><ul><li>srt-sandbox account</li><li>Barrière de sortie WFP</li><li>Installation unique</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">Lecture</div><div class="big" style="color:#b5cc94">Allow</div><p>Autorisé partout par défaut. Zones interdites comme ~/.ssh, réautorisation avec allowRead.</p></div> <div class="dc"><div class="kicker">Écriture</div><div class="big" style="color:#ef7a73">Deny</div><p>Interdit partout par défaut. Ouvrez des chemins comme "." et /tmp avec allowWrite.</p></div> <div class="dc"><div class="kicker">Réseau</div><div class="big" style="color:#ef7a73">Deny</div><p>Aucun accès par défaut. Chaque hôte doit correspondre à allowedDomains.</p></div> </div> <div class="bars" id="bars"> <div class="kicker" style="margin-bottom:4px">Demandes d'autorisation de Claude Code (indexé)</div> <div class="bar"><div class="lb"><span>Sans bac à sable</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>Avec bac à sable</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 % de demandes en moins dans l'usage interne d'Anthropic (auto-déclaré, article d'ingénierie d'octobre 2025). Indexé sur 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>Isolation</td><td class="hl">Primitives OS</td><td>Primitives OS</td><td>microVM</td><td>microVM Firecracker</td></tr> <tr class="row"><td>Exécution</td><td class="hl">Local</td><td>Local</td><td>Local</td><td>Cloud / BYOC</td></tr> <tr class="row"><td>Conteneur ou VM</td><td class="hl">Non</td><td>Non</td><td>Oui</td><td>Oui</td></tr> <tr class="row"><td>Réseau par défaut</td><td class="hl">Tout interdire</td><td>Désactivé (bascule)</td><td>Politique choisie</td><td>Activé</td></tr> <tr class="row"><td>Liste blanche de domaines</td><td class="hl">Jokers + ports</td><td>Non communiqué</td><td>Jokers + ports</td><td>allowOut, jokers</td></tr> <tr class="row"><td>Licence</td><td class="hl">Apache-2.0</td><td>Apache-2.0</td><td>Non communiquée</td><td>Apache-2.0 (SDK)</td></tr> </tbody> </table> </div> </div> <div class="ft"><span>Sources : github.com/anthropics/sandbox-runtime · anthropic.com/engineering · v0.0.81</span><span class="mtp">Réalisé par 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); })}); // flow var steps=[ ['Votre agent exécute une commande','L'agent, le serveur MCP ou l'outil CLI émet une commande. Il reste inchangé ; srt l'encapsule simplement.',0,'act'], ['srt construit la politique','srt charge ~/.srt-settings.json (ou les valeurs par défaut intégrées) et démarre des proxys HTTP et SOCKS5 sur l'hôte.',1,'act'], ['Le système d'exploitation applique la frontière','Seatbelt (macOS), bubblewrap (Linux) ou une clôture WFP (Windows alpha) applique des règles de fichiers à l'ensemble de l'arborescence de processus.',2,'act'], ['Tout le trafic passe par le proxy','Le bac à sable n'a aucune route directe vers l'extérieur. Sous Linux, l'espace de noms réseau est supprimé ; les proxys sont joints via des sockets Unix.',3,'act'], ['Hôte autorisé : la connexion proceede','Un hôte figurant dans allowedDomains passe, après une vérification qu'il ne résout ni vers l'adresse de bouclage ni vers les adresses IP de métadonnées du cloud.',4,'ok'], ['Hôte inconnu : bloqué ou soumis à confirmation','Un hôte refusé ou non listé est rejeté, ou un callback ask décide. La violation est consignée dans un journal que l'agent peut lire.',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>Étape '+(fi+1)+' sur '+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='Lecture automatique';return} this.textContent='Pause';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) ...','Les lectures sont autorisées par défaut, et le répertoire courant est lisible.']}, function(){return on('f-ssh')?[0,'cat : ~/.ssh/id_rsa : Opération non permise','~/.ssh figure dans denyRead, la clé ne peut donc pas être lue.']:[1,'-----BEGIN OPENSSH PRIVATE KEY----- ...','Sans règle denyRead, les lectures sont ouvertes partout. Refusez explicitement les secrets.']}, function(){return on('d-anth')?[1,'<html>...</html>','anthropic.com figure dans allowedDomains, le proxy le transfère donc.']:[0,'Connexion bloquée par la liste blanche réseau','Aucune correspondance dans la liste blanche : le réseau est refusé par défaut.']}, function(){return [0,'Connexion bloquée par la liste blanche réseau','example.com n'est pas dans la liste blanche.']}, function(){return on('d-npm')?[1,'paquets installés (sortie illustrative)','*.npmjs.org est dans la liste blanche, le registre est donc joignable.']:[0,'npm ERR! network request to registry.npmjs.org failed\nConnexion bloquée par la liste blanche réseau','Le compromis classique : trop strict, et les installations échouent.']}, function(){return on('f-env')?[0,'bash : .env : Opération non permise','denyWrite l'emporte sur allowWrite, .env reste donc protégé dans le projet.']:[1,'(écrit)','"." figure dans allowWrite, l'écriture réussit donc.']} ]; 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">Exécution dans le bac à sable...</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); })}); // platforms var P=['macOS utilise l'outil sandbox-exec intégré avec des profils Seatbelt générés à chaque exécution. Le profil n'autorise qu'1 port localhost, sur lequel écoutent les proxys srt. Les violations peuvent être lues dans le journal système en temps réel.', 'Linux utilise bubblewrap et supprime entièrement l'espace de noms réseau. Les proxys sont joints via des sockets Unix montés par bind dans le bac à sable. Ubuntu 24.04+ nécessite une modification AppArmor pour les espaces de noms utilisateur.', 'Windows (alpha) exécute les commandes sous un compte dédié srt-sandbox. Un filtre WFP à l'échelle de la machine bloque son trafic sortant, sauf vers les ports du proxy. L'installation nécessite 1 installation avec élévation de privilèges.']; 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> ">

Le véritable compromis : listes blanches strictes contre agents fonctionnels

Les agents de codage font plus que modifier des fichiers. Ils installent des dépendances, récupèrent de la documentation et appellent des API. Si la liste blanche est trop stricte, npm install échoue. Si elle est trop permissive, le bac à sable ne protège presque rien. srt propose plusieurs réglages pour ce juste milieu :

  • Jokers et ports : des entrées comme *.npmjs.org ou api.example.com:443.
  • Rappel de demande (ask callback) : décide des hôtes couverts par aucune règle, et peut renvoyer une raison que le modèle lit.
  • Listes d'autorisation par commande : ouvrir un registre pour 1 seule invocation.
  • Mises à jour en direct : --control-fd remplace les listes réseau pendant l'exécution d'une commande.
  • Vérification des adresses résolues : bloque les noms autorisés qui se résolvent vers des adresses de bouclage ou des IP de métadonnées cloud.
  • Raisons de domaine refusé : indique à l'agent l'alternative autorisée, telle qu'un dépôt git distant en HTTPS..

Comment se compare-t-il aux autres bacs à sable pour agents ?

FonctionnalitéAnthropic sandbox-runtimeOpenAI Codex CLI sandboxDocker SandboxesE2B
IsolationPrimitives OS : Seatbelt, bubblewrap, compte Windows + WFPPrimitives OS : Seatbelt, bubblewrap, bac à sable Windows natifmicroVM par bac à sablemicroVM Firecracker par session
Où il s'exécuteMachine localeMachine localeMachine localeCloud ou BYOC (AWS, GCP)
Conteneur ou VM requisNonNonOui (microVM)Oui (microVM gérée)
Utilisation en dehors de son propre agentOui, CLI + bibliothèque pour tout processusIntégré à CodexOui, CLI sbx pour les agents de codageOui, SDK JS et Python
Réseau par défautTout refuser ; proxy avec liste blancheDésactivé dans workspace-write; bascule dans la configurationPolitique choisie au premier démarrage (ex. refus total, équilibrée)Activé par défaut; peut être désactivé
Liste blanche de domainesOui, jokers + portsNon communiqué (bascule on/off documentée)Oui, jokers + portsOui, allowOut avec jokers (basé sur SNI/Host)
LicenceApache-2.0Apache-2.0Non communiquéApache-2.0 (SDK)
StatutAperçu de recherche bêta ; Windows en alphaInclus dans Codex CLIProduit en productionProduit en production

Points clés à retenir

  • srt isole n'importe quel processus au niveau du système d'exploitation, sans conteneur nécessaire.
  • Seatbelt sur macOS, bubblewrap sur Linux, Windows en alpha.
  • Le réseau est refusé par défaut ; chaque connexion passe par un proxy côté hôte avec liste blanche.
  • Anthropic rapporte 84 % d'invites de permission en moins avec Claude Code (interne).
  • L'étendue de la liste blanche est le véritable curseur de sécurité ; des domaines trop larges peuvent fuiter des données.


Découvrez le dépôt GitHub, l' article d'ingénierie d'Anthropic et les docs sur le sandboxing de Claude Code. Tout le mérite revient au chercheur de ce projet. Par ailleurs, n'hésitez pas à nous suivre sur Twitter et n'oubliez pas de rejoindre notre SubReddit 150k+ML et de vous abonner à notre Newsletter. Attendez ! vous êtes sur telegram ? vous pouvez désormais nous rejoindre sur telegram également.

Besoin de vous associer à nous pour promouvoir votre dépôt GitHub OU votre page Hugging Face OU le lancement d'un produit OU un webinar, etc. ? Connectez-vous avec nous

L'article Découvrez sandbox-runtime d’Anthropic : le sandboxing au niveau du système d’exploitation pour les agents IA, sans conteneurs est apparu en premier sur MarkTechPost.

Source originale

MarkTechPost

À propos du contenu

La publication originale et les droits appartiennent à la source.

Traduction automatique · Consultez l’original