Replies: 1 comment
|
如果某个 blocking hook(尤其 PreToolUse 安全钩子)看起来注册了但一次都没生效,先检查 hooks 配置里有没有 临时处理很简单:
判断依据:解析阶段对 matcher 非法正则会立刻报错,但 timeout 没有任何正性校验,所以手误的零值不会在启动时暴露。等官方在 config 解析阶段加上正有限数校验后,这类误配置会在加载时直接失败,就不用再靠日志排查了。 English: A |
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
概述
hooks 配置中的
timeout字段接受任意数字(包括 0 与负数),解析阶段没有正性校验。"timeout": 0会让该 hook 的每一次调用都落入 runner 的基础设施故障分支,最终变成"无决定 → 放行"——等价于把这个 hook 静默删除。对 PreToolUse 安全 hook 而言,这是 fail-open。机制链(基于 master
47f943859)packages/hooks/hooks-claude-code/src/config.ts:105:packages/hooks/hooks-codex/src/config.ts:69-72同样。packages/hooks/hook-protocol/src/runner.ts:74:timeoutMs = hook.timeoutSec * 1000→0。clampTimeout对timeoutMs <= 0抛错(如packages/shell/bash-local/src/index.ts:147)。runner.ts的 catch 把这次抛错转换为parseHookOutput(undefined, '', message)——无 exitCode、无 decision。'none'→next()→ 放行。为什么应视为缺陷而非用户配置错误
同一套解析器里,非法的 matcher 正则会在加载时立刻抛错(
matcherDiagnostic),而非法的 timeout 却在每次调用时静默失败——同一份配置里两类错误两种待遇,与仓库贯穿始终的 "misconfiguration fails loud" 约定不符。用户手误写出"timeout": 0后,唯一的线索是 hook/result 事件里的一条 stderr,hook 本身看似正常注册、实际从未生效。建议修复
在 config 解析阶段校验
timeout/timeoutSec为正有限数,非法即在加载时失败,与 matcher 校验对齐(hooks-claude-code与hooks-codex两处同步修)。影响
安全 hook(PreToolUse deny 规则)可被一个手误的零静默绕过;一般 blocking hook 的语义也会从"限时执行"悄悄变成"永不执行"。
本问题由多轮 AI 辅助代码审查发现,并经两个独立外部模型(Claude Opus 4.8 / GPT-5.6,均 high reasoning)交叉读码复核,三方一致确认。
All reactions