沙箱只有在能真正将智能体(agent)限制在围栏内时才有用。Claude Code 2.1.216 填补了几个可能导致后台任务、子智能体或恢复的会话越过其分配目录的漏洞。此版本引入了一个新的配置开关,但更重要的改进在于底层:更智能地处理 Git worktrees、符号链接(symlinks)和智能体重启。如果你在本地或 CI 中运行 Claude Code,这些变化值得你仔细阅读,而不仅仅是扫一眼更新日志。
不应轻率操作的文件系统开关
2.1.216 版本增加了 sandbox.filesystem.disabled。设置此项后,Claude Code 会跳过自身的文件系统隔离,但仍会强制执行网络沙箱。乍一看,这似乎是解决权限错误或加速文件操作的一种方法。但事实并非如此。只有在已有其他层级保护你的磁盘时,才应启用此设置。
这意味着使用在每次运行后都会被删除的临时容器,或者一个无法访问你的主目录或生产卷的专用虚拟机。如果你直接在 macOS、Windows 或裸机 Linux 主机上运行 Claude Code,请保持文件系统隔离开启。网络沙箱不能替代文件系统控制,沙箱化文件访问带来的轻微摩擦,远比因意外覆盖或破坏项目文件夹的恶意提示词注入(prompt injection)而导致的恢复成本要低得多。
请将该开关视为兼容性垫片(shim),而非性能调节钮。它适用于操作系统或编排器已经处理了隔离,且 Claude 自有的沙箱会增加不必要复杂性的环境。
更新实际修复了哪些问题
除了新设置外,2.1.216 还堵住了几个可能导致智能体访问不该访问区域的实际漏洞。
Worktree 隔离。 子智能体不再能将 Git 命令重定向到其 worktree 之外的父目录或同级目录。此前,在项目内运行的子智能体可能会将 Git 操作指向你的共享检出目录或相邻的仓库。这很重要,因为许多开发者会将多个项目放在同一个父文件夹下。现在,这些跨越边界的命令将会失败。
.claude 路径下的符号链接加固。 工作流定义和计划任务在写入配置时过去会跟随符号链接。如果攻击者能创建一个从 .claude 指向(例如)你的 shell 配置文件或 SSH 目录的符号链接,就有可能诱导智能体在项目之外进行写入。此更新通过拒绝跟随该路径下的符号链接来阻止此类行为。
更安全的重置(rewinds)。 /rewind 命令允许你回滚最近的更改,现在它会跳过符号链接和硬链接路径。如果没有这种保护,重置操作可能会追踪符号链接并覆盖远离你仓库的文件。Claude 现在会明确报告这些被跳过的路径,以便你知道边界依然有效。
恢复运行的智能体保留其限制。 之前,停止后又重新启动的后台会话会回退到默认的工具权限。如果你曾有意限制智能体只能读取而不能写入,重启可能会在无声无息中恢复更广泛的访问权限。现在,原始限制会随会话一起持久化并恢复。
选择安全配置方案
Claude Code 2.1.216 将这些控制项组织为三种配置方案。请根据运行工具的环境进行选择,而不是根据哪个感觉最快。
Default(默认)。 文件系统和网络沙箱均保持开启。这是在笔记本电脑或工作站上进行本地开发的正确选择。它可以在无需管理容器的情况下保护你的主目录、系统文件和相邻项目。
Compatibility(兼容)。 关闭文件系统隔离,但保留网络沙箱。仅将此方案用于文件系统本身就是临时性或严格受限的临时容器或虚拟机。不要因为厌烦了输入密码来允许智能体访问受保护文件夹而使用它。
Managed Hard Gate(托管硬门槛)。 两个沙箱层均保持开启,且该方案要求由你的编排器或安全团队执行额外的容器策略。这专为 CI 流水线、远程开发环境以及必须实施深度防御的企业级设置而设计。
如果你不确定哪种方案合适,请从 Default 开始。只有在你确认运行时环境确实能自行隔离文件系统后,才可以降低保护级别。
在不破坏工作流的情况下进行升级
不要把它当作周五下午随手安装的常规补丁。2.1.216 的升级路径很直接,但配置错误带来的后果却不容小觑。
首先,通过您常用的包管理器或安装程序升级到 2.1.216。然后在启动任何 agent 任务之前,从三种隔离配置文件(isolation profiles)中选择一种。不要在不了解优先级的情况下,在运行中的会话之间混用不同的配置文件。
接下来,运行下文所述的五项非破坏性边界测试。这些是快速的脚本化检查,用于证明沙箱(sandbox)的行为符合配置文件的承诺。在测试期间,为您的丢弃式测试仓库(disposable test repository)之外的文件生成哨兵哈希(sentinel hashes)。哨兵哈希简单来说就是您想要保护的敏感文件或目录的校验和(checksum)。测试完成后,对比哈希值。如果发生任何变化,说明您的隔离机制存在泄漏。
同时也要检查日志。Claude Code 会将拒绝记录和沙箱事件写入其本地日志。当访问被拦截的主机或子代理(subagent)超出其工作树(worktree)时,寻找明确的拒绝记录。静默失败比显式报错更糟糕,因此请务必确认日志显示了防护栏(guardrails)已生效。
最后,逐步推广变更。从单个项目或非生产分支开始。在新版本全面部署到整个团队或 CI 集群之前,让它运行一两天。
证明沙箱有效的五项边界测试
请务必在装满伪造数据的丢弃式仓库中运行这些测试。切勿将其指向生产代码、真实凭据或实时基础设施。
网络边界。 尝试访问两个端点:一个您已明确允许的,以及一个您已拦截的。向 httpbin.org 等公共测试服务发送一个简单的 HTTP 请求可以作为允许的目标,而向本地元数据端点或内部 IP 发送请求则应当失败。如果被拦截的请求成功了,说明您的网络沙箱配置错误。
工作树隔离。 在子代理内部运行一个针对父目录的 Git 命令。例如,尝试执行 git -C .. status 或让 agent 描述其检出目录(checkout)之外的文件。在 2.1.216 的修复版本中,这必须失败。子代理应该只能看到它自己的工作树。
符号链接陷阱。 在您的项目内部创建一个指向仓库外部目录(例如 /tmp/sentinel-target)的符号链接(symlink)。然后尝试在 .claude 路径下保存一个任务或工作流,使其通过该链接进行写入。保存后,检查外部目录。如果该目录仍为空,则说明符号链接加固(symlink hardening)正在生效。
Rewind 跳过。 在您的仓库中设置一个包含指向系统文件或其他目录的符号链接的文件夹。在该文件夹上运行 /rewind。Claude 应该列出被跳过的符号链接或硬链接路径,而不是去追踪它们。确认仓库外的目标保持原封不动。
会话复活。 启动一个带有严格限制(例如禁用文件写入工具)的后台 agent。暂停或停止会话,然后恢复它。立即尝试让 agent 写入一个文件。如果限制仍然有效,则说明针对恢复中 agent 的修复已生效。如果 agent 突然重新获得了完整的工具访问权限,说明您仍处于风险之中。
结语
Claude Code 2.1.216 比之前的版本提供了更高的灵活性,但这种灵活性伴随着一个明确的要求:在信任之前先进行验证。新的文件系统开关并不是为了以牺牲安全性为代价来简化您的工作,而是为那些已经在工具下方构建了坚实防御层的工程师准备的。此版本真正的改进在于那些静默的防护栏:它们能阻止子代理潜入父目录,在配置写入期间拒绝跟随符号链接,并且即使在长时间暂停后也能记住规则。
运行这五项测试。检查您的哨兵哈希。阅读日志。然后,也只有在完成这些之后,才让新版本处理实际工作。
来源:Claude Code v2.1.216 Release Notes
可选学习社区:GyaanSetu on Telegram
