dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
DeepSeek Harness 插件安全体检:静态代码 + 依赖审查 + AI 在线审计,绿/黄/红三级报告面板。
DeepSeek Harness 插件安全体检:对已安装的第三方插件做「静态代码审计 + 依赖审查 + AI 在线审计」,并以绿 / 黄 / 红三级报告面板呈现。
Plugin security inspector for the DeepSeek Harness web GUI: statically audits installed plugins (dangerous API patterns + dependency review), then layers an AI (default-model) audit on top, rendered as a green / yellow / red report panel.
中文 | English
dsh-plugin-guard 是 DeepSeek Harness(DSH)Web GUI 的一款插件安全体检插件。它在不执行插件代码的前提下,读取已安装第三方插件的源码与元数据,帮你判断「装上的这个插件到底在做什么、是否超出了它自称的功能范围、风险有多高」,最后给出一份绿 / 黄 / 红三级的报告。
eval、vm、shell、文件读写、网络、环境变量、系统探测、混淆、可疑外联地址、高熵载荷、凭据外传、硬编码密钥、下载即执行等),并按严重度打分。git: / file: / link: / URL)以及「包名命中可疑关键词」的依赖。preinstall / install / postinstall 脚本——这是常见的供应链攻击面;安装脚本里若出现「下载即执行」(curl/wget 管道给 shell)会被单独再标一次。curl/wget/iwr 管道给 sh/bash/iex),源码与安装脚本都查。dsh.plugin.json 的 entry.inject 与 package.json 的 dsh.client.inject),按能力面分级——模型 / 网络 / 文件 / 进程 / 密钥 / 浏览器类为高危,UI / 国际化 / 配置类为低危,未知服务一律按中危「需人工复核」——给出 0–100 的权限分并在面板逐条列出。$DSH_HOME/storages/dsh-plugin-guard/baseline.json),下次扫描自动比对——面板对「新安装 / 版本变化 / 相比上次新增了风险能力或声明权限」的插件打标。把一次性快照升级成变更探测器:可信包某个新版本被投毒(最常见的供应链攻击手法)会直接显示「⚠ 自上次扫描有变更:+install-script」。safe / suspicious / malicious / inconclusive 结论及处置建议。判定结论按「内容指纹(含默认模型)+ 版本 + TTL」缓存,而声誉证据(npm / OSV / 网络举报 / GitHub)每次实时拉新——源码 / 清单 / README 一个字节未变、未超 TTL(默认 3 天)、且新声誉里没有新的负面信号(新漏洞 / 恶意记录、新的恶意举报、新增弃用标记)时,才复用上次判定(面板标注「来自缓存」),任一变化都强制重审。malicious→红、suspicious→黄(静态已红则保持红)、inconclusive→不低于静态(静态绿则升黄)、safe→绿——且 风险分改由 AI 给出 0–100(safe 通常 < 30 / suspicious 约 40–70 / malicious ≥ 70)。AI 与静态不一致时徽章旁显式标注「AI … · 静态 …」,绝不静默降级;刷新页面后仍在有效期内的结论与打分会自动还原。MAL-* 或 “Malicious” 条目会高亮为「恶意」,是判定恶意的强信号;pushed_at 判断是否已弃坑(超 1 年无提交标红)。仓库地址优先取自插件自述(package.json 的 repository / homepage、README 文档);只有插件完全没声明时,才按包名从 npm 推断,并明确标注「可能是同名仓库,请人工核对」。node_modules 读到精确安装版本,pnpm 符号链接照追、并与声明的 dependencies / optionalDependencies / peerDependencies 交叉过滤),单次批量查询 OSV.dev /v1/querybatch 是否有已知 CVE / 恶意记录;命中依赖会在声誉面板列出,且新出现的依赖漏洞信号同样会使缓存判定失效。全程无 key、尽力而为、不阻断审计。dsh web 的机器。pnpm(dsh plugin 内部需要它来安装插件)。dsh plugin --profile <name> add @guojin-ai/dsh-plugin-guard
把 <name> 换成你要审计的 profile(默认可填 web)。安装完成后,重启 dsh(重新运行 dsh web)。
启动后打开 Web GUI 的 设置 → 插件安全体检,即可看到安全报告。
卸载:
dsh plugin --profile <name> remove @guojin-ai/dsh-plugin-guard说明:DSH 装载行的
name必须与package.json的包名@guojin-ai/dsh-plugin-guard完全一致——dsh-client-modules是按这个字符串严格比对来识别 Web 客户端插件的。若写成裸名dsh-plugin-guard,主机端仍会正常加载(插件看起来是启用的),但客户端 bundle 会被静默丢弃,表现为设置里看不到「插件安全体检」页面且没有任何报错。装载行的id: dsh-plugin-guard是稳定标识(用于disabled定位该行),与包名不同属正常。
面板顶部给出汇总统计「N 正常 · N 警告 · N 高危」,并有一个「重新扫描」按钮,可随时刷新当前安装状态。
每个第三方插件一行,展示:
展开某一行可以看到:自上次扫描的变更(若有:版本变化、新增风险能力 / 声明权限)、所有命中的风险规则及对应文件、声明的宿主服务权限(含不匹配告警)、可疑依赖、以及扫描过程中出现的错误。
每个插件行内都有一个「AI 审计」按钮。点击后:
审计结果会保留:关闭设置面板再打开,已完成的(或仍在进行中的)结果仍然可见;刷新页面后,仍在有效期内的结论与 AI 打分也会从本地缓存自动还原。
结果缓存:审计判定结论写入本地缓存(内容指纹(含默认模型)+ 版本 + TTL,默认 72 小时 = 3 天);声誉证据(npm / OSV / 网络举报 / GitHub)每次都会实时拉新。仅当源码、清单、README 均未变化、未超 TTL,且新拉取的声誉里没有出现新的负面信号(新漏洞 / 恶意记录、新的恶意举报、新增弃用标记)时,才复用上次结论并标注「来自缓存」——一旦出现新负面信号就自动作废缓存、强制重审。面板中提供「AI 缓存 TTL」设置框,可改小时数,设为 0 即关闭缓存、每次都强制重审。每个插件旁的「强制重审」按钮可单独绕过该插件的缓存重审一次,无需改全局 TTL。
面板顶部提供 Token 填写区(密码框,不回显):
$DSH_HOME/storages/dsh-plugin-guard/github-token.txt),不进会话、不上传。本插件集成了微步在线 SafeSkill 平台(https://safeskill.cn),可对当前 profile 中已安装的 DSH Skills 做在线多引擎安全扫描。
$DSH_HOME/storages/dsh-plugin-guard/safeskill-key.txt,权限 0600),不进会话、不上传。$DSH_HOME/skills/<name>/SKILL.md 及其附带的支持文件),在客户端完成 CRC32 校验 + 标准 zip 打包(零额外依赖),上传至 SafeSkill 平台,然后轮询拉取报告(最长 5 分钟)。code=-4)、未配置 Key 或平台不可达时,可点每个技能旁的「AI 审计」按钮,改用 DSH 默认模型在本机审查该 Skill,不消耗任何 SafeSkill 额度。审计会读取该技能的完整内容(SKILL.md 及附带文件;二进制文件只记占位符,不会把图片当文本塞进提示词),按 Skill 特有的威胁模型判断:提示注入、隐蔽/越权指令、危险命令、供应链风险、欺骗性描述。结果按「技能名 + 内容哈希」缓存,内容没变就不重复调用模型。| 规则代码 | 严重度 | 命中内容 |
|---|---|---|
child-process | 高 | child_process 的 exec / spawn / fork 等 |
eval | 高 | eval(...) / new Function(...) |
vm-module | 高 | 引用 vm 模块(沙箱逃逸面) |
shell | 高 | shell: true 或命令行拼接(rm -rf / curl / sh -c 等) |
fs-write | 中 | 文件写入 / 删除 |
fs-read | 中 | 文件读取 |
network | 中 | net / dgram / dns / tls / ws / undici 等 |
exfil-url | 中 | pastebin / webhook.site / ngrok / tg bot / onion 等外联地址 |
env-exfil | 中 | 同一文件读取 process.env.* 又有子进程 / 网络外联(疑似凭据外传) |
high-entropy | 中 | 长的高熵字符串(疑似 base64 / 加密载荷,与解码方式无关) |
http | 低 | fetch / axios / request 等 HTTP 请求 |
env | 低 | 读取 process.env.* |
system-info | 低 | 主机名 / 用户 / CPU / 网卡等系统探测 |
obfuscation | 低 | atob / base64 编码等混淆迹象 |
install-script | 高 | package.json 声明安装脚本 |
hardcoded-secret | 高 | 疑似硬编码密钥 / 令牌(AWS / GitHub / Slack / Stripe / OpenAI / PRIVATE KEY 等) |
download-exec | 高 | curl / wget / iwr 管道给 sh / bash / iex 的下载即执行 |
git+ / git: / github: / http(s) / file: / link: / 相对路径 的依赖会被标出;miner / stealer / keylogger / ransomware / trojan / backdoor / infostealer / credential-steal / exfil 等关键词的依赖会被标记。插件通过 dsh.plugin.json 的 entry.inject 和 package.json 的 dsh.client.inject 声明它需要宿主注入哪些服务。本插件把这些声明视作「权限面」来评分:
| 档位 | 说明 | 典型服务 |
|---|---|---|
| 高危 | 可触达模型 / 网络 / 文件 / 进程 / 密钥 / 浏览器 | llm、typert、remote、api、agentDefaultModel 等 |
| 中危 | 未识别的服务,默认按「需人工复核」 | 任何不在上表的服务名 |
| 低危 | 仅 UI / 国际化 / 配置 / 数据流 | locale、slots、ui-settings、renderer 等 |
llm 之类的权限不会误判成红。为提高准确度与性能,扫描会跳过 node_modules、.git、.pnpm,跳过 .map / .d.ts / .min.js,超过 1 MiB 的单个文件与过深目录也会跳过。
malicious → 红;suspicious → 黄(静态已红则保持红);inconclusive → 不低于静态(静态绿则升黄);safe → 绿。AI 审计的判定口径:危险能力本身不等于恶意。它更看重「这个插件自称的功能」与「它实际做的」是否一致——文件管理器读写文件、代码执行器跑命令是本职;但计算器偷读 SSH 密钥、无名新包外联回传,才是真正的恶意信号。
问:有些插件的 npm 声誉栏显示「npm 未收录该包名」,是出问题了吗?
不是。本地 link: / file: / GitHub 直连安装、或未发布到 npm 的包,npm 侧本来就没有记录,这是预期行为。AI 审计会以「声誉信息缺失时不臆造」的原则处理。
问:绿色就一定安全、红色就一定是恶意吗?
不是。这是事后检测 + 静态分析的组合,会有误报和漏报。请结合 AI 结论与人工复核后再做决定。
问:SafeSkill 扫描和 AI 审计有什么区别?
SafeSkill 是微步在线的外部多引擎扫描平台,提供独立第三方判定——偏重「这个技能文件是否已知恶意 / 可疑」。AI 审计是本插件调用 DSH 默认模型的内部审计,偏重「插件代码 + 安装链 + 声誉」的综合判断。两者互不依赖、可同时使用。
问:SafeSkill 没额度了怎么办?
用每个技能旁的「AI 审计」按钮。它调用 DSH 默认模型在本机审查该 Skill 的完整内容,不消耗 SafeSkill 额度,也不需要配置 API Key;结果按技能内容哈希缓存,内容未变不会重复调用模型。两者判定维度不同(SafeSkill 偏「是否已知恶意」,AI 偏「指令与自称功能是否一致」),建议互为参考。
问:插件显示已加载,但设置里找不到「插件安全体检」页面?
这是装载行的 name 写成了裸名 dsh-plugin-guard 导致的:dsh-client-modules 会把该字符串与解析到的 package.json 的 name(即 @guojin-ai/dsh-plugin-guard)做严格相等比对,不匹配时静默丢弃客户端 bundle——主机端照样加载(所以在插件列表里看得到),但设置页永远不会出现,且日志里没有任何报错。
检查并修正 $DSH_HOME/profiles/<profile>/cordis.patch.yml(或本插件自带的 cordis.patch.yml)中该行的 name:
- insert:
- id: dsh-plugin-guard # 稳定标识,保持不变(用于 disabled 定位)
name: '@guojin-ai/dsh-plugin-guard' # 必须与 package.json 的 name 完全一致
同时,客户端 bundle 必须用同一个包名注册(build.mjs 已从 package.json 读取,不会再漂移)。改完重启 dsh web(客户端 bundle 与装载行都在启动时组合,热更新不覆盖这两处)。
问:DSH 升级到 0.2 后,插件列表里显示「启动失败」?
插件在 0.3.2 之前的版本会在 DSH 0.2.x 上启动失败,报错:
typert: dsh-plugin-guard#guard/getReport result strict codec has no create() factory
原因是 DSH 0.2 改了 Typert 协议里 strict codec 的字段:0.1 直接把校验器实例放在 schema,0.2 改成工厂函数 create(边界解码时调 codec.create().parse(value))。两个版本各自只认自己的字段——0.1 形状的 codec 在 0.2 上抛错,0.2 形状的在 0.1 上也抛错。0.3.2 起由 contracts.ts 里唯一的 strict() 辅助函数同时产出两个字段(工厂带记忆化),因此同一份发布产物在 0.1.5 与 0.2 上都能加载。升级即可:
dsh plugin --profile <profile> add @guojin-ai/dsh-plugin-guard@latest
然后重启 dsh web。若仍失败,请贴出启动日志中 dsh-plugin-guard 那一行——它会带上完整堆栈。
import() 时已经执行的代码。