ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Agent沙箱到底是个啥?隔离机制与选型拆解

Agent沙箱到底是个啥?隔离机制与选型拆解 翻 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 一上头改了提交历史。这些细节来自社区作者的整理具体行为仍需以官方文档为准但作为测试断言的思路是现成的探文件写入、探网络外连这两条值得直接进 CIAgent 工具每次升级后跑一遍比人工抽查可靠。所以下次评测一个 Agent 工具别光看它弹窗勤不勤快多问三句沙箱是不是默认开网络是不是默认断环境是不是一次一换。这三个答案比宣传页上任何一句安全承诺都实在。咱们这行有句老话永远不要相信用户的输入。现在得再补一句永远不要盲目相信大模型写的代码。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进