☰
Agent沙箱到底是个啥?隔离机制与选型拆解
2026/10/10 5:44:16 网站建设 项目流程

翻 Claude Code 的文档、用 Codex、WorkBuddy,总有一个词在眼前晃:沙箱。据社区资料描述,Claude Code 有专门讲沙箱的文档章节,Codex 默认在沙箱里跑、想联网得单独申请,WorkBuddy 装完第一件事就是让你勾选它能碰哪些文件夹。需要说明的是,这些说法来自社区作者的公开教程,尚未在本篇中以官方文档独立核验,具体默认行为请以各产品官方文档为准。

很多人第一反应是往熟悉的概念上套:虚拟机?Docker 容器?Python 的 venv?答案都不对,而且这几个词压根不在一个层面上。

沙箱到底是个啥

简单说,沙箱就是给代码执行划的一块活动范围。它能看到哪些文件、能起哪些进程、能不能联网,全都在外面提前设好。它想干范围之外的事,系统直接拦下来,命令报错,执行不了。

为什么要这么干?因为放进沙箱的代码不一定可信。万一它带毒、被人做了手脚,或者纯粹写崩了,有沙箱圈着,文件偷不走,网连不上,系统也改不动。最坏的结果,就是沙箱里那点东西完蛋,你的电脑和资料安然无恙。

打个比方,同事借手机打电话,你把手机打开到拨号界面递过去就行,没人会把锁屏密码也告诉他。很多安全问题的根源就出在这:为了完成一个很小的任务,我们给了他过大的权限。

沙箱就是给代码围的这个栏,代码在里面照常跑,但怎么折腾都出不了圈。程序该跑照样跑,沙箱管住的,只是它能影响的范围。这个词最早主要在安全行业里用,到今天已经用了几十年,只不过这两年 Agent 火了,才跟着被越来越多人提起。

你其实早就装了一堆沙箱

iOS 给每个 App 划了一块自己的地盘,只能在自己目录里读写文件。微信看不到淘宝的缓存,淘宝也翻不着微信的聊天记录,这是系统级的强制隔离。App Store 敢让几百万陌生开发者往你手机里塞东西,靠的就是这套机制在底下兜着。Android 一个路子,每个 App 发一个独立的 Linux 用户 ID,内核按用户权限把大家隔开。

浏览器里打开一个陌生网站,页面里的 JavaScript 想读本地文件、想开个 shell?门都没有。Chrome 这类浏览器把网页渲染塞进了一个被剥夺了系统权限的进程,它要干任何超出页面的事,只能给浏览器主进程发消息申请。

刷题平台为什么敢直接跑你提交的任意代码?因为判题机是跑在独立的沙箱环境里。

把这几个例子摆到一块,套路就一个:手机里的 App、浏览器里的网页、刷题平台里你提交的代码,处理办法全是同一套——先圈起来,再让它跑,即便出了事,也只会搞坏圈里那一小块。

沙箱和虚拟机、Docker 到底啥区别

这是被问得最多、也最容易混淆的。真论起来,这几个压根不在一个层面上。

虚拟机是一种具体的技术。虚拟出来的是一整套设备,里面装一个完整的操作系统,自带内核。它解决的是资源问题,一台机器当多台用。

Docker 容器也是一种具体的技术。它不虚拟硬件,所有容器共享宿主机的内核,靠 Namespace 把每个容器能看到的进程、网络、文件系统隔开。容器解决的是环境问题,一次构建,到哪都能跑。

沙箱跟前两个都不太一样,它指的是一个安全目标:要把一段程序能碰的东西摁在一个圈里,文件、进程、网络,圈外的一律够不着。至于用什么实现,没有限定,容器可以,虚拟机可以,操作系统自带的权限机制也可以。沙箱解决的是安全问题,控制程序代码执行的影响范围。

虚拟机Docker 容器沙箱
是什么一种虚拟化技术一种容器技术一个安全目标
怎么隔离虚拟整套硬件,自带内核共享内核,Namespace + cgroups不限,权限、容器、虚拟机都行
解决什么资源,一台机器当多台环境,一次构建到处跑安全,控制影响范围
典型开销GB 级镜像,分钟级启动MB 级镜像,秒级启动看实现,从零开销到 GB 级
拦得住恶意代码吗拦得住,难逃逸拦一部分看实现强度

为啥 AI Agent 又带火了 Sandbox

这词都用几十年了,为啥这两年突然满世界都是?因为写代码的,从人换成了模型。

以前的玩法,大模型只是个代码辅助工具,能帮你补代码、生成函数,但代码复制到编辑器里,跑不跑、怎么跑,全是你自己来。

现在的主流 Agent,你扔给它一个任务,它自己读文件、写代码、起 shell、跑测试、看报错、接着改,几十条命令,条条都是它自己拍板执行的。接的工具越来越多,文件系统、终端、浏览器、数据库。

更重要的是,Agent 越来越多的是挂着没人看的长程任务。半夜跑回归、自动修 bug、云端并行几十个会话,人根本不在屏幕前。弹窗批准这条路走不通了:一是人不在,二是就算在,一下午批几十次之后,剩下的基本就是无脑点允许,弹窗形同虚设。

沙箱的思路正好反过来。不一条条问你,直接把边界焊死,边界里头随便你折腾。

用一条 docker run 模拟沙箱拦了啥

上面这些概念听着玄乎,拆开看,就是几个开关的事。用 Docker 拼一个最小沙箱,只需要一条命令:

docker run --rm \ --network none \ --read-only \ --cap-drop ALL \ --security-opt no-new-privileges \ --memory 512m \ --pids-limit 256 \ -v "$PWD:/workspace" -w /workspace \ python:3.12-slim python main.py
  • --network none:容器里压根没有网卡,数据就算被读走也发不出去,泄露这条路在网络这层就断了。
  • --read-only:根文件系统只读,整个容器只有挂进去的/workspace能写。
  • --cap-drop ALL:把 Linux capabilities 全扔了,容器里的 root 就是个名字,特权操作一样都干不了。
  • --memory 512m和--pids-limit 256:一个管内存,一个管进程数,死循环和进程炸弹都拖不死宿主机。
  • --rm:用完即焚。

文件、网络、权限、资源。以后谁跟你说他这有个沙箱,你就问这四样各拦到啥程度。答不上来的,八成只是个把依赖隔开的环境,跟安全不沾边。

两个落地时容易踩的坑

--read-only是最容易被低估的一项。根文件系统只读之后,不少工具链会往/tmp和用户缓存目录写中间产物,一跑就 EROFS。实际落地通常要给/tmp挂 tmpfs,把包管理器缓存指进 workspace,否则 Agent 每次装依赖都会撞墙。

--network none在真实任务里也很难一步到位,装依赖、拉包都要网。可操作的折中是给容器配只放行白名单域名的代理,把网络出口收口到一个可审计的点上,而不是简单地在“全通”和“全断”之间二选一。

企业落地 Agent 的沙箱选型维度

如果要把 Agent 放进生产环境,光有一条 docker run 不够,选型时至少要把下面几件事问清楚。

隔离层级。进程级隔离(seccomp、capabilities、只读挂载)开销最低,但共享内核,逃逸面最大;容器级隔离(Namespace + cgroups)在开销和隔离之间取平衡;虚拟机或微虚拟机把内核也隔开,逃逸难度显著上升,代价是启动时间和内存占用。选哪一层,取决于你放进去的代码有多不可信、任务有多长。

默认开关。沙箱是默认开还是默认关,网络是默认断还是默认通,这两条决定了安全基线。默认关、需要手动打开的设计,在长程无人值守场景里基本等于没有。

网络策略。全断最安全但很多任务跑不动,全通最省事但等于没拦。白名单出口加可审计代理,是工程上更现实的中间态。

文件系统边界。工作区可写、其余只读是常见起点。要额外注意的是.git这类目录,一旦被 Agent 改写,提交历史就没了,是否强制只读需要明确决策。

环境生命周期。一次一换还是长期复用,直接决定横向污染的风险。用完即焚的容器,比长期驻留的环境干净得多。

资源上限。内存和进程数不设限,一个死循环或进程炸弹就能把宿主机拖垮,沙箱本身也就失效了。

落到测试工作上有什么作用

沙箱对测试人来说,不是背个新概念就完了,它直接多出一类能落地的用例:越权测试。

以前测越权,测的是人写的接口,构造个越权请求,看服务端拦不拦。Agent 一来,被测对象多了一个自己会动手的角色,用例跟着变形。

把 Agent 关进沙箱里跑任务。正向用例,测它该干的能不能干成:装依赖、跑测试、改文件。反向用例,故意诱导它越界:让它读工作区外的文件,让它 curl 一个外网地址,让它去改.git目录,看沙箱兜不兜得住。

据社区资料描述,Claude Code 文档里提到过两条自测命令,一条探文件写入,一条探网络外连;Codex 的 workspace-write 档位里.git目录被描述为强制只读,防的就是 Agent 一上头改了提交历史。这些细节来自社区作者的整理,具体行为仍需以官方文档为准,但作为测试断言的思路是现成的:探文件写入、探网络外连这两条,值得直接进 CI,Agent 工具每次升级后跑一遍,比人工抽查可靠。

所以下次评测一个 Agent 工具,别光看它弹窗勤不勤快,多问三句:沙箱是不是默认开,网络是不是默认断,环境是不是一次一换。这三个答案,比宣传页上任何一句安全承诺都实在。

咱们这行有句老话,永远不要相信用户的输入。现在得再补一句:永远不要盲目相信大模型写的代码。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询