中文EN

dsh-trust-check

security已测通过npmMIT

DSH 插件静态能力披露:设置页与 CLI 列出已装插件的权限能力、字面量去向、安装脚本与注入形态(prompt 注册、自带 skill 文本、bundle patch),每条附文件:行号证据。代码判定、可复现、零 token。只做披露,不做安全承诺,不判定恶意。

下载量 / Downloads
18,709
依赖体积 / node_modules
2.03 MB
测试时间 / Tested
2026-11-06

安装

dsh plugin --profile web add dsh-trust-check

沙箱测试结果

阶段结果
1 安装✓
2 列装✓
3 挂载—
4 启动—

四阶段在隔离沙箱里跑:安装(有网)→ 列装 → 挂载 → 启动(后三步断网)。

README

dsh-trust-check

![Awesome DSH Plugin](https://awesome-dsh-plugin.com)

![npm version](https://www.npmjs.com/package/dsh-trust-check)

![npm downloads](https://www.npmjs.com/package/dsh-trust-check)

[English](README.en.md)

DeepSeek Harness 插件静态能力披露:权限、注入、来源、安装脚本——代码判定、可复现、零 token。

把插件会碰什么、注入了什么、来源能否核对摊开,每条附证据(文件 + 行号 + 片段),供你复核。只报告检测到的事实,不做安全背书,也不做安全推断;是否拦截或继续使用由集成方与用户决定。详见 [产品定位与边界](docs/POSITIONING.md)。

安装

设置页需要 dsh ≥ 0.1.0-rc.8(建议 0.1.1-rc.2)。 Web UI 依赖宿主模块表里的 @deepseek-ai/dsh-client-store;市场不会拦不匹配的升级,老宿主上装了设置页也会加载失败(dsh-client-store missed the module table)。

CLI 不依赖 DSH 宿主,旧 dsh 上仍可用 npx dsh-trust-check。

先确认宿主(只影响设置页):

dsh --version
# 过旧则:npm i -g @deepseek-ai/dsh@latest
dsh plugin --profile web add dsh-trust-check

重启 dsh web,打开 设置 → 插件体检。已安装要升级:市场一键更新,或 dsh plugin --profile web add dsh-trust-check@latest,再重启。

同时提供独立 CLI,不依赖 DSH 宿主:

npx dsh-trust-check                 # 审计默认 profile `web`(默认紧凑中文)
npx dsh-trust-check --profile work  # 审计其他 profile
npx dsh-trust-check --verbose       # 展开每个插件的全量细节
npx dsh-trust-check --lang en       # 英文人读输出(LANG=en* 时也会默认英文)
npx dsh-trust-check --no-color      # 关闭 ANSI(管道默认无色;TTY 可用 --color 强制)
npx dsh-trust-check --json          # 机器可读输出

# 审计任意已解压的包目录(无需 profile、无需 DSH)
npx dsh-trust-check --dir ./path/to/plugin
npx dsh-trust-check --dir ./pkg --spec npm:foo@1.0.0 --json

# 用退出码做脚本 / CI 闸门(可选)
npx dsh-trust-check --dir ./pkg --exit-code

--dir 与 --profile 互斥。两种模式的 --json 输出同为 AuditResponse 形状 { schemaVersion, profile, dir?, generatedAt, plugins, errors };单目录模式下 profile 为空字符串,dir 为绝对路径。详见 [docs/audit-schema.md](docs/audit-schema.md) / [docs/INTEGRATION.md](docs/INTEGRATION.md)。

默认退出码始终为 0。加 --exit-code 后:0 本次静态扫描未检出(profile 模式含已确认),1 需确认,2 有红线,3 扫描失败;profile 模式取所有插件中最严重的一项。未检出不是安全背书。 参数写错(未知参数、--dir 等缺值)会直接报错并以 1 退出。

设置 → 插件体检 · 展开复核

![设置页总览](docs/overview.png) · ![展开复核与证据](docs/review.png)

问题反馈 · AI 解读

![反馈检测问题](docs/feedback.png) · ![AI 解读](docs/AI_read.png)

CLI --dir --json

![CLI JSON 输出](docs/cli.png)

排障

碰到 · 怎么处理

设置页 dsh-client-store missed the module table · 宿主过旧:先升 dsh ≥ 0.1.0-rc.8,再重启 Web;审计可先用上面的 CLI

设置里没有「插件体检」 · 确认已 add、已重启;或宿主太旧导致客户端未加载

怎么读报告

设置页为单列卡片,同一时间展开一张。

1. 顶部:一句话定位 + 总览(如「10 个插件 · 3 需确认」)。带颜色的总览条目可点,跳到该类第一张卡。

2. 收起态:名称、版本、状态徽章、来源;能力细节点开后再看。

3. 展开后:发现与动作说明 → AI 解读(若已生成)→ 能力 / 去向 / 路径 / 密钥 / 注入 / 来源 → 证据 → 扫描限制 → 底部确认条。

4. 与上次确认不一致时:右上角显示「需重新确认」;能力有增减时,标题下出现 +能力 / −能力 小标签。

5. 确认:在卡片底部,把当前指纹写入本机确认记录,供下次扫描对比。

CLI 打印同一套事实,版式独立于设置页。默认紧凑:需处理项用圆角卡片展开(软换行,宽度跟终端走),并在「为什么要小心」下附证据摘录;expected / clear 一行带过。TTY 下带颜色,--no-color / NO_COLOR 可关。加 --verbose 看全量。机器集成(市场目录、CI)请用 --json,不要解析人读输出。

裁决 · 含义 · 何时出现

有红线 · 命中硬红线。先复核具体事实;了解后可「确认风险」继续 · redLines 非空,且未确认当前指纹

风险已确认 · 已确认当前红线风险 · 有红线,trust-ack.json 与本次扫描一致

需确认 · 未见硬红线,但有特权能力或 patch 改动 · 有能力或 override/disable,无红线

需重新确认 · 以前确认过,但本次扫描与上次不一致 · 有确认记录,指纹已变(可能来自升级、结果变化或规则更新)

能力如预期 · 已确认当前能力与去向指纹 · trust-ack.json 与本次扫描一致(无红线)

未检出项目 · 未见红线或特权能力 · 其余

score / summary 留在 JSON 供排序与集成;设置页不展示。注入 token 估算只在「注入」折叠标题旁作成本参考(有值才显示)。

形状层(代码判定)

除能力芯片外,报告还会从源码中提取三类字面量事实:

  • 字面量去向:URL / host / IP。同源 HTTP 相对路由(如 /dsh-market/check)不算去向。每条去向带用法标签(请求参数、仅比较、XML 命名空间、链接、赋值/配置、用途未知)和 文件:行号。标签只帮助判断,不改变能力、红线或分数。
  • 工作区外路径:绝对路径、家目录、路径穿越等。
  • 密钥触摸:路径、敏感 env 名。

表示源码里出现了该字面量;运行时拼接的 URL 看不到(模板 URL 的 ${…} 若在主机名之后,或紧跟在完整的带点主机名后面(` https://api.github.com${path} ),主机名仍会记为去向;${…}` 出现在主机名写完之前则看不到)。字面量本身不做安全推断。

白名单:常见托管/registry 域名(GitHub、npm、npmmirror、腾讯云镜像等)、DSH 精选目录与 GitHub 代理、常见模型厂商 API(DeepSeek、OpenAI、Anthropic、Google Gemini)。命中白名单的条目默认收起并附简短说明;明文 HTTP 永远不会因白名单降级。

降噪与截断:

  • 跳过网络对齐的 CIDR 表行(如 ["10.0.0.0", 8]、inRange(a, "10.0.0.0", "10.255.255.255"));["8.8.8.8", 32] 这类主机路由仍记为字面量 IP。不因行内出现 PRIVATE_RANGES / CIDR 字样、或同行两个 IP 就整行跳过。
  • 跳过 RFC 5737 文档例网(192.0.2.0/24、198.51.100.0/24、203.0.113.0/24),以及 0.0.0.0 / 255.255.255.255(绑定/广播,非单播出站)。
  • 跳过 http://local / http://dsh.invalid 一类占位 base、RFC 2606 的 .example / .invalid / .test、cmd 开关(/c)等误判噪音。
  • 注释在扫描前被抹掉,JSDoc 里的示例 URL 不算去向(打包产物通常保留注释)。
  • xmlns="http://www.w3.org/2000/svg"、pdf.js 的 http://www.xfa.org/schema/…、http://ns.adobe.com/xdp/ 一类命名空间标识按主机名精确排除——攻击者注册不到这些域名,这条豁免无法被借用。只有带路径的字面量才豁免:不带路径的 "http://www.w3.org" 后面拼上任何内容都会变成别的主机,所以仍记为去向。
  • 打包进来的格式库里,少数完整 URL 只是标识而非请求(Apple plist 的 DTD http://www.apple.com/DTDs/PropertyList-1.0.dtd、ID3 的 http://musicbrainz.org),按整串字面量精确排除;同主机的其他路径、子域名,或字面量后面紧跟 + / .concat( 拼接,仍记为去向。不带路径的 http://musicbrainz.org 只在作为 == / === / != / !== 的比较对象时豁免。
  • 超出上限时按风险高低截断,明文 HTTP 与字面量 IP 不会被无害地址挤掉。
  • 密钥路径只认无空白的路径形引号串("~/.ssh/config"、"/Users/x/.ssh/config"、'.ssh/config'、"~/.aws/credentials")或 /id_rsa、~/.netrc 等路径形态;UI 文案("Uses … ~/.ssh/config when empty")、deny-list 正则、startsWith('id_rsa')、裸 '.ssh' 不算凭据访问。

记为预期

在设置页确认「这些能力符合我装它的目的」后,指纹写入当前 profile 目录下的 trust-ack.json(通常是 ~/.dsh/profiles/<profile>/;DSH 桌面版由宿主决定目录)。升级后能力、去向、工作区外路径、密钥触摸、红线或技能正文(按内容哈希,而不是字节数)任一变化,都会要求重新确认。确认请求必须带上当前报告的 ackFingerprint;内容已经变化时返回 409,并提示重新确认。没有 digest 的旧确认一律失效。确认红线走单独的「确认风险」按钮,而且只在指纹一致之后才接受。

AI 解读:阅读辅助,可从确认条打开。用 DSH 已配置的模型解释报告摘要;未配置模型时不可用。生成结果保存在本机;插件版本、检测结果或界面语言变化后需重新生成。

反馈检测问题:每条证据可以生成一份草稿;插件详情里另有入口,用来报漏报或说明不清楚。草稿留在页面内存。误报和说明问题会打开检测反馈的 Markdown Issue 编辑器,并带上你改过的标题和正文,由你提交。漏报默认打开 SECURITY.md 里的私密报告页;标明为普通规则缺口、且不含可利用绕过时,才出现公开 Issue。

红线(有则默认应挡住)

1. 声明 install / postinstall / preinstall 安装脚本(不含 prepare:prepare 只在 pack/git 安装时跑,记为扣分,不是红线);

2. cordis.patch.yml override / disable 了 @deepseek-ai/* 核心 bundle(匹配 id 或 name);

3. 读到凭据/密钥的值(credentials.resolve

…(truncated)

以上内容来自 npm 上的 README,我们只做格式化,不改内容。

版本

npm 上共发布:21,最后更新 2026-10-26

链接

GitHub · Homepage · npm

同类插件