MarkTechPostتاريخ نشر المصدر

تعرّف على sandbox-runtime من Anthropic: عزل على مستوى نظام التشغيل لوكلاء الذكاء الاصطناعي دون حاويات

في هذه المقالة، سنناقش مشروع Anthropic مفتوح المصدر الرائج حديثًا sandbox-runtime (srt)، آلية العزل على مستوى نظام التشغيل التي تقف خلف أداة bash المعزولة في Claude Code. يحدّد sandbox-runtime من Anthropic الملفات التي يمكن للعملية لمسها والمضيفين الذين يمكنها الوصول إليهم، وهو يفعل ذلك دون الحاجة إلى تشغيل حاوية.

في هذه المقالة، سنناقش مشروع Anthropic مفتوح المصدر الرائج حديثًا sandbox-runtime (srt)، آلية العزل على مستوى نظام التشغيل التي تقف خلف أداة bash المعزولة في Claude Code. يحدّد sandbox-runtime من Anthropic الملفات التي يمكن للعملية لمسها والمضيفين الذين يمكنها الوصول إليهم، وهو يفعل ذلك دون الحاجة إلى تشغيل حاوية. كما أنه غير مرتبط بـ Claude Code فقط، إذ يمكن تشغيل وكلائك الخاصين وخوادم MCP المحلية وبرامج سطر الأوامر العادية داخله.

TL;DR

  • الحجم: حزمة npm @anthropic-ai/sandbox-runtime الإصدار v0.0.81، بحجم حوالي 11.4 ميجابايت بعد فك الضغط، برخصة Apache-2.0، ويتطلب Node.js 22.12 أو أحدث.
  • يعمل على: أي جهاز تطوير يعمل بنظام macOS أو Linux أو أي خادم CI. يستخدم macOS أداة Seatbelt؛ أما Linux فيحتاج إلى bubblewrap وsocat وripgrep. دعم Windows لا يزال في مرحلة ألفا.
  • الأداء: قلّصت البيئة المعزولة (sandboxing) مطالبات الأذونات في Claude Code بنسبة 84% في استخدام Anthropic الداخلي (وفق تصريح ذاتي).
  • الأفضل: 84% أقل من مطالبات الأذونات، مع فرض حدود على الملفات والشبكة على شجرة العمليات بأكملها.
  • الأسوأ: لا يزال معاينة بحثية تجريبية، ودعم Windows في مرحلة alpha.

ما هو Anthropic sandbox-runtime؟

Anthropic sandbox-runtime هي أداة مفتوحة المصدر تحيط أي عملية بقيود على نظام الملفات والشبكة. يمكنك تثبيتها باستخدام npm install -g @anthropic-ai/sandbox-runtime، ثم إضافة بادئة لأمر ما باستخدام srt. تعمل كأداة سطر أوامر وككمكتبة TypeScript.

كيف يعمل sandbox-runtime على macOS وLinux وWindows؟

يستخدم srt آليات العزل الأصلية لكل نظام تشغيل. تغطي قيوده شجرة العمليات بأكملها، بما في ذلك السكربتات والعمليات الفرعية.

  • macOS: sandbox-exec مع ملفات Seatbelt_profile يتم إنشاؤها ديناميكيًا. يتطلب ripgrep فقط.
  • Linux: bubblewrap مع إزالة مساحة أسماء الشبكة. يحتاج أيضًا إلى socat وripgrep.
  • Windows (alpha): حساب مخصص srt-sandbox ، وسياج خروج من Windows Filtering Platform، وقوائم ACL صريحة للملفات.

يخرج حركة المرور فقط عبر وكلاء HTTP و SOCKS5 يعملون على المضيف. على Linux، يقع هؤلاء الوكلاء خلف مقابس Unix المربوطة بالربط (bind-mounted) داخل البيئة المعزولة. على macOS، يسمح ملف Seatbelt التعريفي فقط بمنفذ localhost واحد. ثم يطبق الوكلاء قوائم السماح والرفض الخاصة بك للنطاقات.

لماذا يحتاج إلى عزل نظام الملفات وعزل الشبكة معًا؟

يجادل فريق Anthropic بأن الحدود 1 بدون الأخرى تفشل. بدون عزل الشبكة، يمكن لوكيل تم حقنه عبر توجيه الرسائل (prompt-injected) أن يسرّب مفاتيح SSH. بدون عزل نظام الملفات، يمكنه الهروب من البيئة المعزولة والحصول على وصول إلى الشبكة.

تتبع الإعدادات الافتراضية لـ srt ذلك المنطق. القراءات مسموحة في كل مكان ما لم تُرفض. الكتابات مرفوضة في كل مكان ما لم تُسمح. الوصول إلى الشبكة مرفوض ما لم يُدرج نطاق في قائمة السماح.

كيف تعزل بيئة (sandbox) خادم 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">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">اختر أمرًا. بدّل الإعدادات لترى ما الذي يتغيّر.</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 account</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>microVM عبر Firecracker</td></tr> <tr class="row"><td>مكان التشغيل</td><td class="hl">محليًا</td><td>محليًا</td><td>محليًا</td><td>سحابة / BYOC</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>مفعّلة</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); })}); // التدفق var steps=[ ['وكيلك ينفذ أمرًا','يصدر الوكيل أو خادم MCP أو أداة سطر الأوامر أمرًا. يبقى الأمر كما هو؛ srt يغلّفه فقط.',0,'act'], ['srt يبني السياسة','يحمّل srt ملف ~/.srt-settings.json (أو الإعدادات الافتراضية المدمجة) ويشغّل وسيطي HTTP وSOCKS5 على المضيف.',1,'act'], ['نظام التشغيل يفرض الحدود','Seatbelt (macOS) أو bubblewrap (Linux) أو سياج WFP (Windows ألفا) يطبق قواعد الملفات على شجرة العمليات بأكملها.',2,'act'], ['كل حركة البيانات تمر عبر الوسيط','لا توجد بيئة الصندوق الرمل أي مسار مباشر للخارج. على Linux، تُزال مساحة أسماء الشبكة؛ ويتم الوصول إلى الوسطاء عبر Unix sockets.',3,'act'], ['مضيف مسموح: يُكمل الاتصال','المضيف الموجود في allowedDomains يمرّ، بعد التحقق من أنه لا يُترجم إلى loopback أو عناوين IP الخاصة ببيانات وصفية السحابية.',4,'ok'], ['مضيف غير معروف: يُحجب أو يُطلب الإذن','يُرفض المضيف المحجوب أو غير المدرج، أو يقرر ذلك استدعاء ask. يُسجَّل هذا الخرق ليقرأه الوكيل.',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(); // المحاكاة 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,'Connection blocked by network allowlist','لا تطابق في قائمة السماح: الشبكة محجوبة افتراضيًا.']}, function(){return [0,'Connection blocked by network allowlist','example.com غير مدرجة في قائمة السماح.']}, function(){return on('d-npm')?[1,'packages installed (illustrative output)','*.npmjs.org مدرجة في قائمة السماح، لذا يمكن الوصول إلى المستودع.']:[0,'npm ERR! network request to registry.npmjs.org failed\nConnection blocked by network allowlist','المقايضة الكلاسيكية: القائمة شديدة الصرامة، وتفشل عمليات التثبيت.']}, 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); })}); // المنصات var P=['macOS تستخدم أداة sandbox-exec المدمجة مع ملفات Seatbelt يُنشأ ملفها لكل تشغيل. يسمح الملف بمنفذ 1 محلي فقط، حيث يستمع وسطا srt. يمكن قراءة الخرق من سجل النظام في الوقت الفعلي.', 'Linux تستخدم bubblewrap وتزيل مساحة أسماء الشبكة بالكامل. يُتوسط الوصول إلى الوسطاء عبر Unix sockets التي تُثبَّت بالربط داخل الصندوق الرمل. يحتاج 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> ">

المقايضة الحقيقية: قوائم السماح الصارمة مقابل الوكلاء العاملين

وكلاء البرمجة يفعلون أكثر من مجرد تعديل الملفات. فهم يثبتون التبعيات، ويسحبون الوثائق، ويستدعون واجهات برمجة التطبيقات. اجعل قائمة السماح صارمة أكثر من اللازم فيفشل npm install ، واجعلها فضفاضة أكثر من اللازم فيحمي صندوق الحماية القليل. يوفر srt عدة مقابض لتلك المنطقة الوسطى:

  • الرموز البديلة والمنافذ: إدخالات مثل *.npmjs.org أو api.example.com:443.
  • طلب رد الاتصال: يقرر المضيفين الذين لا تغطيهم أي قاعدة، ويمكنه إرجاع سبب يقرؤه النموذج.
  • قوائم السماح لكل أمر: فتح سجل لاستدعاء 1 فقط.
  • التحديثات الحية: --control-fd تستبدل قوائم الشبكة بينما الأمر قيد التشغيل.
  • التحقق من العناوين المحلولة: يحجب الأسماء المسموح بها التي تُحل إلى عناوين الاسترجاع المحلي (loopback) أو عناوين IP الوصفية للخدمات السحابية.
  • أسباب رفض النطاقات: تخبر الوكيل بالبديل المعتمد، مثل مستودع git عبر HTTPS..

كيف يمكن مقارنته بصناديق حماية الوكلاء الأخرى؟

الميزةAnthropic sandbox-runtimeOpenAI Codex CLI sandboxDocker SandboxesE2B
العزلبدائل نظام التشغيل: Seatbelt وbubblewrap وحساب Windows + WFPبدائل نظام التشغيل: Seatbelt وbubblewrap وصندوق حماية Windows الأصليmicroVM لكل صندوق حمايةFirecracker microVM لكل جلسة
أين يعملالجهاز المحليالجهاز المحليالجهاز المحليسحابة أو BYOC (AWS، GCP)
مطلوب حاوية أو آلة افتراضيةلالانعم (microVM)نعم (microVM مُدار)
الاستخدام خارج عميله الخاصنعم، واجهة سطر أوامر + مكتبة لأي عمليةمدمج في Codexنعم، واجهة sbx السطرية لوكلاء البرمجةنعم، حزم تطوير JS وPython
الشبكة افتراضياًرفض الكل؛ قائمة سماح عبر وسيطمغلق في workspace-write; مفتاح تبديل في الإعداداتيُختار السياس عند أول تشغيل (مثل رفض الكل، متوازن)مفعّل افتراضياً; يمكن تعطيله
قائمة سماح للنطاقاتنعم، أحرف بدل + منافذغير معلن (مفتاح تشغيل/إيقاف موثّق)نعم، أحرف بدل + منافذنعم، allowOut بأحرف البدل (مبني على SNI/Host)
الترخيصApache-2.0Apache-2.0غير معلنApache-2.0 (حزمة التطوير)
الحالةمعاينة بحثية تجريبية؛ نسخة Windows ألفايأتي ضمن Codex CLIمنتج مطروحمنتج مطروح

الخلاصة الرئيسية

  • أداة srt تعزل أي عملية على مستوى نظام التشغيل، دون حاجة إلى حاوية.
  • Seatbelt على macOS، وbubblewrap على Linux، وWindows في مرحلة ألفا.
  • الشبكة مرفوضة افتراضياً؛ كل اتصال يمر عبر وسيط بقائمة سماح على الجانب المضيف.
  • تُبلغ Anthropic عن انخفاض مطالبات الأذونات في Claude Code بنسبة 84% (داخلياً).
  • اتساع قائمة السماح هو مقياس الأمان الحقيقي؛ فالنطاقات الواسعة قد تسرّب البيانات.


تفضّل بالاطلاع على مستودع GitHub، الـ منشور فريق الهندسة في Anthropic و وثائق الحماية (sandboxing) لـ Claude Code. كل الفضل يعود إلى باحث هذا المشروع. كما يمكنك بحرية متابعتنا على تويتر ولا تنسَ الانضمام إلى 150k+ مجتمع ML على ريديت واشترك في نشرةنا البريدية! مهلاً! هل أنت على تيليجرام؟ يمكنك الآن الانضمام إلينا على تيليجرام أيضاً.

هل تحتاج إلى الشراكة معنا للترويج لمستودع GitHub الخاص بك OR صفحة Hugging Face OR إطلاق منتج OR ندوة عبر الإنترنت إلخ.؟ تواصل معنا

ظهر المقال تعرف على sandbox-runtime من Anthropic: عزل على مستوى نظام التشغيل لوكلاء الذكاء الاصطناعي، بدون حاويات أولاً على MarkTechPost.

المصدر الأصلي

MarkTechPost

ملاحظات المحتوى

النشر الأصلي والحقوق تعود إلى المصدر.

ترجمة آلية · يُرجى الرجوع إلى الأصل