第三方插件启发式体检:静态扫描网络外传、凭据访问、代码混淆、持久化等可疑模式并按权重打分(SAFE/LOW/MEDIUM/HIGH),可选运行时子进程绊线(只记不改)。
安装
# npm 包(预构建)
dsh plugin --profile web add dsh-plugin-vetting
# GitHub 源码(首次需按提示配置 allowBuilds 构建授权后重试)
dsh plugin --profile web add github:truelove-dreamer/dsh-plugin-vetting
装任何插件都等于在你的机器上跑第三方代码,权限和你本人一样大——能读你的文件、用你的凭据、访问网络,工具审批管不到它。GitHub 来源的插件还会在安装时执行构建脚本。请只安装可信来源,并尽量锁定 commit(github:owner/repo#sha)。
README
DeepSeek Harness 插件:对已安装的第三方插件做恶意行为启发式扫描 + 误伤(高权限误用)提示 + 可选运行时绊线。
威胁模型(先读这个)
DSH 插件在 harness 进程内执行,拥有完整权限。因此本插件不是安全边界——它是启发式绊线(类似杀毒软件):静态扫描插件源码,命中可疑模式就报告,从不执行插件代码,不拦截(拦截会误伤正常插件)。
三类威胁,两种输出:
| 威胁 | 输出 | 含义 |
|---|---|---|
| 恶意(外传凭据、eval、持久化) | risk 分数 → SAFE/LOW/MEDIUM/HIGH | 蓄意滥用,需人工核实 |
| 误伤(非恶意,但高权限路径写得太糙) | suggest narrowing 建议区 |
不扣分、不标可疑,只建议收窄权限 |
| 运行时动态加载(下载后 eval、远端模块) | 文档声明 + [REVIEW] 标记 |
静态扫描看不到,不在扫描范围 |
fail-closed 视角:任何命中 eval / new Function / vm.runInNewContext 的插件,无论总分多少都标 [REVIEW: dynamic code execution present]——eval 是静态扫描最大的盲区,它的存在本身就应降级信任,而不是等凑够分数才 HIGH。
真正的根治方案应由 harness 提供"挂载前扫描钩子"——本插件是该思路的独立原型。
功能
| 能力 | 说明 |
|---|---|
plugin_vet 工具 / /plugin-vet 命令 |
扫 $DSH_HOME/profiles/*/node_modules 下所有 dsh-plugin-*(含 @scope/dsh-plugin-*)第三方包 |
| 恶意规则(15 条) | 网络外传、凭据访问、代码执行/混淆、持久化、读会话日志、生命周期脚本(含 install/prepare/prepublishOnly——git 依赖安装时 prepare 也会执行) |
| 误伤规则(3 条) | home 目录宽松读取、字符串拼接路径、递归遍历 home——标为"建议收窄"而非可疑 |
| 传递依赖 | 统计声明依赖数 + 就地扫描嵌套 node_modules/* 的生命周期脚本,报告"N 个未检查" |
[REVIEW] 标记 |
eval/new Function 命中即降级信任,不看总分 |
| 覆盖范围报告 | 每个包报告"扫了 N 个文件、M 行代码、X 个依赖/脚本",让边界显式可见 |
| 官方包哈希基线(默认开) | @deepseek-ai/* 豁免的同时记录内容哈希基线($DSH_HOME/.dsh-plugin-vetting/baseline.json);安装包与基线不一致 → 豁免自动失效并报警(供应链投毒检测)——从"信任名字"变"信任内容" |
| enforce 门禁模式(默认关) | config.enforce: true 时绊线升级为门禁:命中高置信可疑模式的 spawn 直接阻断(throw)而非记日志。实验性:同进程 hook 不是内核边界,且误伤会让用户禁用整个工具——保持默认关 |
| 运行时绊线(可选) | config.monitor: true 时包装 subprocess.spawn,可疑命令记警告日志;只记不改 |
| 官方豁免 | @deepseek-ai/* 自动豁免(但见哈希基线) |
| 白名单 | config.allowlist 放行可信插件 |
安装
包已声明 dsh.bundle manifest(根目录 cordis.patch.yml),一条命令自动挂载:
dsh plugin --profile web add dsh-plugin-vetting
手动挂载(可选,等价写法):
- insert:
- id: plugin-vet
name: dsh-plugin-vetting
config:
# monitor: true # 可选:运行时子进程绊线(只记日志)
# allowlist: [dsh-plugin-security-audit]
# # 白名单:可信插件(安全插件规则里引用密钥路径,启发式必然高分)
使用
- 模型工具:
plugin_vet - 斜杠命令:
/plugin-vet
示例输出:
# Plugin vet — 2 third-party plugin(s) scanned
safe=1 low=0 medium=0 high=1
[HIGH] dsh-plugin-some-plugin@1.2.0 (score 12)
- network-fetch: makes fetch network requests @ lib/index.js:8
- eval: dynamic code execution — static scan cannot see what runs here; requires manual review @ lib/index.js:21 [REVIEW]
suggest narrowing (not suspicion):
- sloppy-home-read: reads under the user home with broad patterns @ lib/index.js:4
deps: 3 declared, 2 nested scanned, 1 unchecked
- nested dep evil-dep has lifecycle scripts: postinstall
> heuristic scan only: a clean result is not a security guarantee
> runtime-dynamic code (downloaded then eval'd, remote modules) is NOT in scope — static scan cannot see it
开发
npm test # node --test,零依赖
诚实边界
- 启发式扫描:恶意代码伪装成正常写法仍可能漏过;干净结果 ≠ 安全保证;
- 运行时动态加载的代码(下载后 eval、require 远端模块)不在静态扫描范围——不要因扫描通过就放松警惕;
- 已知误报类:安全类插件(如 credential-guard / security-audit)的规则里会引用密钥路径、外传域名,启发式必然高分——用
allowlist白名单处理; - 传递依赖只做就地扫描(包内嵌套 node_modules)+ 声明计数;提升到宿主 node_modules 的依赖不会逐个深扫,未检查数如实报告;
- 绊线只记录不阻断;官方豁免按包名判断,不校验发布者可信度。
链接
同类插件
strukto-ai/mirage#dsh★ 3419
把文件系统与 bash 提供者换成 mirage 虚拟工作区:文件工具与 shell 命令作用于挂载的资源(RAM、S3、Redis、Slack、Gmail、Notion、Postgres)而非宿主磁盘,支持按挂载点设置读/写/执行模式、按命令选择沙箱(进程内 monty、pyodide、quickjs;远程 docker、e2b、daytona),并可在虚拟终端中安装 CLI(git、gh、slack、linear、ntn、gws,或自行注册的程序树)作为命令头词。
hust-open-atom-club/oh-dsh★ 174
社区发行版:TUI、桌面端与 Web UI 统一体验,分层安装、一步到位。
Jayden-X-L/forkprobe★ 65
同一任务并行试跑多个技能,对比结果选出最优。
vlln/plugin-registry★ 38
插件生态基建:浏览器面板管理官方 repository 插件(0 patch)+ make-dsh-plugin 插件开发引导技能。
forrestchang/dsh-multica-runtime★ 33
让 dsh 运行时跑在 Multica 上。
DietCokewithSugar/dsh-user-experience★ 18
帮你发现项目中可能存在的用户体验问题:自动走查 React/TypeScript 源码,定位问题并给出具体优化建议。