Представяме sandbox-runtime на Anthropic: пясъчна среда на ниво ОС за AI агенти, без контейнери
В тази статия ще обсъдим новия набиращ популярност проект с отворен код на Anthropic sandbox-runtime (srt) — пясъчната среда на ниво ОС, която стои зад изолирания bash инструмент на Claude Code. Anthropic sandbox-runtime ограничава файловете, до които даден процес може да има достъп, и хостовете, до които може да се свързва. Това се случва без стартиране на контейнер. Освен това не е обвързан с Claude Code. Вашите собствени агенти, локални MCP сървъри и обикновени програми от командния ред могат да работят в него.
Накратко
- Размер: npm пакет
@anthropic-ai/sandbox-runtimev0.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" 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 >> .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,'<')+'\n<span class="dim">Изпълнява се в пясъчната среда...</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 използва вградения инструмент 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-runtime | OpenAI Codex CLI sandbox | Docker Sandboxes | E2B |
|---|---|---|---|---|
| Изолиране | Примитиви на ОС: Seatbelt, bubblewrap, Windows акаунт + WFP | Примитиви на ОС: Seatbelt, bubblewrap, нативна пясъчна среда на Windows | microVM за всяка пясъчна среда | Firecracker microVM за всяка сесия |
| Къде работи | Локална машина | Локална машина | Локална машина | Облак или BYOC (AWS, GCP) |
| Нужен ли е контейнер или VM | Не | Не | Да (microVM) | Да (управлявана microVM) |
| Използване извън собствения му агент | Да, CLI + библиотека за всеки процес | Вграден в Codex | Да, sbx CLI за агенти за програмиране | Да, JS и Python SDK |
| Мрежа по подразбиране | Забрани всичко; прокси списък с разрешени домейни | Изключена в workspace-write; превключвател в конфигурацията | Политика, избрана при първото стартиране (например забрани всичко, балансирана) | Включена по подразбиране; може да бъде изключена |
| Списък с разрешени домейни | Да, заместващи знаци + портове | Не е разкрито (документиран превключвател вкл./изкл.) | Да, заместващи знаци + портове | Да, allowOut със заместващи знаци (на база SNI/Host) |
| Лиценз | Apache-2.0 | Apache-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, продуктова премиера, уебинар и т.н.? Свържете се с нас
Преведено автоматично от английски. Оригиналната статия е на връзката по-долу.