dsh-trust-check
Static capability disclosure for DeepSeek Harness plugins: a Settings page and CLI that list installed plugins' capabilities, literal destinations, install scripts, and injection shapes (prompt registrations, shipped skill text, bundle patch), each with file:line evidence. Code-determined, reproduci
Install
dsh plugin --profile web add dsh-trust-check
Sandbox test results
| Stage | Result |
|---|---|
| 1 install | ✓ |
| 2 list | ✓ |
| 3 mount | — |
| 4 boot | — |
Four stages run in an isolated sandbox: install (network on) → list → mount → boot (last three with no network).
README
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 退出。
设置 → 插件体检 · 展开复核
 · 
问题反馈 · AI 解读
 · 
CLI --dir --json

排障
碰到 · 怎么处理
设置页 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)
Rendered from the README published on npm. Formatted only, not edited.
Versions
Published on npm::21,最后更新 2026-10-26