帖子说了什么
@timwork_notes 写得很直白:Claude Code 的 deny 规则守护的是「某个工具」,不是「某个文件永远碰不到」。他举例:v2.1.309 才修了 Edit(path) deny 拦不住指向同一路径的 Bash 重定向(某些还带子 shell 的命令)。所以对 .env 只写一条 Read(./.env),更像门口贴了告示,不是把门锁死。若文件真重要,还要放进 sandbox 的拒绝列表。@vibepreflight 补了一层:Read deny 挡不住 cat / python -c 这类 Bash 读法,需要再加 PreToolUse 拦带 .env 字样的 shell。
对照官方说明
CHANGELOG v2.1.309 原文相关条目:
- Fixed an
Edit(path)deny rule not blocking a Bash redirect to that path in some commands that also held a subshell.
这正好对应帖子里的例子:权限引擎按工具调用形态匹配;换一条 Bash 重定向,旧逻辑就可能漏拦。Sandbox 文档则说明:沙箱主要限制写入与网络,默认并不挡读取凭据路径;要把敏感路径真正「关进笼子」,需要你在 sandbox 配置里显式列出 deny / credentials 一类项(字段名以当前版本文档为准)。
本站已有「deny 语法要用 Edit/Read 而不是无效的 Write(路径)」以及「.env 用 deny 挡住」的专文;本文只钉住一点:工具级 deny ≠ 文件级锁,升级到含上述修复的版本后,仍要用沙箱 + hook 做纵深。
你可以立刻做的几件事
- 确认版本 ≥ 2.1.309,并重测:对已 deny 的路径,故意让 Agent 用
echo x > path/ 重定向写法碰一次。 - 敏感文件双写规则:
Read/Editdeny 加上 sandbox 拒绝读/写列表(含真实路径,注意符号链接)。 - PreToolUse 补刀:拦截命令行里出现
.env、secrets/、凭据文件名的 Bash(具体脚本按团队规范写)。 - 密钥尽量不进工作区:能放密钥库或本机环境注入就不要落盘到 Agent 可扫的目录。
- 升级后跑一组回归:Read、Edit、Bash 重定向、子 shell 各测一条,避免「以为 deny 还在、其实只挡了一种工具」。
小结
门牌(deny)有用,但换一把工具就可能绕开。把「文件」同时写进沙箱拒绝列表,再加 hook 看命令文本,才比较像一把锁。2.1.309 修了其中一条已知缝,不代表可以只留一行 Read(.env)。
来源
- @timwork_notes:deny 管工具不管文件;重要路径请进 sandbox deny
- @vibepreflight:Read deny 挡不住 cat,需 PreToolUse
- 官方对照:Claude Code CHANGELOG v2.1.309(Edit deny / Bash redirect)
