前言¶
在 DSH(DeepSeek Harness)里让 Agent 执行 git commit、git push 或 gh repo sync 时,暂存区与即将上传的提交里可能混入 API Key、私钥、连接串、本机绝对路径或个人信息。人工逐行看 diff 成本高,单靠 .gitignore 也拦不住已经 git add 的内容。下面介绍 Host 插件 dsh-push-privacy-guard(维护者 lizhijie429,分类 admin-security):在工具层于上述命令执行之前做只读扫描,命中未白名单项时走 DSH 原生审批面板,由用户决定放行或阻止。
这是什么¶
一句话定位:内容泄露护栏,不是完整安全边界。插件挂接 DSH 的 tools/pre-execute(异步 prepend),覆盖 Agent 通过 pwsh / bash 一次性命令以及 PTC 内部 bash 发起的 commit/push;持久终端 terminal_send 上的 commit/push 默认直接拒绝。它不替代人工终端推送、脚本自行发起的推送,也无法保证规则库以外的泄露形式被识别。
仓库:https://github.com/lizhijie429/dsh-push-privacy-guard
社区目录页:https://www.skillhub.cn/plugins/lizhijie429/dsh-push-privacy-guard
当前版本 0.2.1,许可证 MIT,要求 DSH >=0.2.1-0 <0.3.0。
核心功能¶
提交前与推送前检查¶
- commit:扫描将要进入记录的暂存区;同一命令里先
git add、带 pathspec /-i/--include、commit -a时按git diff HEAD覆盖工作区并补扫未跟踪文件;同时检查-m/-F/--trailer提交信息。无法预读的信息(如-F -、命令替换)按「扫描不完整」处理,默认仍要求授权。 - push:只读计算本次 push 实际上传范围(支持
git -C、多 refspec、remote、--force、--all、--mirror、--delete、gh repo sync),按提交逐个扫描 diff 与提交信息,并检查 tag 消息。 git push --dry-run/-n:不上传内容,直接放行、不弹审批。
首次推送与全仓扫描¶
某个仓库第一次经 DSH 推送时,可询问是否先做全仓扫描(配置 fullScanOnFirstPush:ask / always / never)。全仓扫描用 --full-tree 覆盖 HEAD 下 git 已跟踪 文件;.gitignore 忽略的内容不参与。之后该仓库只检查本次提交/推送增量。
审批与白名单¶
命中且不在白名单时调用 ctx.approval.request(),在 Web UI 展示脱敏后的命中清单。批准 = 本次放行,且(默认)把项写入白名单;拒绝或取消 = 阻止命令。白名单只存掩码与稳定指纹(sha256(规则 id + 命中值) 截断),同一敏感值跨文件、跨仓库授权一次即可。扫描失败、超时、git 查询失败或拿不到授权时 fail-closed,不会静默放行。
内置规则与白名单管理¶
V1 内置规则覆盖私钥块、常见云与 SaaS Token(AWS、GitHub/GitLab/npm、OpenAI、Slack、Google API Key 等)、JWT、Bearer、赋值式 secret(含中文键名)、数据库/消息队列连接串、本机路径(Windows/UNC/POSIX/~/.ssh)、邮箱、大陆手机号与身份证、内网 URL 等;占位符与示例值有过滤,ignorePaths 默认跳过锁文件、构建产物、node_modules 等。
用户专属斜杠命令 /privacy-guard(不产生模型消息)可 list/remove/clear/status/repos/reset/scan/help;底层 state/whitelist.json 可手改、即时生效。配置由 Cordis Config(Schemastery)校验,带 .volatile() 的字段可在 DSH 设置页热更新,无需重启 Host。
安装与启用¶
插件以当前 DSH 进程权限运行;安装前建议自行查看仓库源码与 MIT 许可证。npm 包尚未发布,以 Git 源或市场索引安装为准。
命令行添加(desktop profile 示例)¶
dsh plugin --profile desktop add https://github.com/lizhijie429/dsh-push-privacy-guard
通过自定义插件市场¶
- 在 DSH 中启用实验性 自定义插件市场(插件 → 实验性插件 → 更多 → 自定义插件市场)。
- 在 插件 → 发现 → 索引源 粘贴市场索引 URL:
https://raw.githubusercontent.com/lizhijie429/dsh-push-privacy-guard/main/market/index.json
- 搜索 “Push Privacy Guard” 安装。
也可在 desktop 的 cordis.patch.yml 中按 README 用绝对路径 insert 挂载 index.mjs 并附带 config(如 fullScanOnFirstPush: ask),具体片段见仓库 README「安装」一节。
典型用法¶
日常 commit / push¶
启用插件且 enabled、interceptCommit、interceptPush 为默认 true 时,Agent 照常调用 git;若扫描到新敏感项,Web UI 会出现审批。用户确认后同类项进入白名单,后续不再重复询问。
管理白名单与自检¶
在 Web UI 命令面板执行(不会进入模型上下文):
/privacy-guard list
/privacy-guard remove <id前缀>
/privacy-guard clear confirm
/privacy-guard status
/privacy-guard scan
/privacy-guard scan 对当前会话仓库做全仓 tracked + 暂存区扫描并报告,不推送、不写白名单。
配置要点¶
在 profile 的 cordis.patch.yml 的 config: 下可调整例如:unresolvedRepo(定位不到仓库时 deny/allow)、persistentShellCommits(持久终端 deny/allow)、disableRules / extraRules、maxTotalBytes / gitTimeoutMs 等。非法枚举会在加载时报错;部分字段仅在 yml 中改数组/对象,需 profile 重载生效。完整字段表见仓库 README「配置」一节。
适用场景与注意¶
适合:经常用 DSH Agent 自动改代码并 commit/push 的开发者,希望在工具链上多一层「上传前看一眼」的护栏,并可用白名单平衡误报与重复打扰。
务必知晓:
- 定位是降低误泄露概率,不能替代密钥轮换、远端 secret scanning、代码审查或最小权限策略。
- 不覆盖人工终端与插件外的推送路径;模型理论上仍可写
state/whitelist.json,主体信任边界见仓库「已知限制」。 - 社区目录 skillhub.cn 为独立生态索引,与 DeepSeek / 幻方无官方从属关系;DSH 本身遵循「一切皆插件」的扩展方式。
结尾¶
dsh-push-privacy-guard 在 DSH 工具执行 commit/push 之前做只读敏感信息扫描,用原生审批与白名单把「是否上传这段内容」交还给人。需要细节、规则表与 desktop/server 挂载示例时,以 GitHub README 为准: