ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

dsh-plugin-shop 如何挡住恶意插件?typosquatting 与供应链攻击防御机制全解析

dsh-plugin-shop 如何挡住恶意插件?typosquatting 与供应链攻击防御机制全解析

【免费下载链接】dsh-plugin-shop

The most comprehensive DeepSeek Harness plugin market — refreshed daily, sourced across the Internet, reviewed before publishing.

项目地址:https://gitcode.com/gh_mirrors/ds/dsh-plugin-shop
点击查看免费下载

dsh-plugin-shop 是面向 DeepSeek Harness 的开源插件商店,它每天自动从 npm 和 GitHub 发现候选插件,并在上架前逐一执行安全审查。本文解析它如何拦截 typosquatting(名称仿冒)插件、防范供应链攻击,以及"版本钉住 + 内容哈希 + 安装确认"这套多层防御机制的具体设计。

先认识这个"门禁":每日构建的五道检查

dsh-plugin-shop 的目录构建代码位于registry/,每个候选插件都必须通过 gate.ts 中的一系列准入规则,任何一道检查不通过都会被记录到公开构建报告中,并附带作者可读的拒绝原因(共十七种预定义拒绝码)。

核心检查包括:

  • 可安装性:声明了有效的dsh.bundle,否则只是普通库而非插件;
  • 可审查性:必须有 license 和可访问的源码仓库;
  • 可信度:校验dist.integrity哈希、发布时间戳,并拦截潜在误导性名称;
  • 可展示性:有有效的dsh.catalog或 npmdescription;
  • 大小预算:单个条目最多 12 KiB 字节,防止恶意作者用超长字段撑爆目录文件。

typosquatting 门禁:名字差两个字符就会被"扣下"

typosquatting 是插件市场最常见的攻击:攻击者注册一个与知名插件仅差一两个字符的包名,诱导用户装错。dsh-plugin-shop 在 gate.ts 中实现了专门的相似度门禁(similarity hold):

  1. 对每个候选包名,计算它与verified.yml中所有已验证名称的编辑距离(Levenshtein distance);
  2. 距离 ≤ 2(阈值常量SIMILARITY_THRESHOLD = 2)的候选不会自动上架,而是被扣下等待人工裁定;
  3. 人工裁定后二选一:放行写入 allowed-similar.yml(仅解除相似性扣压,不授予信任等级),或加入黑名单 denied.yml。

值得注意的是,GitHub 渠道的门禁 repo-gate.ts 会同时探测仓库 slug 和 bundle 名称,防止攻击者换个仓库名绕过。官方设计文档中甚至有一条示例:dsh-hllo-plugin(少了个 e)会被直接拒绝,理由标注为 "possible typosquat of dsh-hello-plugin",见 设计文档。

供应链攻击防御:审查只钉住"精确版本"

这是本项目最核心的信任设计,实现在 tier.ts:

渠道审查钉住的对象换掉之后
npmreviewedVersion(精确版本号)任何更新或更旧版本都降级为verified-stale
GitHub 仓库仓库 +reviewedCommit(精确 commit)推送新 commit 即降级
Release 救援tarball 的reviewedSha256(内容哈希)tag 可被删除重建,所以只认哈希

设计动机写得很直白:如果把信任绑在"包名"上,作者发布一个恶意新版本就能自动继承旧版本的信任。因此信任从不跨身份迁移——npm 审查对 GitHub 同名的 fork 无效,反之亦然(实测中有 177 个名称被多个条目共享,dsh-skill-manager一个名字就有 14 个仓库在争用,见 install.ts 注释)。

目前 verified.yml 为空,即没有任何插件通过人工审查,整个商店都是community等级——这是项目刻意保持的诚实姿态,详见 SECURITY.md:"community 只表示没有人审过代码,不是合格证书"。

内容完整性校验:多源 + sha256

本地商店 catalog.ts 加载目录时还会做完整性校验:

  • 目录数据文件名本身就是内容哈希:plugins.<sha256>.json;
  • 同时向多个源(配置的 npm registry、npmmirror、GitHub Pages 等)并发请求,取第一个且 sha256 与 index 中登记一致的响应,哈希不匹配直接抛错拒用;
  • 目录中还记录每个插件的 SRI 完整性哈希(dist.integrity),gate.ts 会严格校验其必须符合 SRI 格式,防止作者注入异常值污染快照。

此外,每天构建后生成的manifest.lock快照会提交到 Git,所有目录变更可逐条追溯。

最后一道墙:安装门禁与人工确认

即使插件已上架,安装时还有第二道闸门,同样是纯函数,实现在 install.ts:

  • needs-acknowledgement:非verified等级的插件,每次安装都必须用户显式确认(也就是下图那个确认弹窗的来源);
  • version-mismatch:请求版本必须与目录中钉住的版本完全一致;
  • ambiguous-identity:同名插件有多条时拒绝猜测,防止装错身份;
  • name-taken:同一 profile 内同名插件不会被静默覆盖;
  • denied:命中黑名单直接拒绝。

黑名单与恶意插件处置流程

denied.yml 是永久性黑名单,每条都附带人工记录的拒绝原因和可选的合法替代品。发现目录中混入恶意插件时,应通过 SECURITY.md 描述的私有渠道报告(不要开公开 issue 或 PR),确认后会写入denied.yml,且条目永久有效——黑名单同时按包名和声明的仓库两个维度匹配,防止作者换个渠道发布同一段代码。

小结:防御体系一览

层次机制针对的攻击
发现层关键词自动发现 + 每日构建 + Git 留痕未知来源混入
审查层typosquatting 相似度门禁(距离 ≤ 2 扣压)名称仿冒
信任层审查钉住精确版本 / commit / sha256恶意新版继承信任
完整性层多源并发 + sha256 校验 + SRI 格式检查中间人 / 目录投毒
安装层非 verified 强制确认 + 版本匹配 + 身份消歧误装 / 装错同名包
处置层denied.yml 永久黑名单 + 私有报告通道存量恶意插件

需要提醒的是:dsh-plugin-shop 不提供沙箱隔离,插件加载后拥有完整的运行时权限,商店的职责是"上架前挡住明显的恶意与仿冒",最终信任决策仍在用户手中。

更多设计细节可参阅 docs/design/ 目录下的设计文档与 registry/ 目录下的审查管线源码。

【免费下载链接】dsh-plugin-shop

The most comprehensive DeepSeek Harness plugin market — refreshed daily, sourced across the Internet, reviewed before publishing.

项目地址:https://gitcode.com/gh_mirrors/ds/dsh-plugin-shop
点击查看免费下载

相关推荐

上一篇:在 TensorFlow.js 中运行 TensorFlow Decision Forests 模型:tfjs-tfdf 使用与实现指南
下一篇:CANN ops-math 算子指南:aclnnCumprod 与 aclnnInplaceCumprod 累积乘积接口原理与调用实战

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进