dsh-veil:在 DSH 執行層攔截與抹除密鑰

前言

在 DeepSeek Harness(DSH)裏跑智能體時,工具會把命令輸出、文件內容寫進模型上下文和本地會話日誌。DSH 自帶的 ui-secret-mask 只在瀏覽器渲染層把形如 sk-... 的字符串畫成 ***,底層數據仍以明文進入後續請求前綴、寫入 ~/.dsh/sessions/**/session.v4.jsonl.zstd(zstd 壓縮,不是加密),也可能作爲工具參數拼進出站 URL 或 curl。提示注入若把密鑰塞進參數,僅靠 UI 遮罩擋不住。

下面介紹社區插件 dsh-veil(維護者 yhl4466),在官方擴展點 tools/pre-execute / tools/post-execute 做確定性強制處理:不改 DSH 源碼、不註冊新工具,文檔稱 零 schema 稅。分類爲 admin-security。

這是什麼

dsh-veil(包名 dsh-veil,README 副標題「密鑰面紗」)是 DSH 的執行層憑據護欄:在密鑰進入模型上下文、會話日誌或出站請求之前攔截或抹除;阻止讀取憑據庫;對 web/MCP 等來源的結果標記不可信邊界。許可證 MIT,當前 package 版本 1.0.0(以倉庫 package.json 爲準)。

與 UI 遮罩的差別

方面 ui-secret-mask dsh-veil
作用層 瀏覽器顯示 工具執行前後鉤子
模型可見副本 仍可能含明文 結果脫敏後再進入上下文
會話日誌 不保證改寫 實測 tool/result 事件存脫敏後副本
讀憑據文件 / 外帶密鑰 不攔截 可配置拒絕

四層能力

README 用一張表概括四條規則,對應 cordis.patch.yml 裏的開關:

層 鉤子 行爲
A 結果脫敏 tools/post-execute 進入上下文/日誌前,抹掉 ~/.dsh/.credentials.yaml 與環境變量中的 KEY/TOKEN/SECRET 等已知真值,以及常見形態(sk-、ghp_、AKIA、JWT、Bearer、PEM 私鑰、KEY=value、帶密碼連接串等)
B 憑據讀攔截 tools/pre-execute 參數指向 .credentials.yaml、.ssh/*、.aws/credentials、.npmrc、.netrc、.git-credentials 等時拒絕(含 shell 拼接)
C 外發攔截 tools/pre-execute web/mcp、帶 URL、curl/Invoke-WebRequest/ssh 等出站類調用參數中出現密鑰則拒絕
D 信任邊界 tools/post-execute 爲 web/mcp 結果包一層確定性「不可信數據」邊界,降低間接注入成功率

安裝與啓用

從 GitHub 安裝(README 原文命令):

# 從 GitHub 安裝
dsh plugin add github:yhl4466/dsh-veil

# 或本地目錄(開發時)
dsh plugin add <本目錄>

維護者在 desktop profile 驗證過:Loader entry 爲 include:dsh-veil,fiberPhase=active。社區目錄頁:skillhub.cn/plugins/yhl4466/dsh-veil;源碼:github.com/yhl4466/dsh-veil。

配置

在 profile 的 cordis.patch.yml 中覆蓋插件配置。注意:config 塊是整體替換,覆蓋時需把需要保留的字段一併寫全。

- id: dsh-veil
  name: dsh-veil
  config:
    redactResults: true        # A 結果脫敏
    denyCredentialReads: true  # B 憑據讀攔截
    blockSecretEgress: true    # C 外發攔截
    envelopeUntrusted: true    # D 信任邊界
    watchCredentialStore: true # 從 ~/.dsh/.credentials.yaml 讀真值(只讀,不落盤)
    exemptTools: []            # 不脫敏的工具名
    untrustedTools: []         # 額外聲明爲不可信來源的工具名
    extraSecrets: []           # 額外已知密鑰(字符串數組)
    protectPaths: []           # 覆蓋受保護路徑列表(整體替換)

典型用法:查看狀態

輸入 /veil(不進工具列表,不佔每次請求的 token)。示例輸出形態如下:

dsh-veil 憑據護欄
開關:結果脫敏=開 憑據讀攔截=開 外發攔截=開 信任邊界=開
本會話:脫敏 2 次 / 攔讀 1 次 / 攔外發 0 次 / 加邊界 3 次
近 24h 全局:...
命中規則 Top5:...

賬本路徑:~/.dsh/veil/ledger.jsonl。只記錄「命中哪條規則、幾次」,不寫密鑰原文;超過 2 MB 自動輪轉。

設計約束

與 dsh-fence 共用一套緩存契約,README 強調四點:

  1. 前向一次性:結果僅在進入會話那一刻改寫一次,不回改已發送消息。
  2. 確定性:同一 (工具, 參數, 結果) 每次得到相同字節(信任邊界不含時間戳)。
  3. 失敗開放:脫敏異常時放行原結果,不把成功調用變成報錯。
  4. 不落明文:賬本與插件相關日誌不含密鑰值。

已驗證行爲與已知邊界

倉庫提供 test/veil-test.mjs,README 記載 npm test 下 16/16 通過,覆蓋:sk- 與憑據庫真值脫敏、憑據讀被拒、curl 帶密鑰被拒;普通讀文件、grep pattern、含 URL+密鑰的 write 正文、文檔裏提到 .credentials.yaml 的 shell 寫法等不誤攔;信任邊界確定性、賬本無明文、圖片塊透傳、/veil 輸出無明文等。

使用前需知邊界(摘自 README):

  1. 模型自己生成的內容(assistant 文本、tool-call 參數、手動粘貼的消息)不經過 tools/post-execute,不在本插件範圍;輸入側可配合 dsh-secret-paste 一類插件。
  2. 若鏈上 spill / dsh-fence 先把超大結果落盤,落盤副本可能仍含原文;憑據讀攔截已關掉主要讀入口。
  3. 圖片/二進制不做脫敏。
  4. UI 工具卡片仍顯示原始結果(脫敏只作用於模型可見副本),便於本地排查。

適用場景與注意

適合在 DSH 中長時間開工具、讀倉庫與環境、並調用 web/MCP 的開發者,希望把密鑰擋在執行層而不是隻看 UI。插件以當前 dsh 進程權限運行,安裝前請自行審閱 源碼與 MIT 許可證,確認與自身合規要求一致。

DSH 生態強調「一切皆插件」;SkillHub 爲社區目錄,與 DeepSeek / 幻方無官方從屬關係。

結尾

dsh-veil 把「看見密鑰被星號擋住」推進到「上下文和出站路徑上少一份明文」。四層開關可按 profile 裁剪;用 /veil 看本會話與近 24h 命中情況即可做日常覈對。

  • 目錄頁:https://www.skillhub.cn/plugins/yhl4466/dsh-veil
  • GitHub:https://github.com/yhl4466/dsh-veil
羽毛球分组比赛记分
小程序二维码

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

小夜