大家好,我是蓝戒。本篇我们来聊聊:“Claude同款沙箱srt”。
这两年深度使用 Coding Agent 和 MCP(Model Context Protocol)生态的开发者,大概率都在日常工作里遇到过一种很微妙的“纠结感”。
倒不是说大家每天都在担心 AI 会像科幻片里那样突然发疯、敲一行 rm -rf / 把硬盘删光——现在的旗舰模型在指令遵循上已经相当稳健了。真正困扰一线工程师的,其实是两个非常具体的工程权衡:
第一个权衡,叫“审批疲劳(Approval Fatigue)”与开发心流的冲突。当你在终端里让 Agent 跑一套复杂的测试、修 Bug 或者装依赖时,如果每执行一条 Shell 命令都要弹窗让你点一次“Confirm”,不出半小时你就会点得麻木,最后索性直接开起 --dangerously-skip-permissions(全自动放行模式)。但一旦全放行,万一遇到网页抓取里的隐藏提示词注入(Prompt Injection),或者脚本里拼错了一个路径变量,确实容易误伤工作区之外的文件。
第二个权衡,则是 MCP 插件生态里的“权限粒度过粗”问题。现在社区里有成百上千个好用的第三方 MCP 服务,我们习惯在 .mcp.json 里写一行 npx -y @some-community/mcp-server 直接拉起来用。这种方式虽然丝滑,但在操作系统层面,npx 拉起的子进程默认完整继承了你当前系统账号的全部权限——哪怕它只是一个帮你格式化文档的轻量插件,理论上也同样拥有读取 ~/.ssh/id_rsa、~/.aws 密钥并向任意外部公网 IP 发请求的底层能力。如果为了防这一下而给每个本地小工具都套一层笨重的 Docker 容器,不仅镜像维护麻烦,宿主机目录挂载和本机工具链调用更是处处掣肘。
我们真正缺的,其实是一把“比 Docker 轻得多、但比裸跑严密得多”的手术刀——不需要起虚拟机和容器,直接在操作系统进程级别画一道圈,圈内让 Agent 免打扰全速狂飙,圈外的文件和未授权域名一律物理断路。
就在近日,Anthropic 给出了他们的官方解法:正式以商业友好的 Apache 2.0 协议开源了驱动 Claude Code 底层的同款轻量级操作系统沙箱——sandbox-runtime(NPM 包名为 @anthropic-ai/sandbox-runtime,命令行工具简称 srt)。
根据 MarkTechPost 的技术追踪与 AI Weekly 通报,这套解压后仅 11.4 MB 的工具不仅帮 Anthropic 内部将 Claude Code 的权限弹窗打扰频次直接砍掉了 84%,而且完全解耦了 Claude 生态——你可以用它包裹任何自研 Agent、社区 MCP 服务乃至任意一行本地命令。今天咱们就从底层原理到 .mcp.json 实战配置,把它拆个透彻。
一、抛弃容器虚拟化:srt 是如何用原生 OS 机制锁死整个进程树的?
很多同学第一次听说 sandbox-runtime时都会问:既不用 Docker,也不起 Firecracker 微虚拟机,它靠什么拦住一个进程偷偷读文件或联网?
答案是:直接调用三大操作系统内核原生自带、但平时配置极其繁琐的底层沙箱原语(OS Primitives)。当你用 srt 启动一个命令时,这些限制不仅作用于当前主进程,还会自动传染并锁死它派生(Fork/Spawn)出来的所有子进程树:
- macOS 端(基于
sandbox-exec与动态 Seatbelt 配置):macOS 内核其实一直内置了极其强大的强制访问控制框架 Seatbelt,只是手写.sb规则文件堪比天书。srt会在启动瞬间根据你的 JSON 配置动态生成一段严密的 Seatbelt 策略并通过sandbox-exec注入,甚至还能直接挂载 macOS 系统的沙箱违规日志存储(Violation Log Store)实现实时越权告警。 - Linux 端(基于
bubblewrap与独立网络命名空间):在 Linux 上,srt借助 Flatpak 同款的轻量级非特权沙箱工具bubblewrap(bwrap),在毫秒级时间内构建文件挂载隔离,并直接彻底移除子进程的网络命名空间(Network Namespace),配合 BPF/seccomp 实现底层 Unix Socket 级过滤。 - Windows 端(基于专用受限账户、WFP 网络围栏与 NTFS ACL):针对最难啃的 Windows 平台,
srt(目前处于 Alpha 阶段)采用了一套精巧的组合拳——自动创建一个名为srt-sandbox的本地低权限专用账户,通过受限写入令牌(Write-Restricted Token)和工作目录上的显式 NTFS 访问控制列表(ACEs)锁死文件读写;同时利用 Windows 过滤平台(WFP, Windows Filtering Platform) 针对该账户的 SID 下发全局出站防火墙围栏(详见 GitHub 源码架构说明)。
二、为什么“文件隔离 + 网络隔离”必须成对出现?四大核心安全能力拆解
在 Anthropic 的沙箱设计文档里,工程团队提出了一个非常切中要害的“双重隔离模型(Dual Isolation Model)”:对于 AI Agent 来说,只做文件隔离或者只做网络隔离,都是形同虚设的。
道理很简单:如果只锁网络不锁文件,一旦进程接触到宿主机上的敏感配置或利用本地 IPC 通道(Unix Socket),就能轻易实现沙箱逃逸并重新拿到网络权限;反过来,如果只锁特定文件夹却放开公网连接,恶意脚本依然能把当前工作区里的业务源码打包发往外部服务器。
因此,sandbox-runtime在文件与网络两个维度上设计了严丝合缝的闭环:
1. 文件系统:读操作“黑名单特例覆盖”,写操作“严格白名单”
为了保证编译工具和解释器能正常加载系统依赖库,srt 默认允许读取大部分系统路径,但支持通过 denyRead 划定禁区(例如直接封死 ~/.ssh、~/.aws)。
这里有一个非常细腻的优先级设计:在读取规则上,虽然局部允许(allowRead)可以覆盖大范围禁止(比如禁止读取整个 /Users,但单独放行当前项目目录 .),但更具体的 denyRead 通配符规则依然拥有最高否决权——比如你在放行当前目录 . 的同时配了一句 denyRead: ["**/.env", "./secrets"],那么即便在当前项目目录下,Agent 也休想碰到任何一个 .env 密钥文件!而在写入规则上,默认全局禁止一切写入,只有被明确写进 allowWrite(如 . 和 /tmp)的路径才能落盘,且 denyWrite 永远一票否决。
2. 宿主机代理过筛:支持通配符域名白名单与防 DNS 重绑定
在网络侧,沙箱内部进程默认断绝一切直接外网连接。那 Agent 需要执行 npm install 或调 GitHub API 怎么办?
srt 会在宿主机外侧启动一个受控的 HTTP/HTTPS 代理与 SOCKS5 代理(Linux 下通过 socat 将宿主机 Unix 域套接字挂载进沙箱内部,macOS 与 Windows 则只允许沙箱访问本地回环的指定代理端口)。所有流量必须先过一遍宿主机代理的域名白名单(支持像 *.npmjs.org、api.github.com:443 这样的通配符与端口限制)。更贴心的是,代理层还内置了 解析地址核验(Resolved-Address Check)——哪怕某个域名在白名单里,一旦它通过 DNS 重绑定解析到了本机回环地址(Loopback)或云厂商元数据敏感 IP(如 169.254.169.254),连接依然会被当场掐断(详见 MarkTechPost 评测)。
3. 敏感凭证自动脱敏屏蔽(Credential Masking)与代理代签
很多时候 Agent 调命令行工具确实需要用到云端鉴权(比如 AWS CLI),但你又不想把真实的明文密钥直接暴露给沙箱里的进程。srt 支持在包装进程时构建 凭证掩码(Credential Masks) 自动屏蔽敏感环境变量与凭证文件,甚至支持通过 credentials.sigv4 钩子在宿主机代理层按请求动态完成 AWS SigV4 签名注入——沙箱里的程序顺利调通了接口,却自始至终连真密钥长什么样都摸不到。
4. 运行时动态热更新(--control-fd)与实验性 TLS 流量拦截
如果一个长任务跑到一半,需要临时放行一个新的软件源域名,难道要杀掉进程重跑吗?srt 提供了极其硬核的 --control-fd <fd> 管道控制描述符机制:父进程只需向指定的文件描述符推一行新的 JSON 配置,network.allowedDomains 和 deniedDomains 就会在下一个网络连接发起时秒级热生效(同时沙箱内的子进程该描述符被指向 /dev/null,杜绝沙箱内部篡改规则)。此外,针对高安全合规场景,它还内置了 network.mitmProxy 与实验性的 network.tlsTerminate 流量终结检查能力,方便接入外置审计决策器(srt-proxy)。
三、保姆级实战:10 秒改造 .mcp.json,把第三方 MCP 插件关进安全笼子
原理聊透了,咱们直接上手看代码。要在本地用起 srt(需 Node.js 22.12+ 环境;Linux 需提前装好系统包 bubblewrap、socat 和 ripgrep,macOS 仅需 ripgrep),只需一行全局安装命令:
Bash
npm install -g @anthropic-ai/sandbox-runtime
装好之后,哪怕你还不写任何配置文件,直接拿 srt 前缀去跑命令,它的默认安全基线(禁止一切联网、禁止范围外写入)就已经生效了(引自 GitHub 官方示例:https://github.com/anthropics/sandbox-runtime):
Bash
# 1. 默认无网络白名单,切网请求直接被代理层拦截
$ srt "curl example.com"
Running: curl example.com
Connection blocked by network allowlist
# 2. 尝试配合自定义规则阻止读取本机 SSH 私钥
$ srt "cat ~/.ssh/id_rsa"
Running: cat ~/.ssh/id_rsa
cat: /Users/ollie/.ssh/id_rsa: Operation not permitted
实战一:一行配置给社区 MCP 服务加上“防盗门”
正如 DEV Community 的实测文章所指出的,在 Claude Code 等工具中,内置的 /sandbox 默认只包裹了模型执行的 Bash 子命令,而外挂的第三方 MCP Server 默认是跑在沙箱外面的!
现在有了 srt,你只需要打开项目里的 .mcp.json,把原本的启动命令从 "npx" 改成 "srt",把原来的 npx 塞进参数数组里即可:
JSON
{
"mcpServers": {
"filesystem": {
"command": "srt",
"args": ["npx", "-y", "@modelcontextprotocol/server-filesystem"]
}
}
}
接着,在你的用户主目录下创建一个 ~/.srt-settings.json(或者用 --settings 指定路径),把允许访问的域名和禁止触碰的敏感目录写清楚:
JSON
{
"network": {
"allowedDomains": ["api.github.com", "*.npmjs.org"],
"deniedDomains": []
},
"filesystem": {
"denyRead": ["~/.ssh", "~/.aws", "**/.env"],
"allowWrite": [".", "/tmp"],
"denyWrite": ["~/sensitive-folder", ".env"]
}
}
改完这两处,无论你从 GitHub 上拉下来多么花里胡哨的社区 MCP 服务,只要它敢伸手去摸你的 ~/.ssh 私钥、改你的 .env 文件,或者偷偷向未授信的第三方服务器回传数据,内核级的 EPERM: operation not permitted 和代理拦截就会当场教它做人。
实战二:作为 TypeScript SDK 嵌入你自研的 Agent 框架
如果你正在用 Node.js 或 TypeScript 开发自己的自动化 Coding Agent,@anthropic-ai/sandbox-runtime 还可以直接作为代码库引入,并且支持挂载一个极其聪明的 ask 动态询问回调——当沙箱里的进程访问了不在规则内的陌生域名时,你可以弹窗让人类审批,或者返回一段结构化的拒绝原因(Reason),这段原因会被清理转义后直接注入到 <sandbox_violations> 块里喂回给大模型,让模型自己明白“为什么被拒、该换哪条路走”(详见官方文档):
TypeScript
import { SandboxManager, type SandboxRuntimeConfig } from '@anthropic-ai/sandbox-runtime'
import { spawn } from 'child_process'
const config: SandboxRuntimeConfig = {
network: {
allowedDomains: ['api.github.com', '*.npmjs.org'],
deniedDomains: [],
},
filesystem: {
denyRead: ['~/.ssh'],
allowWrite: ['.', '/tmp'],
denyWrite: ['.env'],
},
}
// 初始化沙箱与宿主机代理,并配置未知域名的动态审批回调
await SandboxManager.initialize(config, async ({ host, port }) => {
if (host === 'registry.yarnpkg.com') return true
return {
allow: false as const,
reason: `${host}:${port} 未在当前会话白名单中,请改用已授权的 npmjs.org 源`,
}
})
const sandboxedCmd = await SandboxManager.wrapWithSandbox('npm test')
const child = spawn(sandboxedCmd, { shell: true, stdio: 'inherit' })
child.on('exit', async () => await SandboxManager.reset())
四、横向对比与客观避坑:它能完全替代 Docker 和微虚拟机吗?
为了帮大家在架构选型时找准定位,我们结合 MarkTechPost 整理的四大主流 Agent 沙箱对比矩阵与 Claude Code 环境选型文档,做一张一目了然的横向对比表:
| 对比维度 | Anthropic sandbox-runtime (srt) | OpenAI Codex CLI 内置沙箱 | Docker Sandboxes (sbx) | E2B 云端沙箱 |
| 底层隔离机制 | 原生 OS 原语(macOS Seatbelt / Linux bubblewrap / Windows WFP+ACL) | 原生 OS 原语(Seatbelt / bubblewrap / Windows 原生沙箱) | 本地独立 MicroVM(微虚拟机) | 云端 Firecracker MicroVM |
| 是否需要容器/VM | 完全不需要(毫秒级进程包装,包体仅 11.4MB) | 不需要 | 需要(运行轻量级微虚拟机) | 需要(云端托管微虚拟机) |
| 能否脱离本家 Agent 独立使用 | 完全支持(提供通用 srt CLI 与 TypeScript 库) | 仅耦合在 Codex CLI 内部 | 支持(提供通用 sbx CLI) | 支持(提供 JS 与 Python SDK) |
| 默认网络策略与白名单 | 默认全拒;支持通配符域名 + 端口代理白名单与热更新 | workspace-write 模式下默认断网,支持开关切换 | 首次启动选择策略,支持通配符域名白名单 | 默认放行公网,支持配置 SNI/Host 白名单 |
| 开源协议与成熟度 | Apache-2.0;Beta 预览版(Windows 为 Alpha) | Apache-2.0;随 Codex CLI 发布 | 闭源商业组件;正式版 | Apache-2.0(SDK);正式版 |
虽然 srt 在开发机本地轻量隔离上做到了极致,但在实际投入生产前,你也需要清楚它的三个客观边界:
- 它防的是“应用层越权与外泄”,而非高强度内核级攻防:由于 macOS Seatbelt 和 Linux
bubblewrap依然与宿主机共享同一个操作系统内核,如果你要运行的是完全不可信的外部恶意二进制文件或做多租户公有云托管,老老实实用基于硬件虚拟化的 Firecracker MicroVM(如 E2B)或 gVisor/Docker 容器才是正解;srt的最佳舞台,是在你自己的开发机或 CI 节点上约束本地 Agent 与 MCP 工具。 - Windows 平台尚处于 Alpha 早期阶段:官方在文档中坦诚交底,目前 Windows 端的 WFP 过滤围栏绑定在
srt-sandbox账户 SID 上,如果某个沙箱内进程在创建 Socket 前自己切换了线程令牌(Thread Token),或者委托给某个系统级后台服务代发请求,WFP 规则可能会被绕过,且运行时文件 ACL 变更暂不支持通过--control-fd动态刷新。 - 白名单宽度决定了真实安全性:如果为了省事在
allowedDomains里随手配了一个过于宽泛的公共存储域名或代码托管域名,受感染的进程依然可能借道这些合法域名把数据传出去。合理利用单次命令级白名单(registerCommandNetworkLists)和--control-fd动态收放权限,才是发挥它最大威力的正确姿势。
总的来说,Anthropic 把 Claude Code 内部打磨成熟的 sandbox-runtime
单独拎出来以 Apache 2.0 开源,绝对是今年 Agent 基础设施领域最接地气的一份礼物。今天下班前,不妨花两分钟敲一行 npm i -g @anthropic-ai/sandbox-runtime,把你 .mcp.json 里的 npx 换成 srt——既不用忍受笨重的容器配置,又能安心让智能体在安全围栏里放手干活,这笔账怎么算都值!
相关参考资料
- anthropics/sandbox-runtime 官方开源仓库 - GitHub
- @anthropic-ai/sandbox-runtime 官方包主页 - npm
- Configure the sandboxed Bash tool - Claude Code 官方文档
- Choose a sandbox environment - Claude Code 官方文档
- Standalone Proxy Mode (srt-proxy) Documentation - GitHub
- Meet Anthropic's sandbox-runtime: OS-Level Sandboxing for AI Agents, No Containers - MarkTechPost
- Anthropic Open-Sources Claude Code Sandbox Under Apache 2.0 - AI Weekly
- Claude Code's Sandbox Is an npm Package: Run srt Yourself and Watch What It Blocks - DEV Community
- Anthropic Open-Sources Sandbox Runtime for MCP - Polaris7
- Anthropic Launches Sandbox-Runtime for AI Agent Security - Emergent
文章评论