前言¶
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 。