一个没有开发布会的改动

9 月 14 日,Claude Code 发布 2.1.271。这个版本没有博客、没有基准表,只有一条排在几十条更新中间的长句。第二天 2.1.272 是纯维护版本,9 月 17 日的 2.1.274 又在补三处信任边界。

被那条长句盖住的改动是:网络白名单从「会话级」收紧到了「单命令级」。这类改动通常不会上新闻,但它是沙箱设计里最能反映原则的一处。

会话级与单命令级,差在哪

同一份主机清单,两种授权粒度会话级:一次批准覆盖整个会话命令 A命令 B命令 C任一命令都可能触达白名单上的任意主机,包括它本来不需要的那台。单命令级:授权贴着单次调用安装依赖 → 仅对应软件源调接口 → 仅对应域名格式化 → 无网络其他主机一律拒绝,即使同一会话里别的命令已获批。
把授权从会话收到单次调用,等于承认「一次批准覆盖一整个会话」这个默认太宽。代价是确认会变多。

改之前,网络的访问控制在沙箱自动模式下按会话生效:一个会话要么没有网络,要么拿到一份较宽的白名单。改之后,逐命令的域名白名单挂在 Bash、PowerShell 与 Monitor 三个工具的单次调用上——某条命令需要访问哪些主机,就随这条命令一起被审查并单独放行,同一个会话里其他主机仍然被拒。

差别在爆炸半径。举例来说,一个子智能体装依赖需要官方软件源,另一个子智能体调内部接口需要对应域名。在旧的会话级模型里,一旦某条工作流的网络范围被批准,这个会话里任何命令原则上都能碰到白名单上的任意主机——包括后来的、被劫持的或跑偏的命令并不需要的那台。按命令收紧之后,一条突然想连陌生主机的请求会当场被拒,而不是因为更早一条无关命令已经获批而被顺带放行。

这与 Claude Code 在文件权限上用了很久的设计是一致的:授权范围贴着具体动作的需要走,而不是覆盖整个会话。这次是把同一条原则铺到了网络层,而且专门铺在「自动模式」上——也就是人工确认最少、因此最需要收窄默认半径的那个模式。

让子智能体不继承仓库指令

另一处值得注意的变化是一个可关闭指令继承的开关,可以在智能体的 frontmatter 与 --agents 的 JSON 配置里打开。它允许自定义或插件定义的子智能体在运行时不去加载用户级、项目级与本地级的指令文件,而组织集中管理的策略文件仍然照常加载。

用途比字面听起来窄:一个插件作者发布的子智能体如果只做一件定义清楚的事——比如跑某个代码检查工具并按固定格式汇报——他并不希望这个子智能体的行为被某个仓库的指令文件里关于语气、提交约定或无关工作流的偏好带跑。这个开关让这类子智能体的行为在不同仓库里保持一致与可测试,同时仍然尊重那些本来就设计成不可绕过的组织策略。

它也是对一个长期存在的问题的小答复:如果不受信任或已被污染的仓库指令文件能左右智能体行为,那么给特定子智能体一个显式的「不继承」开关,本身就是缩小攻击面的一种办法——前提是这个子智能体本来就不需要仓库级指令。

连续三版在补什么

Anthropic 更新日志 · 未见专门的加固说明2.1.271 · 9 月 14 日逐命令域名白名单;子智能体指令继承开关;Bash 权限检查四处缺口;远程会话快速模式;内部计费加价乘数2.1.272 · 9 月 15 日纯维护版本:错误修复与可靠性改进2.1.274 · 9 月 17 日特殊 shell 变量绕过权限检查;隔离工作树嵌套展开越界;连接错误与工具描述泄漏密钥三版共同的线索:会话、命令或错误信息做了超出用户已批准范围的事。
没有一条是面向用户的新功能,但每条都在收窄「默认允许」的边界。这类改动通常最容易被当成普通修问题而略过。

如果把 2.1.271 与 2.1.274 放在一起看,会看到一条连贯的线索:都是「会话、命令或错误信息做了超出用户批准范围的事」。

2.1.271 除了域白名单,还修了几处 Bash 权限检查的缺口:被格式化工具读取的文件、未知选项之后的列式命令、模式或选项值里被通配符展开的文件,以及可能谎报实际执行命令的 shell 变量声明标志。同一版还让快速模式在远程会话可用,并加入了一个面向内部计费的加价乘数。

2.1.274 补的三处是:某些特殊 shell 变量被循环或赋值时绕过了权限检查,现在会正确触发确认;隔离工作树里的嵌套 shell 展开曾能越出隔离边界,现在直接拒绝;连接错误与登录工具的描述曾泄漏从配置占位符解析出来的密钥值,已被修复。

三处都不是面向用户的新功能,但每一处都在回答同一个问题:一个会话、一条命令或一条报错,会不会做或透露超出用户已批准范围的事。

为什么值得单独写一条

因为这类改动最容易被当成「只是修问题」而忽略,但它透露的是产品对默认值的态度。

自动模式的卖点是少打断人。少打断的代价是默认设置承担了更多安全责任。把网络授权从会话级收到命令级,等于承认「一次批准覆盖一整个会话」这个默认太宽;把子智能体的指令继承做成可关闭,等于承认「所有子智能体都该读仓库指令」这个默认也太宽。

对使用者的实际含义是:如果你的团队在自动模式下跑编码智能体,升级之后,原本「一次批准、整个会话通行」的便利会变成逐条审查。这会更啰嗦,但确实更接近最小权限。安全加固常常伴随体验上的退让,这次的代价是确认次数变多。

这类改动为什么总是排在几十条更新中间

把它们放在一起会发现一个共同点:加固动作与功能更新共享同一份更新日志,而且不做优先级区分。

这不是某一家的问题。编码智能体这个品类的发布频率本来就高,几乎每天都有新版本;如果每次安全加固都单独发一篇文章,产品页会被安全通告淹没。于是默认做法是把它们混进列表里,靠用户自己分辨。

对使用者来说,这带来一个实际的检索问题:想知道「升级之后默认行为变了吗」,只能逐条读日志。而在自动模式下跑智能体的团队,恰好是最需要知道这件事的人——因为自动模式意味着更少的人工确认,默认值的每一次变化都会直接落到执行上。更稳妥的做法是在版本说明里单列一节「默认行为变更」,哪怕只有两三行。

可以带走的四条

其一,授权粒度贴着动作走,而不是贴着会话走。文件权限如此,网络权限也应如此。

其二,把「自动模式」当成默认值最需要收紧的地方,因为它离人工确认最远。

其三,报错信息与工具描述也是攻击面的一部分,密钥不该出现在里面。

其四,升级前先看默认行为有没有变。安全加固常常伴随体验上的啰嗦。

需要标注的边界

其一,本条依据的是 Anthropic 的更新日志与第三方拆解文章,官方没有为这次加固写专门说明,因此各条改动的设计意图属于合理推断,不是官方表述。

其二,域白名单等改动在自动模式下生效,手动确认模式的体验差异官方未详细说明。

其三,版本号为社区跟踪口径,不同渠道对同一次发布的记录可能略有差异。

目前官方及行业暂未披露更多细节,后续将持续跟进迭代动态。