dsh-guard:给 DSH 加一道危险操作护栏

前言

DSH(DeepSeek Harness)的思路是「一切皆插件」,工具调用能力由插件提供,模型拿到的权限基本等于当前进程的权限。这意味着智能体执行 rm -rf、读 .env、把 curl | sh 当日常操作时,后果直接落在宿主机上。只看输出脱敏是不够的,还得有一层在调用发生前拦截或确认的机制。

下面介绍的 darkmagic-ai 维护的 dsh-guard(npm 包名 dsh-guardrail),就是做这件事的插件。它按固定规则检查工具参数:命中危险命令或敏感路径时直接拒绝,或弹一次网页端审批;工具返回内容交给模型前先做密钥脱敏;再把每次判断写进本地 JSONL 审计日志。它不替代沙箱,防的是失误,不是对抗。

这是什么

一个 DSH 插件,分类 admin-security,当前星标为 0。功能分四块:危险命令拦截、敏感路径保护、工具输出脱敏、本地审计日志与日报,另外提供 guard_report 工具,被问到时返回一份中文当日操作摘要。许可证 MIT,版本 0.1.2,要求 DSH ≥ 0.2.1-rc.5、Node ≥ 22,已在 Linux 和 Windows(PowerShell)上验证过。

核心功能

危险命令拦截内置 22 条规则,覆盖递归删除、格式化磁盘、fork 炸弹、git push --force、curl | sh、删除注册表、新增系统用户等;每条规则的 action 可以是 deny(直接拒绝)或 ask(网页里弹出审批,批准才执行)。

敏感路径保护覆盖 .env、SSH 私钥、云厂商凭据文件、浏览器 Cookie 与密码库、DSH 自己的凭据文件、系统密码库。

输出脱敏在工具返回内容交给模型之前生效,内置 13 条规则,包括私钥、JWT、sk- key、GitHub / AWS / Slack / Google / Stripe 令牌、Bearer 串、password= 一类键值、身份证号、中国和智利手机号;邮箱和智利 RUT 默认关闭,需要时单独开。

审计日志按天追加写入 JSONL,默认目录 $DSH_HOME/dsh-guard/。参数预览先脱敏再截断,密钥原文不会落盘。没有审批通道时(比如 headless 场景),ask 退化为拒绝,审计里记为 unavailable。

另外有 dryRun 演练模式,只记录不拦截,可以先看一下会误拦哪些命令。插件通过 cordis.patch.yml 挂载,不需要改动 DSH 源码。

安装

建议先装到一个单独的测试 profile 里试用:

# 从 npm 安装
dsh plugin --profile <profile> add dsh-guardrail

# 或者用离线安装包
dsh plugin --profile <profile> add ./dsh-guardrail-0.1.2.tgz

启动日志里出现 [dsh-guard] 已加载… 即表示装载成功。同一个版本要重装时,先 dsh plugin --profile <profile> remove dsh-guardrail 再 add,否则可能读到旧缓存。

配置

配置可以在网页的 Plugins → dsh-guardrail 里改,也可以写进 profile 配置。常用项如下:

配置项 默认值 说明
enabled true 总开关
dryRun false 只写审计日志,不拦截、不脱敏
announce true 往系统提示里加一段护栏说明(约 60 token)
ignoreTools ["guard_report"] 这些工具不做拦截检查
commandArgKeys / pathArgKeys 内置列表 哪些参数名算「命令文本」/「路径」
disabledRules [] 要关掉的内置规则 id
rules [] 自定义规则:{ id, kind: command\|path, pattern, flags="i", action="ask", reason }
allow [] 白名单正则,命中的参数不触发拦截
redact.enabled true 是否给工具输出打码
redact.mode content content 只改模型看到的文本;value 改规范化后的 value
redact.disabled [] 要关掉的内置脱敏规则名
redact.emails / redact.chileRut false 给邮箱 / 智利 RUT 打码
redact.extra [] 自定义脱敏:{ name, pattern, flags="g", replacement="[REDACTED]" }
audit.enabled true 写审计日志
audit.dir "" 留空则用 $DSH_HOME/dsh-guard
audit.logAllowed true 放行的调用也记下来
audit.logArgs true 记录参数预览(先脱敏再截断)
audit.maxArgChars 200 参数预览最多保留多少字符

插件不发起任何网络请求,日志只写在本地。

内置拦截规则

命令类规则(kind: command)节选:

id 动作 说明
rm-rf-root-home deny 递归删除根目录 / 用户目录 / 盘符
rm-rf ask 递归强制删除
win-del-recursive ask Windows 递归删除(del /s、rd /s、rmdir /s)
remove-item-root-home deny PowerShell 递归删除根目录 / 用户目录 / 盘符
remove-item-recurse ask PowerShell 递归删除
format-disk deny 格式化磁盘 / 分区
diskpart-bcdedit ask diskpart / bcdedit / vssadmin
fork-bomb deny fork 炸弹
shutdown ask 关机 / 重启
reg-delete ask 删除注册表项
net-user-add ask 新增系统用户 / 提权
git-push-force / git-destructive ask 强制推送 / reset –hard / clean -fd 等
pipe-to-shell ask curl\|sh、wget\|bash、iwr\|iex

路径类规则(kind: path)节选:

id 动作 说明
env-file ask .env 环境变量 / 密钥文件
ssh-private-key deny SSH 私钥
ssh-dir ask ~/.ssh 目录
dsh-credentials deny DSH 凭据文件(.credentials.yaml)
key-cert-files ask *.pem、*.p12、*.pfx、*.ppk、*.key
browser-secrets deny 浏览器 Cookie / 登录数据库
cloud-credentials ask .aws/credentials、.git-credentials、.netrc、.kube/config、.docker/config.json
system-secrets deny /etc/shadow、Windows SAM

典型用法:先观察再启用

先开 dryRun,什么都不会拦,先看审计里记了哪些命中:

# profile 配置里
dsh-guardrail:
  dryRun: true

跑一段时间后读当天日志:

tail -n 200 "$DSH_HOME/dsh-guard/audit-$(date +%F).jsonl"

确认命中符合预期后,把 dryRun 关掉,并按需把误拦的规则 id 放进 disabledRules,把确实要放行的命令写进 allow 白名单。之后问模型「今天都干了啥」,它会调用 guard_report 返回一份中文日报,格式类似下面的样子:

📋 dsh-guard 日报 2026-11-04
工具调用共 4 次;拦截 1 次,询问 2 次(批准 1 / 拒绝 1)。
输出脱敏共 3 处(github-token×1、cn-phone×1、cl-phone×1)。
调用最多的工具:powershell×3、read_file×1

被拦截/询问的记录(最近 3 条,共 3 条):
- 23:21:05 [powershell] 已拒绝 · 规则 ssh-private-key · type C:\temp\id_rsa
- 23:21:40 [powershell] 询问→被拒绝 · 规则 reg-delete · reg delete HKCU\Software\DshGuardTest /f
- 23:22:10 [powershell] 询问→已批准 · 规则 remove-item-recurse · Remove-Item -Recurse X:\demo

适用场景与注意

适合本地或测试机上使用 DSH 的开发场景,尤其是担心智能体执行危险命令、或工具输出里频繁带出密钥 token 的情况。Windows 上的 Remove-Item -Recurse、reg delete、diskpart 这类命令在规则里有对应项。

使用前需要注意几点:插件以当前 DSH 进程的权限运行,拦截发生在调用的参数侧,不提供文件系统或命令执行层面的隔离。它基于正则匹配,命令经过 base64 编码、变量拼接、先写脚本再执行,或交给别的解释器运行,都可能绕过;脱敏同样基于格式匹配,不常见的密钥格式可能漏掉,偶尔也会误打码。它只检查配置里指定的参数名,非标准工具的参数可能看不到。

因此不要把它当成沙箱替代品,真正的隔离要配合沙箱 / 容器、最小权限账号和只读挂载。安装前应先检查源码与许可证(MIT),建议先装进单独的测试 profile 跑小流量验证。

小结

dsh-guard 的价值在于把最常见的危险操作和密钥泄漏挡在调用发生前,并留下可回看的本地审计记录。功能边界也比较清楚:正则护栏,防失误,不防对抗。目录页在 https://www.skillhub.cn/plugins/darkmagic-ai/dsh-guard ,源码在 https://github.com/darkmagic-ai/dsh-guard 。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜