一周岁的沙箱项目,AWS 想解决什么问题
2026 年 10 月 2 日,AWS 的 strands-agents 组织开源了 Strands Box;10 月 7 日发布 v0.1.0。Rust 编写、Apache-2.0 许可证,截至 2026-10-09 有 268 颗 star、23 个开放 issue。仓库自我介绍只有一句:在一个沙箱里运行 AI Agent,限制它能执行什么、读写什么、能连到网络上的哪里。发布资产目前只有一个 aarch64-apple-darwin 压缩包——macOS Apple Silicon 独占,Linux 在计划中。
它不是凭空出现的。strands-agents 是 AWS 开源 Agent SDK 的组织,主仓库 harness-sdk 有 8,751 颗 star;今年 2 月还有一个前置项目 Strands Shell(271 颗 star),口号是「给你的 Agent 一个 shell,但不给它你机器的钥匙」——Box 的 crates/shell 模块正源于此。换句话说,Box 是 AWS 把过去大半年在「Agent 本地执行安全」上的积累整合成了一个独立产品。
设计文档开篇就把威胁模型挑明:假设 Agent 已被攻破(including when it runs an agent that follows malicious instructions)。防护方向是向外的——保护操作者的机器与数据,而不是保护沙箱里的工作负载。这个前提决定了它的所有取舍。
为什么不用现成方案:一份排除法论证
官方博客《Strands Box: The Big Picture》(AWS 的 Marc Brooker,2026-10-07)用排除法解释了自研的理由,值得完整转述,因为它等于给现有路线画了一张地图:
- microVM 与设备仿真:策略语义太穷。「设备仿真是个实现『直白策略』的好地方,却是实现『丰富策略』的尴尬场所」——隔着一层虚拟机,策略层只能看到密文和块设备,判断不了「这次操作是不是该做」。
- 系统调用过滤:语义层级太低。syscall 接口又大又长还在持续增长,兼容性是无底洞;
SECCOMP_USER_NOTIF、macOS Endpoint Security 这类机制也因各自的缺陷被放弃。 - gVisor 一类用户态内核:官方原话是「语义层级仍不够高」(doesn't get up to a high enough semantic level)——它懂系统调用,但不懂一次 MCP 调用、一段 shell 脚本在业务上意味着什么。
- 设计准则文档里还有一句更狠的总结:他们研究过的所有先例,「都是因为失败时放开(failing open),或者信任了自己写的胶水代码而失守」。
结论是:把「确定能围住」的 OS 机制和「看得懂业务」的策略层拆成两层,各干各的。
双层强制:OS 管住能碰什么,策略管住该不该做
Box 的运行形态是一个可信进程 strands-box run,内部装着策略引擎、出站网关、shell 与 Python 解释器、MCP 代理和遥测收集器。配置也拆成两个文件、对应两层防线:
box.toml描述进程的直接访问授权(文件、可执行程序、网络端口),由宿主 OS 直接强制,不产生逐条策略决策。policy.dw是 Dogwood 语义策略,管所有经过可信进程中转的操作请求——shell 命令、Python 操作、出站 HTTP、MCP 调用,每一条都要过引擎裁决。
官方博客把两层的关系说得很准:「沙箱机制确保策略层是走出盒子的唯一出口」。Seatbelt 负责让绕行在物理上不可能,Dogwood 负责在唯一出口上逐笔放行或拒绝。
flowchart TB
AG["沙箱内的 Agent 进程"] -->|"shell、Python、MCP 请求"| ENG["Dogwood 策略引擎(可信进程内)"]
AG -->|"出站网络请求"| GW["出站网关"]
GW -->|"逐请求判定"| ENG
ENG -->|"permit 或 forbid"| AG
GW -->|"注入真实凭据"| NET[("外部 API")]
SEAT["Seatbelt:默认拒绝的 OS 隔离"] -.->|"拦截一切绕行"| AG
macOS 落地:Seatbelt、trampoline 与一堵一次性的墙
macOS 侧的 OS 隔离用的是 Seatbelt——macOS 系统自带的进程沙箱。Profile 用 SBPL(一种 Scheme 风格的策略语言)写成,以 (deny default) 开头,再逐条加白名单,例如:
(version 1)
(deny default)
(allow file-read* (literal "/Users/example/project/allowed.txt"))
一个容易被忽略的实现细节是 trampoline:Seatbelt 有个特殊性质,施加沙箱的调用会永久锁死施加者自身。如果可信进程自己去给 Agent 施加沙箱,它自己也就废了。Box 的解法是先启动一个独立的小启动器 strands-box-contain-trampoline,由它调用 sandbox_init() 给自己上锁,再 exec 成目标程序——墙永远由一次性进程来砌。操作者全程不直接写 SBPL,profile 由 Box 从 box.toml 生成,文件授权细分为读文件、读目录树、写、列目录、元数据五类。
Dogwood:一个会看历史的策略语言
这是 Box 与其他方案拉开距离的地方。Dogwood 是一个独立的开源策略语言(dogwood-policy/dogwood 仓库,2026 年 7 月创建,446 颗 star),衍生自 AWS 另一个项目 Cedar 的语法,加上了时态条件:since、formerly、once 与 count 聚合,可以回看 Agent 近期发生过什么。Box 内嵌了它的本地求值引擎。
动作词汇表目前是 10 个内建动作、4 大类:文件(fs:read、fs:write、fs:delete、fs:move)、网络(net:connect、http:request)、进程(shell:exec、shell:spawn)、MCP(mcp:call,且每个被发现的 MCP 工具还会生成一个专属动作)。语义是严格的默认拒绝:没有匹配的 permit 就拒绝,forbid 永远压过 permit。官方文档原话:空的策略文件拒绝一切请求。
真实策略长这样(官方 Claude Code 示例原文节选):
forbid (principal, action == Box::Action::"fs:read", resource)
when { context.input.path == "~/box-tutorial/my-project/.env" };
forbid (principal, action == Box::Action::"net:connect", resource)
when {
context.input.host == "metadata.google.internal" ||
context.input.host == "metadata.azure.internal"
};
时态规则才是它真正的差异点。官方文档给了两个可运行的例子:「git commit 仅当最近 1 小时内 cargo test 以 0 退出才放行」,以及「到 api.github.com 的已完成请求 10 分钟内最多 60 个」。支撑机制是解释器与网关共享事件历史,按 box 持久化、跨运行保留——一个解释器里发生的文件读,可以让网关拒绝稍后的一次出站请求。「测试通过才能提交」「每小时最多调 60 次某个 MCP 服务」这类规则,此前只能靠 Agent 框架自觉,现在变成了沙箱层的确定性约束。
凭据注入:让 Agent 拿着假钥匙干活
第三块拼图是凭据。架构上,真实 secret 只存在于可信进程的 Vault 里(内存持有,box 停止即擦除);沙箱内的所有进程拿到的只是幻影占位符——strands_box_ 前缀加 64 位随机十六进制,「在任何地方都认证不了任何东西」。
两种凭据方案(目前仅此两种,其他写法在配置加载时被拒绝):
env://NAME:启动时从环境变量读入真值、铸造占位符注入进程环境;网关在放行请求时把占位符原位替换成真值,响应中出现的一切真值副本都被替换成[REDACTED]。aws://PROFILE:进程拿到占位的 AWS 密钥,SDK 照常签名;网关剥掉全部签名头,验过目标主机确属 AWS 域名后用 SigV4 重签。不支持credential_process等旁路,防的是「让可信进程执行配置指定的程序」。
配套硬规则也很齐:明文 http:// 的绑定目标在注入前直接 403;默认模式下没有占位符的请求在策略判定前就拒绝。设计文档里有一句提纲挈领的话:「凭据不是授权——它什么都不许可,每一次连接、每一个请求都由策略决定」。
边界也要如实说:操作者手写进工具环境变量表的真实值不受保护;文件系统授权暴露的凭据文件(比如 ~/.aws/credentials)不在覆盖范围;box 内每个进程都拿到全部路由的占位符,进程级凭据隔离不存在。
与 Agent 的集成:换一个 PATH 就接管
Box 对 Agent 框架是零侵入的,三板斧都落在标准机制上:在 box 目录的 bin/ 里放同名替身(bash、zsh、python3 等,只负责把请求经 Unix socket 递给可信进程);设置标准的 HTTPS_PROXY 等代理变量,同时 Seatbelt 只放行到网关本地端口的连接——忽略代理变量的进程什么都连不上,网关终结每一条连接,没有不透明隧道;外部程序(git、cargo)与本地 MCP 服务器各自跑在独立沙箱里,授权互相隔离。
官方示例覆盖 Claude Code、Codex CLI、pi、Strands CLI 与 Strands Python SDK。最能说明设计哲学的是 Claude Code 示例的启动命令:claude --dangerously-skip-permissions——把框架自带的审批显式关掉,让 Box 策略全权裁决。设计文档对此毫不掩饰:「许多 harness 自带允许列表和审批弹窗,Box 既不依赖也不读取它们,因为发生在 Agent 自己进程里的检查是地板,从来不是墙」。
官方自己列的边界清单
一个项目的可信度,很大程度看它自我批评的质量。limitations.md 写得相当坦诚,几条关键边界值得原样转述:
- 被授权的动作仍可为害。「Box 限制的是进程能做什么,它判断不了被允许的动作是否合乎你的意图」——白名单端点本身就是数据外泄通道。
- 策略只看得见经过它的请求。Agent 用自身系统调用直读的文件、独立沙箱内的工具文件操作,都不进事件历史;官方直言「策略历史不是完整的审计记录」。
- 明确不提供的保护包括:资源限额、多租户隔离、内核漏洞防护、远程服务器行为、可信进程自身的缺陷、侧信道、防篡改审计(决策记录无签名、无链式)。
- 性能目标(策略决策 1 ms 内、冷启动 50 ms 内、可信进程常驻 20 MB 内)官方自注「是主张,尚未基准化」(asserted, not yet benchmarked)。
同时也有成熟度的积极信号:CLI 动词与 box.toml 的 8 个顶层键已在仓库内声明「接口冻结」,变更需人工批准;仓库自带 Agent 协作规范与策略编写技能,测试目录有独立的黑盒确定性围控套件。v0.1.0 被当成契约而不是玩具在经营。
横向看:OpenShell、E2B 与 Linux 原生工具
把 Box 放进本专题已有的坐标系里:
| Strands Box | NVIDIA OpenShell | bubblewrap / Landlock | E2B | |
|---|---|---|---|---|
| 形态 | 本地单进程沙箱引擎 | 面向 Agent 集群的内核级运行时 | Linux 沙箱原语工具 | 云沙箱服务与 SDK |
| OS 机制 | macOS Seatbelt(Linux 计划中) | 内核插桩,Linux/macOS/WSL2 | user namespaces / 内核 LSM | 会话级隔离环境 |
| 策略层 | Dogwood 时态策略,逐操作裁决 | 形式化验证(prover) | 无语义层 | 不适用 |
| 凭据 | 占位符注入 + 网关替换 | 真实凭据仅注入放行请求 | 无 | 无内置 |
| 成熟度 | 7 天,v0.1.0,268 star | 2026-02 起,15,564 star | 老牌 | 2023 年起,14,253 star |
有意思的是结构层面的合流:OpenShell 与 Box 在「内核边界 + 语义策略 + 凭据不出沙箱」三层结构上高度同构,差异在学术路线——OpenShell 用形式化方法在策略变更前证明它允许什么(其研究组 2026 年 9 月有专文),Box 用 Cedar 系时态策略在运行时逐笔裁决。两个 15,000 star 量级和一个刚出生的项目,正在回答同一个问题。
云端多租户场景,Box 官方的建议也很直白:Box 的可信计算基更大,「建议搭配每会话专用的 microVM」(顺着 AWS 自己的 AgentCore Runtime 路线)——本地轻量沙箱与云端 microVM 是叠加关系,不是替代关系。
结语:看守者赛道的又一位重量级选手
截至 2026-10-09,Strands Box 在 Hacker News 上有三条提交、零条评论,仓库开放刚满一周——对它下任何定论都为时过早,这是事实陈述。但值得盯住的理由同样清楚:Agent 沙箱这条赛道此前是 NVIDIA(OpenShell)与 Google 系(gVisor、Kubernetes agent-sandbox)分头推进,AWS 官方下场让「操作系统级看守」第一次集齐了三家云厂商;「语义策略层」正在从各家方案里自发浮现,成为共识路线。
本文作者的观点:Box 的真差异点在时态策略——「测试通过才许提交」「限流某个 MCP 工具」这类带时间与因果的规则,是现有方案里第一次以确定性语言落地;如果 Linux 后端落地并经受住第一轮独立安全审计,它会成为本地 Agent 沙箱的有力候选。反过来,若语义解释器的覆盖与性能跟不上,它也可能收缩为 Strands 生态内的专用组件。两条路都还开着,而这条赛道本身,已经没有哪家大厂敢缺席了。
参考资料
- strands-agents/box 仓库——README 与 docs/design/ 下的架构、macOS 强制、凭据、边界文档
- Strands Box: The Big Picture——Marc Brooker,2026-10-07,官方设计动机全文
- The Dogwood Guide——Dogwood 语言规范与 CLI
- dogwood-policy/dogwood——策略语言本体仓库
- docs/user/policy.md——默认拒绝语义、动作词汇表与时态策略示例
- docs/design/limitations.md与 SECURITY.md——官方自述边界与威胁模型
- NVIDIA OpenShell——同构路线的对照项目(15,564 star,2026-02 起)
- What we have learned at OpenShell applying formal methods to control AI agents——OpenShell 形式化验证路线的研究笔记
读者留言
COMMENTS 暂无还没有留言,来说第一句?