前言¶
在 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 強調四點:
- 前向一次性:結果僅在進入會話那一刻改寫一次,不回改已發送消息。
- 確定性:同一
(工具, 參數, 結果)每次得到相同字節(信任邊界不含時間戳)。 - 失敗開放:脫敏異常時放行原結果,不把成功調用變成報錯。
- 不落明文:賬本與插件相關日誌不含密鑰值。
已驗證行爲與已知邊界¶
倉庫提供 test/veil-test.mjs,README 記載 npm test 下 16/16 通過,覆蓋:sk- 與憑據庫真值脫敏、憑據讀被拒、curl 帶密鑰被拒;普通讀文件、grep pattern、含 URL+密鑰的 write 正文、文檔裏提到 .credentials.yaml 的 shell 寫法等不誤攔;信任邊界確定性、賬本無明文、圖片塊透傳、/veil 輸出無明文等。
使用前需知邊界(摘自 README):
- 模型自己生成的內容(assistant 文本、tool-call 參數、手動粘貼的消息)不經過
tools/post-execute,不在本插件範圍;輸入側可配合dsh-secret-paste一類插件。 - 若鏈上 spill /
dsh-fence先把超大結果落盤,落盤副本可能仍含原文;憑據讀攔截已關掉主要讀入口。 - 圖片/二進制不做脫敏。
- 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