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 。

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

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

小夜