是什么

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-watchman
  • docker 与沙箱不兼容,在 excludedCommands 中排除
  • 允许宽泛域名(如 github.com)可能被用于数据泄露,需谨慎
  • 路径前缀:/ 绝对路径,~/ 相对 home,./ 相对项目根(项目设置中)