帖子说了什么
@ayyazdev 提醒:Claude Code 2.1.310 修了一个 Windows 专用问题——若本机没有 Git Bash,而 PreToolUse / PermissionRequest 的 hook 命令又只是带引号的字符串(例如一整段被引号包住的脚本路径),工具调用会直接放行。守卫写在 hooks 里,hooks 却没真正跑起来,Agent 照样执行。@LLMpsycho、@RealAlexandreAI 也强调同一点:一个「看起来开着、实际 fail-open」的守卫,比没有守卫更糟,因为你会放松盯梢。
对照官方说明
我们核对了 Claude Code 的发布说明与 hooks 文档:
- v2.1.310 CHANGELOG 原文写明:Windows 上,Git Bash 缺失且 hook 的 command 只有引号字符串(如引号路径)时,PreToolUse / PermissionRequest 曾错误放行工具调用,现已修复。
- hooks 参考:命令型 hook 可用 args 走 exec 形式(command 为可执行文件,args 为参数列表,不经 shell);也可设
"shell": "powershell"。未装 Git Bash 时,默认会走 PowerShell。 - 文档还提到:Windows 在未找到 Git Bash 时,部分 PreToolUse / PermissionRequest 失败场景会按「只有 exit 0 或 2 才算裁决」处理;应用
onFailure: "block"、改用 exec 形式,或安装 Git for Windows,都能避免「守卫挂了却继续执行」。
结论与帖子一致:这是已确认的安全修复,不是传闻。
你可以立刻做的几件事
- 先升级到 2.1.310 或更新。 在终端执行
claude update,再用claude --version确认版本号。 - 检查 hook 怎么写。 尽量用 exec:
"command": "node"(或真正的可执行文件)加上"args"列表指向脚本,不要只塞一个带引号的路径字符串;若坚持用 PowerShell,显式写"shell": "powershell"。 - 关键守卫加
onFailure: "block"。 脚本缺失、崩溃、超时时也应拦截,而不是静默放行(需较新版本支持该字段)。 - 改完必做一次「故意弄坏」自测。 临时改错脚本路径或去掉可执行权限,再让 Agent 触发本应被拦的操作;确认调用被拒后,立刻恢复正确配置再测一遍正向拦截。
- Windows 若长期依赖 Bash 语法 hook,安装 Git for Windows,或把脚本改成 PowerShell / Node,避免混用导致行为漂移。
小结
把安全押在 hooks 上时,最怕的不是「拦不住某条命令」,而是拦了却没跑。Windows 用户请升到 2.1.310,改掉「纯引号路径」写法,并用一次失败自测确认守卫真的还会说不。
来源
- @ayyazdev:2.1.310 修复 Windows 缺 Git Bash 时 hook 放行
- 同话题亦可参考 @LLMpsycho、@RealAlexandreAI
- 官方对照:Claude Code CHANGELOG v2.1.310;Hooks reference(onFailure、exec / shell 形式)
