Sakhanda Wire
NVDA $210.96 -0.59% MSFT $524.51 +0.66% GOOGL $320.21 -1.24% META $642.62 -0.96% AMZN $248.00 -0.95%
← Към новините

Представяме sandbox-runtime на Anthropic: пясъчна среда на ниво ОС за AI агенти, без контейнери

В тази статия ще обсъдим новия набиращ популярност проект с отворен код на Anthropic sandbox-runtime (srt) — пясъчната среда на ниво ОС, която стои зад изолирания bash инструмент на Claude Code. Anthropic sandbox-runtime ограничава файловете, до които даден процес може да има достъп, и хостовете, до които може да се свързва. Това се случва без стартиране на контейнер. Освен това не е обвързан с Claude Code. Вашите собствени агенти, локални MCP сървъри и обикновени програми от командния ред могат да работят в него.

Накратко

  • Размер: npm пакет @anthropic-ai/sandbox-runtime v0.0.81, около 11,4 MB в разопакован вид, Apache-2.0, Node.js 22.12+.
  • Работи на: всяка macOS или Linux машина за разработка или CI система. macOS използва Seatbelt; за Linux са нужни bubblewrap, socat и ripgrep. Windows е в алфа версия.
  • Производителност: изолирането е намалило подкана за разрешения в Claude Code с 84% при вътрешното използване на Anthropic (по нейни данни).
  • Най-доброто: 84% по-малко подкани за разрешения, като ограниченията за файлове и мрежа се прилагат към цялото дърво на процесите.
  • Най-лошото: все още е бета изследователска версия, а поддръжката за Windows е в алфа.

Какво представлява Anthropic sandbox-runtime?

Anthropic sandbox-runtime е инструмент с отворен код, който обвива всеки процес с ограничения за файловата система и мрежата. Инсталирате го с npm install -g @anthropic-ai/sandbox-runtime, след което добавяте srt пред командата. Работи както като CLI, така и като TypeScript библиотека.

Как работи sandbox-runtime на macOS, Linux и Windows?

srt използва собствените примитиви за изолиране на всяка операционна система. Ограниченията му обхващат цялото дърво на процесите, включително скриптовете и подпроцесите.

  • macOS: sandbox-exec с динамично генерирани Seatbelt профили. Изисква се само ripgrep.
  • Linux: bubblewrap с премахнато мрежово пространство от имена. Нужни са също socat и ripgrep.
  • Windows (алфа): специален акаунт srt-sandbox, ограда за изходящия трафик чрез Windows Filtering Platform и изрични ACL за файловете.

Трафикът излиза само през HTTP и SOCKS5 прокси сървъри, работещи на хоста. В Linux тези прокси сървъри са зад Unix сокети, монтирани чрез bind в пясъчната среда. В macOS профилът Seatbelt разрешава само един локален порт. След това прокси сървърите прилагат вашите списъци с разрешени и забранени домейни.

Защо са нужни едновременно изолиране на файловата система и мрежата?

Екипът на Anthropic твърди, че едната граница без другата е неефективна. Без мрежово изолиране агент, манипулиран чрез промпт, би могъл да изтегли SSH ключове. Без изолиране на файловата система той би могъл да напусне пясъчната среда и да получи мрежов достъп.

Настройките по подразбиране на srt следват тази логика. Четенето е разрешено навсякъде, освен ако не е забранено. Записването е забранено навсякъде, освен ако не е разрешено. Мрежовият достъп е забранен, освен ако домейнът не е добавен в списъка с разрешени домейни.

Как да изолирате MCP сървър или свой собствен агент?

За MCP сървър променете command в .mcp.json от npx на srt. Подайте оригиналната команда като аргументи. Правилата се намират в ~/.srt-settings.json:

Копиране на кодаКопираноИзползвайте друг браузър
{
  "network": { "allowedDomains": ["api.github.com", "*.npmjs.org"], "deniedDomains": [] },
  "filesystem": { "denyRead": ["~/.ssh"], "allowWrite": ["."], "denyWrite": [".env"] }
}

За ваш собствен агент библиотеката предоставя SandboxManager. Извикайте initialize(config), за да стартирате прокси сървърите. След това wrapWithSandbox() връща обвита командна поредица, която можете да стартирате.

Какво означава числото 84%?

Anthropic съобщава, че изолирането е намалило подкани за разрешения с 84% при вътрешното използване на Claude Code. Това е число, посочено от самата компания, а не външен бенчмарк. Целта е да се избегне умората от одобрения. Разработчиците, които цял ден натискат „одобряване“, спират да четат какво одобряват. Фиксираната граница позволява на агента да работи свободно в нея и да пита само когато я достигне.

Назад</button> <button class="btn pri" id="fnext">Следваща стъпка ▶</button> <button class="btn" id="fplay">Автоматично възпроизвеждане</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">файлова система</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">Изберете команда. Променете конфигурацията, за да видите какво се променя.</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">Поддържа се</span><ul><li>sandbox-exec</li><li>Seatbelt профили</li><li>Изисква ripgrep</li></ul></div> <div class="pc" data-p="1"><h4>Linux</h4><span class="tag t-g">Поддържа се</span><ul><li>bubblewrap</li><li>Без мрежово пространство от имена</li><li>socat + ripgrep</li></ul></div> <div class="pc" data-p="2"><h4>Windows</h4><span class="tag t-o">Алфа</span><ul><li>акаунт srt-sandbox</li><li>WFP ограда за изходящия трафик</li><li>Еднократна инсталация</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">Четене</div><div class="big" style="color:#b5cc94">Разрешено</div><p>Разрешено навсякъде по подразбиране. Забранете области като ~/.ssh и разрешете отново с allowRead.</p></div> <div class="dc"><div class="kicker">Запис</div><div class="big" style="color:#ef7a73">Забранено</div><p>Забранено навсякъде по подразбиране. Отворете пътища като "." и /tmp с allowWrite.</p></div> <div class="dc"><div class="kicker">Мрежа</div><div class="big" style="color:#ef7a73">Забранено</div><p>По подразбиране няма достъп. Всеки хост трябва да съвпада с allowedDomains.</p></div> </div> <div class="bars" id="bars"> <div class="kicker" style="margin-bottom:4px">Подкани за разрешения в Claude Code (индексирани)</div> <div class="bar"><div class="lb"><span>Без изолиране</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>С изолиране</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% по-малко подкани при вътрешното използване на Anthropic (по данни на компанията, инженерна публикация от октомври 2025 г.). Индексирано към 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>Изолиране</td><td class="hl">Примитиви на ОС</td><td>Примитиви на ОС</td><td>microVM</td><td>Firecracker microVM</td></tr> <tr class="row"><td>Стартиране</td><td class="hl">Локално</td><td>Локално</td><td>Локално</td><td>Облак / BYOC</td></tr> <tr class="row"><td>Контейнер или VM</td><td class="hl">Не</td><td>Не</td><td>Да</td><td>Да</td></tr> <tr class="row"><td>Мрежа по подразбиране</td><td class="hl">Забрани всичко</td><td>Изключена (превключвател)</td><td>Избрана политика</td><td>Включена</td></tr> <tr class="row"><td>Списък с разрешени домейни</td><td class="hl">Заместващи знаци + портове</td><td>Не е разкрито</td><td>Заместващи знаци + портове</td><td>allowOut, заместващи знаци</td></tr> <tr class="row"><td>Лиценз</td><td class="hl">Apache-2.0</td><td>Apache-2.0</td><td>Не е разкрито</td><td>Apache-2.0 (SDK)</td></tr> </tbody> </table> </div> </div> <div class="ft"><span>Източници: github.com/anthropics/sandbox-runtime · anthropic.com/engineering · v0.0.81</span><span class="mtp">Създадено от 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=[ ['Вашият агент изпълнява команда','Агентът, MCP сървърът или CLI инструментът изпраща команда. Тя не се променя; srt просто я обвива.',0,'act'], ['srt изгражда политиката','srt зарежда ~/.srt-settings.json (или вградените настройки по подразбиране) и стартира HTTP и SOCKS5 прокси сървъри на хоста.',1,'act'], ['ОС прилага границата','Seatbelt (macOS), bubblewrap (Linux) или WFP ограда (Windows alpha) прилага правилата за файловете към цялото дърво на процесите.',2,'act'], ['Целият трафик минава през прокси сървъра','Пясъчната среда няма директен маршрут навън. В Linux мрежовото пространство от имена е премахнато; до прокси сървърите се достига чрез Unix сокети.',3,'act'], ['Разрешен хост: връзката продължава','Хост в allowedDomains преминава след проверка дали не се преобразува до loopback или IP адреси на облачни метаданни.',4,'ok'], ['Непознат хост: блокиран или изисква потвърждение','Забранен или непосочен хост се отхвърля или callback за потвърждение взема решение. Нарушението се записва, за да може агентът да го прочете.',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>Стъпка '+(fi+1)+' от '+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='Автоматично възпроизвеждане';return} this.textContent='Пауза';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) ...','Четенето е разрешено по подразбиране, а текущата директория може да се чете.']}, function(){return on('f-ssh')?[0,'cat: ~/.ssh/id_rsa: Operation not permitted','~/.ssh е в denyRead, затова ключът не може да бъде прочетен.']:[1,'-----BEGIN OPENSSH PRIVATE KEY----- ...','Без правило denyRead четенето е разрешено навсякъде. Забранявайте изрично достъпа до тайни.']}, function(){return on('d-anth')?[1,'<html>...</html>','anthropic.com е в allowedDomains, затова прокси сървърът препраща заявката.']:[0,'Връзката е блокирана от списъка с разрешени мрежи','Няма съвпадение със списъка: мрежата е забранена по подразбиране.']}, function(){return [0,'Връзката е блокирана от списъка с разрешени мрежи','example.com не е в списъка с разрешени домейни.']}, function(){return on('d-npm')?[1,'packages installed (illustrative output)','*.npmjs.org е в списъка с разрешени домейни, така че регистърът е достъпен.']:[0,'npm ERR! network request to registry.npmjs.org failed\nВръзката е блокирана от списъка с разрешени мрежи','Класическият компромис: ако настройките са прекалено строги, инсталациите се провалят.']}, function(){return on('f-env')?[0,'bash: .env: Operation not permitted','denyWrite има предимство пред allowWrite, така че .env остава защитен в проекта.']:[1,'(written)','"." е в allowWrite, така че записването е успешно.']} ]; 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">Изпълнява се в пясъчната среда...</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 използва вградения инструмент sandbox-exec с Seatbelt профили, генерирани при всяко изпълнение. Профилът разрешава само 1 локален порт, на който слушат прокси сървърите на srt. Нарушенията могат да се прочетат в реално време от системния журнал.', 'Linux използва bubblewrap и напълно премахва мрежовото пространство от имена. До прокси сървърите се достига чрез Unix сокети, монтирани чрез bind в пясъчната среда. Ubuntu 24.04+ изисква промяна в AppArmor за потребителските пространства от имена.', 'Windows (алфа) изпълнява командите чрез специален акаунт srt-sandbox. Филтър на WFP за цялата машина блокира изходящия му трафик, с изключение на портовете на прокси сървъра. Настройката изисква 1 инсталация с повишени права.']; 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> ">

Истинският компромис: строги списъци с разрешени домейни срещу работещи агенти

Агентите за програмиране правят повече от редактиране на файлове. Те инсталират зависимости, изтеглят документация и извикват API. Направете списъка с разрешени домейни прекалено строг и npm install ще се провали. Направете го прекалено широк и пясъчната среда ще защитава малко. srt предлага няколко настройки за този баланс:

  • Заместващи знаци и портове: записи като *.npmjs.org или api.example.com:443.
  • Callback за потвърждение: взема решение за хостове, които не са обхванати от правило, и може да върне причина, която моделът да прочете.
  • Списъци с разрешени домейни за отделна команда: отварят регистър само за 1 извикване.
  • Актуализации в реално време: --control-fd заменя мрежовите списъци, докато командата се изпълнява.
  • Проверка на преобразувания адрес: блокира разрешени имена, които се преобразуват до loopback или IP адреси на облачни метаданни.
  • Причини за забранените домейни: посочват на агента разрешената алтернатива, например HTTPS git remote.

Как се сравнява с други пясъчни среди за агенти?

ФункцияAnthropic sandbox-runtimeOpenAI Codex CLI sandboxDocker SandboxesE2B
ИзолиранеПримитиви на ОС: Seatbelt, bubblewrap, Windows акаунт + WFPПримитиви на ОС: Seatbelt, bubblewrap, нативна пясъчна среда на WindowsmicroVM за всяка пясъчна средаFirecracker microVM за всяка сесия
Къде работиЛокална машинаЛокална машинаЛокална машинаОблак или BYOC (AWS, GCP)
Нужен ли е контейнер или VMНеНеДа (microVM)Да (управлявана microVM)
Използване извън собствения му агентДа, CLI + библиотека за всеки процесВграден в CodexДа, sbx CLI за агенти за програмиранеДа, JS и Python SDK
Мрежа по подразбиранеЗабрани всичко; прокси списък с разрешени домейниИзключена в workspace-write; превключвател в конфигурациятаПолитика, избрана при първото стартиране (например забрани всичко, балансирана)Включена по подразбиране; може да бъде изключена
Списък с разрешени домейниДа, заместващи знаци + портовеНе е разкрито (документиран превключвател вкл./изкл.)Да, заместващи знаци + портовеДа, allowOut със заместващи знаци (на база SNI/Host)
ЛицензApache-2.0Apache-2.0Не е разкритоApache-2.0 (SDK)
СтатусБета изследователска версия; Windows е в алфаДоставя се с Codex CLIПродукт в продажбаПродукт в продажба

Основни изводи

  • srt изолира всеки процес на ниво ОС, без да е нужен контейнер.
  • Seatbelt в macOS, bubblewrap в Linux, Windows е в алфа.
  • Мрежата е забранена по подразбиране; всяка връзка преминава през прокси сървър на хоста със списък с разрешени домейни.
  • Anthropic съобщава за 84% по-малко подкани за разрешения в Claude Code (вътрешни данни).
  • Широчината на списъка с разрешени домейни е истинският регулатор на сигурността; широките домейни могат да доведат до изтичане на данни.

Разгледайте хранилището в GitHub, инженерната публикация на Anthropic и документацията за пясъчната среда на Claude Code. Всички заслуги са за изследователя на този проект. Също така можете да ни последвате в Twitter и не забравяйте да се присъедините към нашия ML SubReddit с над 150 хил. членове и да се абонирате за нашия бюлетин. Чакайте! В Telegram ли сте? Вече можете да се присъедините към нас и в Telegram.

Имате нужда от партньор за популяризиране на вашето GitHub хранилище, страница в Hugging Face, продуктова премиера, уебинар и т.н.? Свържете се с нас

Преведено автоматично от английски. Оригиналната статия е на връзката по-долу.

Първоначално публикувано от MarkTechPost на

Прочетете оригинала в MarkTechPost ↗

Текстът и изображенията са собственост на MarkTechPost и са възпроизведени тук с посочване на авторството и връзка към оригиналната публикация.

← Към новините

Още новини

Всички последни новини