In diesem Artikel besprechen wir das neu im Trend liegende Open-Source-Projekt von Anthropic sandbox-runtime (srt), die Sandbox auf Betriebssystemebene hinter dem Sandbox-Bash-Tool von Claude Code. Die Anthropic sandbox-runtime begrenzt, welche Dateien ein Prozess anfassen und welche Hosts er erreichen kann. Dies geschieht, ohne einen Container zu starten. Sie ist auch nicht an Claude Code gebunden. Ihre eigenen Agenten, lokale MCP-Server und gewöhnliche Kommandozeilenprogramme können darin ausgeführt werden.
TL;DR
- Größe: npm-Paket
@anthropic-ai/sandbox-runtimev0.0.81, entpackt etwa 11.4 MB, Apache-2.0, Node.js 22.12+. - Läuft auf: jedem macOS- oder Linux-Entwicklerrechner oder einer CI-Maschine. macOS nutzt Seatbelt; Linux benötigt bubblewrap, socat und ripgrep. Windows ist Alpha.
- Leistung: Das Sandboxen senkte die Claude-Code-Berechtigungsaufforderungen in der internen Nutzung von Anthropic um 84% (selbst berichtet).
- Bestes: 84% weniger Berechtigungsaufforderungen, mit Datei- und Netzwerkbeschränkungen, die für den gesamten Prozessbaum durchgesetzt werden.
- Schlechtestes: immer noch eine Beta-Forschungsvorschau, Windows-Unterstützung ist Alpha.
Was ist Anthropic sandbox-runtime?
Anthropic sandbox-runtime ist ein Open-Source-Werkzeug, das jeden Prozess in Dateisystem- und Netzwerkbeschränkungen einhüllt. Man installiert es mit npm install -g @anthropic-ai/sandbox-runtimeund stellt dann einem Befehl srtvoran. Es funktioniert als CLI und als TypeScript-Bibliothek.
Wie funktioniert sandbox-runtime auf macOS, Linux und Windows?
srt nutzt die eigenen Isolationsprimitive des jeweiligen Betriebssystems. Seine Beschränkungen decken den gesamten Prozessbaum ab, einschließlich Skripten und Unterprozessen.
- macOS:
sandbox-execmit dynamisch generierten Seatbelt-Profilen. Nur ripgrep ist erforderlich. - Linux: bubblewrap ohne den Netzwerk-Namespace. Außerdem werden socat und ripgrep benötigt.
- Windows (Alpha): ein dediziertes
srt-sandboxKonto, ein Windows Filtering Platform Egress-Zaun und explizite Datei-ACLs.
Der Traffic verlässt das System ausschließlich über HTTP- und SOCKS5-Proxys auf dem Host. Unter Linux liegen diese Proxys hinter Unix-Sockets, die in die Sandbox gebindet sind. Unter macOS erlaubt das Seatbelt-Profil nur einen einzigen localhost-Port. Die Proxys wenden dann Ihre Domain-Allowlist und -Denylist an.
Warum braucht es sowohl Dateisystem- als auch Netzwerk-Isolation?
Das Anthropic-Team argumentiert, dass die eine Grenze 1 ohne die andere fehlschlägt. Ohne Netzwerk-Isolation könnte ein prompt-injizierter Agent SSH-Schlüssel exfiltrieren. Ohne Dateisystem-Isolation könnte er der Sandbox entkommen und Netzwerkzugriff erlangen.
srt's Defaults folgen dieser Logik. Lesezugriffe sind überall erlaubt, sofern nicht verweigert. Schreibzugriffe sind überall verweigert, sofern nicht erlaubt. Netzwerkzugriff ist verweigert, außer eine Domain ist allowgelistet.
Wie sandboxet man einen MCP-Server oder den eigenen Agenten?
Für einen MCP-Server ändern Sie die command in .mcp.json von npx zu srt. Übergeben Sie den ursprünglichen Befehl als Argumente. Die Regeln liegen dann in ~/.srt-settings.json:
{
"network": { "allowedDomains": ["api.github.com", "*.npmjs.org"], "deniedDomains": [] },
"filesystem": { "denyRead": ["~/.ssh"], "allowWrite": ["."], "denyWrite": [".env"] }
}
Für den eigenen Agenten stellt die Bibliothek SandboxManagerbereit. Rufen Sie initialize(config) auf, um die Proxys zu starten. Dann wrapWithSandbox() liefert einen umhüllten Befehlsstring, den Sie starten können.
Was bedeutet die Zahl 84%?
Anthropic berichtet dass Sandboxing die Berechtigungsabfragen bei der internen Nutzung von Claude Code um 84% reduziert hat. Das ist eine selbstberichtete Zahl, kein externer Benchmark. Das Ziel ist die Ermüdung durch Bestätigungen. Entwickler, die den ganzen Tag auf „Zustimmen“ klicken, lesen nicht mehr, was sie bestätigen. Eine feste Grenze lässt den Agenten darin frei arbeiten und nur am Rand nachfragen.
Back</button> <button class="btn pri" id="fnext">Nächster Schritt </button> <button class="btn" id="fplay">Automatisch abspielen</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 >> .env"</button> </div> <div class="term" id="term" style="margin-top:10px"><span class="dim">Wählen Sie einen Befehl aus. Schalten Sie die Konfiguration um, um zu sehen, was sich ändert.</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">Unterstützt</span><ul><li>sandbox-exec</li><li>Seatbelt-Profile</li><li>Benötigt ripgrep</li></ul></div> <div class="pc" data-p="1"><h4>Linux</h4><span class="tag t-g">Unterstützt</span><ul><li>bubblewrap</li><li>Kein Network-Namespace</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>WFP-Egress-Zaun</li><li>Einmalige Installation</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">Lesen</div><div class="big" style="color:#b5cc94">Erlauben</div><p>Standardmäßig überall erlaubt. Sperrbereiche wie ~/.ssh können mit allowRead wieder erlaubt werden.</p></div> <div class="dc"><div class="kicker">Schreiben</div><div class="big" style="color:#ef7a73">Verweigern</div><p>Standardmäßig überall verweigert. Pfade wie "." und /tmp mit allowWrite freigeben.</p></div> <div class="dc"><div class="kicker">Netzwerk</div><div class="big" style="color:#ef7a73">Verweigern</div><p>Standardmäßig kein Zugriff. Jeder Host muss allowedDomains entsprechen.</p></div> </div> <div class="bars" id="bars"> <div class="kicker" style="margin-bottom:4px">Claude Code-Berechtigungsabfragen (indiziert)</div> <div class="bar"><div class="lb"><span>Ohne 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>Mit Sandboxing</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 % weniger Prompts bei Anthropics interner Nutzung (selbst berichtet, Engineering-Beitrag vom Oktober 2025). Normalisiert auf 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">OS-Primitive</td><td>OS-Primitive</td><td>microVM</td><td>Firecracker-microVM</td></tr> <tr class="row"><td>Läuft</td><td class="hl">Lokal</td><td>Lokal</td><td>Lokal</td><td>Cloud / BYOC</td></tr> <tr class="row"><td>Container oder VM</td><td class="hl">Nein</td><td>Nein</td><td>Ja</td><td>Ja</td></tr> <tr class="row"><td>Netzwerk-Standard</td><td class="hl">Alles verweigern</td><td>Aus (umschaltbar)</td><td>Gewählte Richtlinie</td><td>Ein</td></tr> <tr class="row"><td>Domain-Allowlist</td><td class="hl">Wildcards + Ports</td><td>Nicht offengelegt</td><td>Wildcards + Ports</td><td>allowOut, Wildcards</td></tr> <tr class="row"><td>Lizenz</td><td class="hl">Apache-2.0</td><td>Apache-2.0</td><td>Nicht offengelegt</td><td>Apache-2.0 (SDK)</td></tr> </tbody> </table> </div> </div> <div class="ft"><span>Quellen: github.com/anthropics/sandbox-runtime · anthropic.com/engineering · v0.0.81</span><span class="mtp">Erstellt von 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=[ ['Ihr Agent führt einen Befehl aus','Der Agent, der MCP-Server oder das CLI-Tool gibt einen Befehl aus. Er bleibt unverändert; srt umhüllt ihn lediglich.',0,'act'], ['srt erstellt die Richtlinie','srt lädt ~/.srt-settings.json (oder eingebaute Standardwerte) und startet HTTP- und SOCKS5-Proxies auf dem Host.',1,'act'], ['Das Betriebssystem setzt die Grenze durch','Seatbelt (macOS), bubblewrap (Linux) oder ein WFP-Zaun (Windows alpha) wendet Dateiregeln auf den gesamten Prozessbaum an.',2,'act'], ['Der gesamte Datenverkehr läuft durch den Proxy','Die Sandbox hat keine direkte Route nach außen. Unter Linux wird der Network-Namespace entfernt; die Proxies werden über Unix-Sockets erreicht.',3,'act'], ['Erlaubter Host: Verbindung wird fortgesetzt','Ein Host in allowedDomains wird durchgelassen, nachdem geprüft wurde, dass er sich nicht zu Loopback- oder Cloud-Metadaten-IPs auflöst.',4,'ok'], ['Unbekannter Host: blockiert oder nachgefragt','Ein verweigerter oder nicht gelisteter Host wird abgelehnt, oder ein Ask-Callback entscheidet. Die Verletzung wird protokolliert, damit der Agent sie lesen kann.',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>Schritt '+(fi+1)+' von '+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='Auto-Wiedergabe';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) ...','Lesezugriffe sind standardmäßig erlaubt, und das aktuelle Verzeichnis ist lesbar.']}, function(){return on('f-ssh')?[0,'cat: ~/.ssh/id_rsa: Operation not permitted','~/.ssh steht in denyRead, daher kann der Schlüssel nicht gelesen werden.']:[1,'-----BEGIN OPENSSH PRIVATE KEY----- ...','Ohne eine denyRead-Regel sind Lesezugriffe überall offen. Verbieten Sie Geheimnisse explizit.']}, function(){return on('d-anth')?[1,'<html>...</html>','anthropic.com ist in allowedDomains enthalten, daher leitet der Proxy es weiter.']:[0,'Verbindung durch Netzwerk-Allowlist blockiert','Keine Übereinstimmung mit der Allowlist: Das Netzwerk ist standardmäßig verweigert.']}, function(){return [0,'Verbindung durch Netzwerk-Allowlist blockiert','example.com ist nicht in der Allowlist enthalten.']}, function(){return on('d-npm')?[1,'Pakete installiert (illustrative Ausgabe)','*.npmjs.org ist in der Allowlist enthalten, daher ist die Registry erreichbar.']:[0,'npm ERR! Netzwerkanfrage an registry.npmjs.org fehlgeschlagen\nVerbindung durch Netzwerk-Allowlist blockiert','Der klassische Kompromiss: Zu streng, und Installationen schlagen fehl.']}, function(){return on('f-env')?[0,'bash: .env: Operation not permitted','denyWrite hat Vorrang vor allowWrite, daher bleibt .env innerhalb des Projekts geschützt.']:[1,'(geschrieben)','"." steht in allowWrite, daher gelingt der Schreibvorgang.']} ]; 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,'<')+'\n<span class="dim">Wird innerhalb der Sandbox ausgeführt...</span>'; document.getElementById('why').textContent=''; setTimeout(function(){ t.innerHTML='<span class="p">$</span> '+b.textContent.replace(/</g,'<')+'\n<span class="'+(r[0]?'ok':'no')+'">'+(r[0]?'✓ ':'✗ ')+r[1].replace(/</g,'<')+'</span>'; document.getElementById('why').textContent=r[2];busy=false;post(); },650); })}); // platforms var P=['macOS nutzt das eingebaute Tool sandbox-exec mit Seatbelt-Profilen, die pro Ausführung generiert werden. Das Profil erlaubt nur 1 localhost-Port, an dem die srt-Proxies lauschen. Verstöße können in Echtzeit aus dem Systemlog gelesen werden.', 'Linux nutzt bubblewrap und entfernt den Network-Namespace vollständig. Auf die Proxies wird über Unix-Sockets zugegriffen, die per Bind-Mount in die Sandbox eingebunden sind. Ubuntu 24.04+ benötigt eine AppArmor-Änderung für User-Namespaces.', 'Windows (alpha) führt Befehle als dediziertes Konto srt-sandbox aus. Ein systemweiter WFP-Filter blockiert seinen ausgehenden Datenverkehr, außer zu den Proxy-Ports. Das Setup erfordert 1 Installation mit erhöhten Rechten.']; 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> ">Der eigentliche Kompromiss: strikte Allowlists vs. funktionierende Agenten
Coding-Agenten tun mehr als Dateien zu bearbeiten. Sie installieren Abhängigkeiten, ziehen Dokumentationen und rufen APIs auf. Macht man die Allowlist zu streng, npm install schlägt fehl. Macht man sie zu locker, schützt die Sandbox kaum. srt liefert mehrere Stellschrauben für diesen Mittelweg:
- Wildcards und Ports: Einträge wie
*.npmjs.orgoderapi.example.com:443. - Ask-Callback: entscheidet über Hosts, die keine Regel abdeckt, und kann einen Grund zurückgeben, den das Modell liest.
- Allow-Listen pro Befehl: öffnet eine Registry nur für 1 Aufruf.
- Live-Updates:
--control-fdtauscht Netzwerk-Listen aus, während ein Befehl läuft. - Prüfung aufgelöster Adressen: blockiert erlaubte Namen, die zu Loopback- oder Cloud-Metadaten-IPs aufgelöst werden.
- Gründe bei verweigerten Domains: nennt dem Agenten die sanktionierte Alternative, etwa ein HTTPS-Git-Remote..
Wie schneidet es im Vergleich mit anderen Agent-Sandboxes ab?
| Funktion | Anthropic sandbox-runtime | OpenAI Codex CLI sandbox | Docker Sandboxes | E2B |
|---|---|---|---|---|
| Isolation | OS-Primitiven: Seatbelt, bubblewrap, Windows-Konto + WFP | OS-Primitiven: Seatbelt, bubblewrap, native Windows-Sandbox | microVM pro Sandbox | Firecracker-microVM pro Sitzung |
| Läuft wo | Lokaler Rechner | Lokaler Rechner | Lokaler Rechner | Cloud oder BYOC (AWS, GCP) |
| Container oder VM erforderlich | Nein | Nein | Ja (microVM) | Ja (verwaltetes microVM) |
| Verwendung außerhalb des eigenen Agenten | Ja, CLI + Bibliothek für jeden Prozess | In Codex integriert | Ja, sbx CLI für Coding-Agents | Ja, JS- und Python-SDKs |
| Netzwerk-Standard | Alles verweigern; Proxy-Allowlist | Aus in workspace-write; Konfigurationsschalter | Richtlinie wird beim ersten Start gewählt (z. B. deny-all, balanced) | Standardmäßig aktiviert; kann deaktiviert werden |
| Domain-Allowlist | Ja, Wildcards + Ports | Nicht offengelegt (Ein/Aus-Schalter dokumentiert) | Ja, Wildcards + Ports | Ja, allowOut mit Wildcards (SNI/Host-basiert) |
| Lizenz | Apache-2.0 | Apache-2.0 | Nicht offengelegt | Apache-2.0 (SDK) |
| Status | Beta Research Preview; Windows alpha | Bestandteil der Codex CLI | Ausgeliefertes Produkt | Ausgeliefertes Produkt |
Wichtigste Erkenntnisse
- srt sandboxt jeden Prozess auf Betriebssystemebene, kein Container nötig.
- Seatbelt auf macOS, bubblewrap auf Linux, Windows in der Alpha.
- Das Netzwerk ist standardmäßig deny-by-default; jede Verbindung läuft durch einen hostseitigen Allowlist-Proxy.
- Anthropic berichtet von 84% weniger Claude Code Permission Prompts (intern).
- Die Breite der Allowlist ist der eigentliche Sicherheitsregler; breite Domains können Daten durchsickern lassen.
Schauen Sie sich das GitHub-Repoan, den Anthropic-Engineering-Beitrag und die Claude-Code-Sandboxing-Dokumentation. Jeglicher Dank gebührt dem Forscher dieses Projekts. Folgen Sie uns außerdem gerne auf Twitter und vergessen Sie nicht, unserem 150k+ML SubReddit beizutreten und unseren Newsletterzu abonnieren. Moment! Sind Sie auf Telegram? jetzt können Sie uns auch auf Telegram beitreten.
Möchten Sie mit uns zusammenarbeiten, um Ihr GitHub-Repo ODER Ihre Hugging-Face-Seite ODER Ihr Produktrelease ODER Ihr Webinar usw. zu bewerben? Kontaktieren Sie uns
Der Beitrag Meet Anthropic’s sandbox-runtime: OS-Level-Sandboxing für KI-Agenten, ohne Container erschien zuerst auf MarkTechPost.