fix: harden gatekeeper security boundaries
This commit is contained in:
@@ -15,9 +15,9 @@
|
||||
- 分层流水线:只读操作零延迟直通,灰区才调用审查模型(实测 ~0.7–1.5s)
|
||||
- 灾难命令黑名单:删盘/格式化/递归删除根目录等**不经任何模型、确定性拦截**
|
||||
- 弹窗分级可配:模型"拿不准"时可以选择弹窗问你、硬拒或放行(`onUncertain`)
|
||||
- 逃生舱:被拒的命令支持一次性批准(精确匹配、用后即焚、审计留痕)
|
||||
- 逃生舱:被拒的命令支持一次性批准(绑定目录/工具/会话、用后即焚、审计留痕)
|
||||
- 防注入:模型伪造"用户已同意"等授权文字会被识别为注入并直接拒绝
|
||||
- 常驻 daemon:审查连接热复用、决策缓存、配置热重载
|
||||
- 常驻 daemon:双向 HMAC 身份校验、审查连接热复用、上下文绑定缓存、配置热重载
|
||||
- 审计日志:每次决策(放行/拒绝/来源/耗时)全部落盘可查
|
||||
|
||||
## 环境要求
|
||||
@@ -90,11 +90,11 @@ node gatekeeper/gatekeeper.mjs install # 一键安装
|
||||
2. **灾难黑名单拦截的**:对话内口头批准**无效**(防伪造底线),在终端运行拒绝理由中给出的命令:
|
||||
|
||||
```bash
|
||||
node ~/.zcode/gatekeeper/gatekeeper.mjs approve "原命令原样粘贴"
|
||||
node ~/.zcode/gatekeeper/gatekeeper.mjs approve --last # 或直接批准最近一条被拒命令
|
||||
node ~/.zcode/gatekeeper/gatekeeper.mjs approve --last # 推荐:绑定最近拒绝的完整上下文
|
||||
node ~/.zcode/gatekeeper/gatekeeper.mjs approve "原命令原样粘贴" # 在该命令预期执行目录中运行
|
||||
```
|
||||
|
||||
一次性放行:精确匹配原命令、用后即焚、10 分钟过期、全程审计。批准后让模型重试即可。
|
||||
一次性放行:`approve --last` 会绑定原请求的目录、工具、会话与完整参数;直接 `approve "命令"` 至少绑定当前终端目录。批准用后即焚、10 分钟过期、全程审计。批准后让模型重试即可。
|
||||
|
||||
> `approve` 设计给**用户亲自执行**:策略提示词明令模型不得自行运行 approve 给自己放行;非交互环境必须追加 `--yes`(留给你明确授权的场景)。
|
||||
|
||||
@@ -130,7 +130,7 @@ node ~/.zcode/gatekeeper/gatekeeper.mjs approve --last # 或直接批准最近
|
||||
}
|
||||
```
|
||||
|
||||
环境变量:`GATEKEEPER_BASE_URL` / `GATEKEEPER_API_KEY` / `GATEKEEPER_MODEL` / `GATEKEEPER_FULL_ACCESS_GUARD` / `GATEKEEPER_ON_UNCERTAIN`(内联模式直接生效;daemon 模式下 `FULL_ACCESS_GUARD` 随请求透传,其余请改 config.json——会热重载)。
|
||||
环境变量:`GATEKEEPER_BASE_URL` / `GATEKEEPER_API_KEY` / `GATEKEEPER_MODEL` / `GATEKEEPER_FULL_ACCESS_GUARD` / `GATEKEEPER_ON_UNCERTAIN` / `GATEKEEPER_ON_REVIEWER_ERROR` / `GATEKEEPER_DAEMON_PORT` / `GATEKEEPER_DAEMON_IDLE_MS`(内联模式直接生效;daemon 模式下 `FULL_ACCESS_GUARD` 随请求透传,其余长期配置建议写入 config.json——会热重载)。
|
||||
|
||||
## 自定义"思考程度"(extraBody)
|
||||
|
||||
@@ -140,7 +140,7 @@ node ~/.zcode/gatekeeper/gatekeeper.mjs approve --last # 或直接批准最近
|
||||
"extraBody": { "chat_template_kwargs": { "enable_thinking": false } }
|
||||
```
|
||||
|
||||
也可以放 `reasoning_effort`、`top_p` 等任何端点支持的参数(不要设置 `messages`)。改完即时生效(daemon 热重载配置)。
|
||||
也可以放 `reasoning_effort`、`top_p` 等任何端点支持的参数;为防止覆盖安全策略,`messages` 字段会被忽略。改完即时生效(daemon 热重载配置)。
|
||||
|
||||
## 延迟量级(实测参考)
|
||||
|
||||
@@ -153,7 +153,7 @@ node ~/.zcode/gatekeeper/gatekeeper.mjs approve --last # 或直接批准最近
|
||||
|
||||
## 守护进程(daemon)
|
||||
|
||||
客户端每次调用先探测 `127.0.0.1:47811`(无副作用 ping),daemon 不在就自动拉起;**无调用 30 分钟后自动退出释放内存**(`daemonIdleMs` 可调,0 = 常驻),下次调用自动重新拉起。收益:到审查端点的 TLS 连接常驻、决策缓存与任务状态驻内存、同请求并发去重、配置热重载(客户端每次请求带配置文件 mtime 签名,变了即重载)。
|
||||
客户端每次调用先探测 `127.0.0.1:47811`(无副作用 ping),并用安装目录内随机生成、仅用户可读的 secret 对请求和响应做双向 HMAC 校验;无法读取该 secret 的本地进程即使抢占端口也不能伪造放行结果。daemon 不在就自动拉起;**无调用 30 分钟后自动退出释放内存**(`daemonIdleMs` 可调,0 = 常驻),下次调用自动重新拉起。收益:到审查端点的 TLS 连接常驻、决策缓存驻内存、配置热重载;会话任务状态保持磁盘同步,确保内联降级产生的新输入不会丢失。缓存绑定会话、cwd、近期动作、完整工具参数和策略版本。
|
||||
|
||||
```bash
|
||||
node gatekeeper/gatekeeper.mjs shutdown-daemon # 停止(下次调用自动重新拉起)
|
||||
@@ -189,7 +189,7 @@ GATEKEEPER_DEBUG=1 node gatekeeper.mjs … # 打印代理通道调试信
|
||||
bash test.sh
|
||||
```
|
||||
|
||||
覆盖 41 项决策路径:白名单/黑名单拦截、双 shell 兼容、三种 onUncertain 落地、extraBody 注入、approve 一次性放行与用后即焚、daemon 通道冒烟、fail-closed 降级等。
|
||||
覆盖 64 项决策路径:白名单/黑名单拦截及语法变体、双 shell 兼容、三种 onUncertain 落地、extraBody 注入、最新任务保留、上下文缓存、作用域绑定 approve、daemon 身份认证与热重载、配置/规则损坏 fail-closed 等。
|
||||
|
||||
## 卸载
|
||||
|
||||
|
||||
Reference in New Issue
Block a user