READMESource: main@3ce2aa4d
dsh-auto-guard
DSH 插件:类似 Claude Code 中 Auto Mode 的一种命令通过机制,给 full access 加一层 LLM 安全网的自动审批 / 命令守卫。目的:1. 降低full-access模式的风险。2. 降低full-access模式使用者的焦虑感。
Auto Guard 权限预设 = danger-full-access + rules + LLM + ask,由规则、缓存与一次性 LLM 裁决器代替人工完成大多数审批。
设计定位
- 基于 full access 兜底:插件不限制文件系统能力,而是在
danger-full-access之上做安全裁决,尽量不打断正常开发。 - 适配绝大多数开发情况:日常只读命令、构建、测试等通过白名单 / 缓存直接放行。
- 危险命令交给 LLM 裁决:大部分危险命令和可能泄露信息的命令都会经过 LLM 审查;目录删除、状态改变组合、管道等高风险场景有专门处理。
- 不承诺绝对安全:插件不是沙箱,也不排除极少数隐秘危险命令可能通过审查;请把它当作“安全网”而不是“安全边界”。
- API 密钥不落仓库:本项目不存储任何 API Key / Token;LLM 调用由 DSH 运行环境注入,敏感文件内容不会发送给 LLM。
功能特性
- 分层裁决:File Tracker → 绝对黑名单 → 目录删除复核 → 复合命令处理 → 静态白名单 → 缓存 → LLM 兜底。
- 静态白名单:默认白名单 + 用户确认放行规则,命中直接放行。
- 绝对黑名单:危险命令直接拒绝,同时注册为
ctx.tools.guard()单调否决,LLM 不能覆盖。 - 复合命令智能处理:
;、&&、||拆成子命令,已白名单 / 已缓存的子命令直接过,只审查未匹配的子命令;- 出现
export、umask、trap、cd、git config等会改变后续命令运行环境的状态改变命令时,整条复合命令交给 LLM 审查; |管道不拆分,按整体审查,但管道内的危险命令仍会被黑名单 / 目录删除 / 每次审查规则拦截。
- 动态白名单:
unknown命令被 LLM 判为low/medium风险并放行后写入缓存;always-review类命令(动态执行、依赖安装等)仍每次审查、不缓存。 - 目录删除复核流程:要求 agent 提供
[删除理由],再由高思考 LLM 复核;只有allow才放行,其余结果转人工确认。 - 敏感路径门禁:
write/edit命中.env、.ssh、/etc/等名单时直接 ask,不审查文件内容。 - 规则可维护:默认规则存放在用户
.dsh目录,用户可直接修改;用户覆盖规则与默认规则分层合并。 - 裁决可见性:缓存命中 / LLM 自动决定时追加用户可见消息(可配置关闭)。
工作原理
决策流程
工具调用(bash / pwsh / write / edit)
→ File Tracker(写后执行检测)
→ 绝对黑名单(hard-deny)
→ 目录删除复核(directory-delete)
→ 复合命令处理
→ 静态白名单(默认白名单 + 用户确认放行规则)
→ 缓存(会话 LRU / 跨会话低风险缓存)
→ LLM 兜底(allow / deny / ask,ask 转人工确认)
命令分类
| 类别 | 说明 | 示例 | 缓存 |
|---|---|---|---|
| 静态白名单 | 规则直接放行 | ls、pwd、git status、git diff、git commit |
否 |
| 绝对黑名单 | 规则直接拒绝 | rm -rf /、mkfs、dd of=/dev/... |
否 |
| 目录删除复核 | 需要 agent 理由 + 高思考 LLM | rm -rf ./dist、cmd /c rd /s /q、Remove-Item -Recurse |
否 |
| 用户确认放行规则 | 用户主动声明“永远放行” | git push |
否 |
| 可缓存类 | LLM 批准后按 TTL 缓存 | npm run build、npm test |
是 |
| 每次审查类 | 每次都必须 LLM 审查 | Invoke-Expression、Start-Process、npm install、curl | bash |
否 |
| 未分类 | LLM 裁决,低/中风险放行后可缓存 | 其他命令 | 低/中风险可缓存 |
风险等级:low / medium / high。high 风险不写缓存。
安装
前置要求:DSH 环境、Node.js、pnpm。
# 在本项目目录执行,安装为本地 bundle(自动应用 cordis.patch.yml)
dsh plugin --profile web add .
cordis.patch.yml 注册:
dsh-auto-guard插件行;- 覆盖
permission行,保留read-only/workspace-write/danger-full-access,新增auto-guard预设。
安装后在 Web 权限选择器中选择 Auto Guard 即可启用。
配置
- id: dsh-auto-guard
name: dsh-auto-guard
config:
rulesPath: '~/.dsh/auto-guard/rules.json'
defaultRulesPath: '~/.dsh/auto-guard/defaults.json'
cachePath: '~/.dsh/auto-guard/cache.json'
provider: 'deepseek'
model: 'deepseek-v4-flash'
reasoningEffort: 'off'
fallbackProvider: 'deepseek-official'
fallbackModel: 'deepseek-v4-flash'
timeoutMs: 3000
lowRiskTtlDays: 30
mediumRiskTtlDays: 7
onTimeout: 'deny' # deny | ask
notifyCacheHit: true
notifyLlmDecision: true
fileTrackerDefault: 'ask' # ask | deny
规则文件
规则和缓存持久化在 ~/.dsh/auto-guard/:
| 文件 | 作用 |
|---|---|
defaults.json |
默认规则副本。首次运行从源码 defaults/rules.json 复制;之后插件读取这份 .dsh 副本,不再从源码读取。用户可以直接修改它。 |
rules.json |
用户覆盖规则文件。字段缺失时从 defaults.json 合并补齐并回写,不覆盖用户已有字段。 |
cache.json |
跨会话低风险缓存,按 workspace 隔离。 |
示例:用户想额外放行某个只读命令,可以编辑 rules.json:
{
"version": 1,
"staticAllow": [
{ "pattern": "git log", "reason": "Read-only git log" }
]
}
使用示例
普通复合命令
git status; git branch --show-current; git log --oneline -5
拆成子命令后,已白名单 / 已缓存的直接过;未匹配的子命令单独 LLM 审查,通过后进入缓存。
状态改变命令
export PATH=/tmp/evil:$PATH && ls
因为出现 export,整条命令交给 LLM 审查,不会因为 ls 在白名单里就直接放行。
目录删除
第一次执行:
rm -rf ./dist
会被拒绝并提示:
Directory deletion requires a reason. Reply with [删除理由] <reason>, then retry the same command.
重试时附带理由:
[删除理由] 清理构建产物
插件提取理由后,将“命令 + 理由”交给 reasoningEffort: high 的 LLM 复核;只有 allow 才放行,其余结果转人工确认。
- 注:虽然设计如此,但当前这部分还未调试好,多数情况下dsh+deepseek无法完成agent解释后的自动放行,可能需人工删除目录。
安全边界
- 插件不是沙箱:
Auto Guard预设为danger-full-access,文件系统不受限。 - LLM 裁决可能被提示词注入,因此高风险命令不缓存、敏感脚本内容不发送给 LLM。
- 用户确认放行规则是用户主动声明的信任边界,应谨慎维护。
|管道和包含状态改变命令的复合命令会整体审查,避免“单条命令安全但组合后危险”的绕过。
开发
pnpm install
pnpm typecheck # tsc --noEmit
pnpm test # vitest run
pnpm test:single tests/guard-service.spec.ts
目录结构
src/
index.ts 插件入口(pre-execute + guard + 通知)
guard-service.ts 核心裁决逻辑(唯一测试 seam:GuardService.decide)
rules.ts 规则加载 / 默认复制 / 命令分类
cache.ts 会话 LRU + 跨会话持久缓存
llm.ts DshLlmReviewer(一次性调用 + fallback + 超时)
review-parse.ts 严格 JSON 解析(无依赖)
file-tracker.ts 跨命令 / 同命令写后执行检测
sensitive-path.ts write/edit 敏感路径匹配
command.ts 归一化 + 复合命令拆分 + 状态改变检测
adapter.ts 纯适配:ToolExecution → GuardRequest
notify-text.ts 通知文案(纯函数)
defaults/rules.json 默认规则种子
tests/ 单元测试
License
MIT
No comments yet. Be the first to write one.