先有证据,再谈信任
Harness Trust 评估的是一个固定 commit 下的插件源码快照,不对插件名称、默认分支或未来版本作永久背书。每份报告绑定 Git commit、内容 SHA-256、策略版本与扫描时间;我们发布的是可核对的检测证据,不是安全认证。
为什么 DSH 插件需要专门的检测
DSH 的 bundle 以 Cordis 配置层进入宿主进程:Host 插件可以访问文件、网络、环境变量、凭据、会话、工具注册和 Agent 控制链;Client 插件还会在浏览器中执行。cordis.patch.yml 可以按 id 覆盖 dsh-base 的任何一行——包括 sandbox、approval、credentials。从 GitHub 源码安装时,prepare 脚本在 allowBuilds 授权下于用户机器、沙箱之外执行。模型工具的 sandbox 与 approval 因此不能被当作第三方插件代码的隔离边界。
六层证据,一个判定
来源身份
固定 commit 与内容 SHA-256;用 npm registry 元数据核对包的 repository 字段是否指回同一仓库、包名是否一致、是否有 provenance 证明、Release tarball 是否托管在同一仓库。只用元数据,不下载发布包。
供应链与已知漏洞
安装期生命周期脚本、源码安装的 prepare 构建、未固定的 Git/latest 依赖;有锁文件时解析生产依赖闭包并批量查询 OSV.dev,开发依赖及其传递链不计入。
静态分析
远程脚本直连 Shell、动态代码执行、混淆与载荷隐藏、浏览器注入点与第三方脚本、硬编码凭据(带熵与占位符检测)、同一模块同时接触凭据与网络。每条命中带路径分类(源码 / 测试示例文档 / i18n / 配置)与置信度。
模型辅助研判
对置信度 ≥ 中的高/严重命中,把 ±40 行上下文、bundle patch 与 package.json 交给模型(sonnet),在“已确认 / 占位示例 / 功能所需 / 已清洗 / 未能排除”中选一个并给出理由。模型只能降低置信度或降一级严重度,不能抬升严重度,也不能单独产生 PASS;源码以不可信数据块传入,模型无工具、无会话、强制结构化输出。
DSH 权限语义
解析 bundle 的 cordis.patch.yml:插入了哪些行、按 id 覆盖或关闭了 dsh-base 的哪些行、!!js 表达式做了什么。安全关键 seam(sandbox、sandbox-policy、bash/pwsh-sandbox、approval、permission、credentials、subprocess、shell-env、fs-observation-policy)被覆盖记为高;敏感 seam(system-prompt、agent、llm、tool-*、session-*、settings)记为中。结果以“权限清单”形式展示。
隔离动态探针
在无网络、只读、非 root、去 capability 的容器里安装并加载插件,注入假凭据金丝雀,记录文件、子进程与出站尝试。按需对重点插件运行;未运行时报告显示 not-run,绝不显示为“动态检测通过”。
人工复核与申诉
高/严重发现进入复核队列;作者与用户可对任一发现提出申诉,我们在 72 小时内复核并公开处理记录。确认的恶意行为先通知作者与 awesome-dsh-plugin 维护者,再公开。
判定规则
只有置信度 ≥ 中的发现进入判定(“有效发现”);低置信度命中全部保留在详情页,但不计入结论。判定由最高严重度决定,分数不能抵消阻断项。
| 对外状态 | 内部判定 | 条件 | 安装命令 |
|---|---|---|---|
| 高风险 | BLOCKED / REVIEW | ≥ 1 项有效严重或高等级发现 | 不提供 |
| 存在风险 | CAUTION | ≥ 1 项有效中等级发现,无高/严重 | 提供,并提示先读证据 |
| 未发现问题 | PASS | 当前策略覆盖范围内没有中等级以上有效发现 | 提供 |
| 未知 | UNKNOWN | 源码获取或扫描失败,或尚未扫描 | 不提供 |
风险分数(Critical −35、High −16、Medium −5、Low −1,按去重规则计)只用于同一策略版本内排序。
规则表 · 19 条
| 规则 | 默认严重度 | 层 | 说明 |
|---|---|---|---|
| HT-IDENTITY-001 | 高 | L0 · 来源身份 | npm 包指向其他仓库 |
| HT-IDENTITY-002 | 中 | L0 · 来源身份 | npm 身份无法与仓库对应 |
| HT-IDENTITY-003 | 中 | L0 · 来源身份 | 上游标注的 npm 包不存在 |
| HT-IDENTITY-004 | 高 | L0 · 来源身份 | tarball 未托管在仓库 Release |
| HT-INSTALL-001 | 高 | L1 · 供应链 | 安装期生命周期脚本 |
| HT-INSTALL-002 | 中 | L1 · 供应链 | Git 安装期 prepare 构建 |
| HT-SUPPLY-001 | 中 | L1 · 供应链 | 未固定依赖引用 |
| HT-VULN-001 | 高 | L1 · 已知漏洞 | 依赖已知漏洞(OSV) |
| HT-EXEC-001 | 低 | L2 · 静态分析 | 直接创建宿主子进程 |
| HT-EXEC-002 | 严重 | L2 · 静态分析 | 远程内容直连 Shell |
| HT-RUNTIME-001 | 高 | L2 · 静态分析 | 动态代码执行 |
| HT-OBFUSCATION-001 | 高 | L2 · 静态分析 | 混淆或载荷隐藏 |
| HT-CLIENT-001 | 中 | L2 · 静态分析 | 危险 HTML 注入点 |
| HT-CLIENT-002 | 高 | L2 · 静态分析 | 第三方浏览器脚本 |
| HT-SECRET-001 | 严重 | L2 · 静态分析 | 疑似硬编码凭据 |
| HT-DATA-001 | 高 | L2 · 静态分析 | 凭据与外部网络组合 |
| HT-CONFIG-001 | 低 | L3 · DSH 权限语义 | Cordis !!js 表达式 |
| HT-PERMISSION-001 | 高 | L3 · DSH 权限语义 | 覆盖安全关键宿主行 |
| HT-PERMISSION-002 | 中 | L3 · DSH 权限语义 | 覆盖敏感宿主行 |
每条规则都有 adjust 逻辑:同一个命中出现在测试、示例、文档、i18n 文案里,或被识别为占位符、展示给用户的提示字符串、已清洗的注入点时,置信度会降级;出现在安装脚本、子进程调用附近或伴随解码/执行模式时,置信度会升级。
置信度
- 高 — 结构性或经模型确认的命中:覆盖安全关键 seam、安装脚本里的 curl | sh、高熵密钥、javascript-obfuscator 标识符。
- 中 — 可执行源码中的启发式命中,执行路径需要人工确认。
- 低 — 位于测试/示例/文档/i18n,或被判定为占位、提示文本、已清洗;保留展示,不计入判定。
数据源与覆盖范围
收录范围来自社区维护的 DSH 插件精选索引(当前 1,837 条),我们不自行收录、不排名、不评判插件质量。上游的 Star、npm 周下载、收录日期只用于发现与排序。身份核对使用 npm registry;已知漏洞使用 OSV.dev。
每日对 HEAD 有变化的仓库增量重扫;策略升版时全量重扫。状态变化(例如 PASS → REVIEW)会记录在插件时间线与全站变化页。
已知限制
- 正则与语义启发式可能误报或漏报;模型研判可能出错。置信度表示命中是否真实,不表示风险是否可接受。
- npm 发布包与仓库源码的一致性尚未比对;用户实际安装的是发布包。
- 隔离动态运行与人工复核未对报告默认执行。
- 危险能力可能正是插件功能所需;权限清单与能力标签描述的是范围,不是结论。
- 结论只对固定 commit 与策略版本有效。
申诉与纠错
任何发现都可以申诉:在插件详情页点击“提交申诉”,或在 GitHub 上开 issue,注明插件、commit 与 finding 哈希。我们在 72 小时内复核,并把处理结果写入报告的 humanReview 字段。