feat: add command blacklist guardrail for MCP command channels

MCP 工具一旦被外部 agent 放行,参数里的命令就不再受它自身权限系统检查
(Claude Code 的 MCP 权限规则只按工具名匹配、不带参数内容),
vps_exec 里的 rm -rf / 在 agent 侧零提示。这是唯一的兜底。

- src/guard.rs:名单判定。归一化(剥引号、\/ 还原、折叠空白、转小写、
  短选项聚簇排序,故 -rf/-fr/-r -f 等价)+ * 通配 + 词边界匹配 + 截断标记检查
- data/deny-list.txt:首启写出内置 25 条不可逆灾难,用户可增删,每次判定重读
- 挂在 vps_exec 与 vps_terminal 的 send 上,命中即拒绝执行、不产生输出
- 工具描述写明护栏存在,并告诉 agent 被拦时不要换写法重试
- GET/PUT /api/guard + 设置页 MCP 标签下的名单编辑区
- 没有白名单、确认流程、风险分级与安全挡位

边界:防手滑,不防蓄意绕过(r\m -rf /、$(echo rm) -rf / 这类纯模式匹配必然漏)。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
weidu12123andClaude Opus 4.8 committed 2026-10-13 23:55:31 +08:00
1 parent 14e7066db9
commit 7bf552952f
6 files changed
+545 -5

No files matched your search

+5 -3
View File
@@ -89,9 +89,11 @@
- 执行命令(同步等待或转后台任务,含 Windows PowerShell 编码与 CLIXML 处理)→ 复用 **板块一/二(SSH & 本机执行链路)**
- 列目录 / 读写改删文件 → 复用 **板块三(文件浏览器内核)**
- 上传 / 下载大文件 → 复用 **板块四(文件上传下载引擎)**,一次调用完成传输
- **命令安全护栏与审批**:
- 针对 Agent 执行路径设置 TOML 规则护栏(红线 > 黑名单 > critical > 需审批 > 白名单 > 放行),每台主机可设独立安全挡位(`safe` / `standard` / `trusted`)。
- 拦截时返回清晰的 `why` + `suggestion`;需人工确认的命令进入 UI 审批队列,并在主机运行记录与审计中留痕。
- **命令黑名单护栏**:
- 一份全局名单(`data/deny-list.txt`,一行一条、`*` 通配、按词边界,首启写出内置的不可逆灾难,之后用户自己增删),只覆盖 `vps_exec` 与 `vps_terminal` 的命令通道;文件写/传输类不判定。
- 命中即拒绝执行并说明命中了哪条;没有白名单、确认流程、风险分级与安全挡位。
- 存在的理由只有一个:MCP 工具一旦被外部 agent 放行,参数里的命令就不再受它自身权限系统检查,这里是唯一的兜底。
- 边界:防手滑,不防蓄意绕过(`r\m -rf /`、`$(echo rm) -rf /` 这类形态纯模式匹配必然漏)。
- **双传输支持**:`--mcp-stdio`(供本机 Claude Code 零配置直连)+ Streamable HTTP(带范围令牌)。
---