是什么
Sandboxing 通过 OS 级原语(macOS 用 Seatbelt,Linux/WSL2 用 bubblewrap)对 Bash 命令实施文件系统和网络双重隔离,在减少权限提示的同时维持安全边界。沙箱限制对所有子进程(包括 kubectl、terraform、npm 等)均有效。
核心机制
文件系统隔离:
- 默认:读取整个系统(部分目录除外),写入当前工作目录及子目录
- 可配置:
sandbox.filesystem.allowWrite(额外写入路径)、denyWrite、denyRead、allowRead - 多作用域的路径配置合并(不覆盖),用户和项目可以扩展管理员设置
网络隔离:通过代理服务器实现域名白名单控制,新域名请求触发权限提示。代理不做 TLS 检查,只基于 hostname 决策。
两种沙箱模式:
- Auto-allow:沙箱内的命令自动批准,无需权限提示(
rm等危险命令仍提示) - Regular permissions:所有命令仍走标准权限流程
启用方式:/sandbox 命令打开菜单选择模式。
安全限制:
- 代理不做 TLS 检查,无法防御 domain fronting 等技术
- Unix Socket 访问(如 Docker socket)可能导致沙箱绕过
- Linux 实现在 Docker 内需要
enableWeakerNestedSandbox,会显著降低安全性
关键细节
- macOS:开箱即用(Seatbelt)
- Linux/WSL2:需安装
bubblewrap和socat - Ubuntu 24.04+:需配置 AppArmor profile 允许 bwrap 创建用户命名空间
- WSL1:不支持(缺少 Linux namespace 原语)
- 开源沙箱运行时:
npx @anthropic-ai/sandbox-runtime <command> - 禁用逃生舱:
"allowUnsandboxedCommands": false
关联
- devcontainer — Dev Container 提供额外的容器级隔离
- headless — 非交互式模式下的权限配置
实践要点
- 有效沙箱需要同时启用文件系统和网络隔离,缺一不可
watchman与沙箱不兼容,Jest 用--no-watchmandocker与沙箱不兼容,在excludedCommands中排除- 允许宽泛域名(如
github.com)可能被用于数据泄露,需谨慎 - 路径前缀:
/绝对路径,~/相对 home,./相对项目根(项目设置中)