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