news 2026/11/5 3:21:50

dsh-market 插件市场安全机制完全指南:请求围栏、allowBuilds 拦截与零遥测

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
dsh-market 插件市场安全机制完全指南:请求围栏、allowBuilds 拦截与零遥测

dsh-market 插件市场安全机制完全指南:请求围栏、allowBuilds 拦截与零遥测

【免费下载链接】dsh-marketThe plugin market inside DeepSeek Harness — browse, search, one-click install · DSH 可视化插件市场项目地址: https://gitcode.com/gh_mirrors/ds/dsh-market

dsh-market 是 DeepSeek Harness 内置的可视化插件市场,支持浏览社区目录并一键安装。本文拆解它的三层安全设计:同源 POST 请求围栏、pnpm allowBuilds 构建脚本拦截、零遥测下的凭据流向,读完即可在安装插件前确认每道边界。

结论:任何会改变本机状态的请求,必须先过「同源 + 回环 + 注册表白名单」三道校验;安装阶段能执行的代码被 pnpm 默认挡住,放行只接受逐包显式授权;市场自身不主动外联,凭据用完即弃、不落盘。

插件市场听起来只是「商店 UI」,但 dsh-market 运行在宿主进程内部:路由注册在宿主 Web 服务器上,安装插件时会在你的 profile 目录里真实执行pnpm、dsh plugin、git命令。SECURITY.md 的原文:

It runs shell commands (pnpm,dsh plugin,git) against the user's own profile, by design — that is what installing a plugin is.

也就是说它同时持有三类能力:接收 HTTP 请求、读写 profile 文件、执行 Shell 命令。下文按「谁能发请求 → 请求进来后发生什么 → 数据与凭据流向哪里」三个问题展开。

谁能对插件市场发请求?同源 POST 与回环校验

市场没有自己的登录,请求能否触发安装由 src/http.ts 的sameOrigin校验决定。src/routes.ts 的开篇注释直接给出理由:

Security: the install route executes a shell command, so it accepts only same-origin POSTs and only sources present in the curated registry.

规则:跨站页面无法驱动安装

  • 所有改变状态的路线(安装、卸载、更新、放行构建、重启等)必须 POST 且通过同源校验,失败一律 403untrusted origin
  • Origin 存在时,必须与 Host 一致;Origin: null(沙箱 iframe、data:文档)和空 Origin 一律拒绝;浏览器标记sec-fetch-site: cross-site的请求直接拒绝
  • Origin 缺失(非浏览器客户端、Desktop 构建的内置代理会剥掉它)则放行——因为非浏览器客户端本就能伪造任意 Origin,这条规则只拦「页面」

对你的实际影响:攻击者的网页无法「遥控」你本地的安装端点;误开一个恶意页面不会触发任何安装。宿主若开启了登录,市场路由还会先经过宿主自己的请求门(refuseUnadmitted),无会话的请求在读取阶段就被拦下,市场不自建第二套登录。

实现:Host 必须指向回环,堵住 DNS Rebinding

Origin === Host并不足够:DNS Rebinding 攻击中,攻击者让自己的域名解析到 127.0.0.1,此时 Origin 与 Host 恰好相等。所以校验额外要求 Host 必须是回环地址(127.0.0.1/localhost/[::1]),见loopbackAuthority(src/http.ts)。

宿主跑在反向代理、隧道或局域网主机名后面时,纯回环规则会让所有变更路线 403。市场的答案是「声明式权威」:只有写进部署配置(如dsh web --trusted-host)的主机名进入可信列表,未声明的名字照旧拒绝。

请求进来后发生什么?注册表白名单与 pnpm 构建脚本默认拦截

过了请求围栏只是第一步。进入安装逻辑后,还有两层「不执行不该执行的,不写不该写的」。

规则:安装来源只认精选注册表

  • 安装目标只能来自精选注册表(awesome-dsh-plugin 目录)里的条目:npm 包、预构建 tarball 或 git 来源;目录之外的一律拒绝(src/registry.ts)
  • 目录每次请求实时拉取,没有打包内置的快照兜底——README 的说法是,对每日增长的目录,过期答案「不是降级,而是错误」
  • 变更路线的请求体上限 4 KiB,包名按严格的 npm 命名规则校验,非法名字直接 400/404,..这类穿越文本进不了后续路径拼接

对你的实际影响:绕过前端手工构造请求,也无法让市场安装目录之外的任意包。「在目录里」是审核边界而非信任保证,README 同样标注 Listing ≠ endorsement。

规则:pnpm allowBuilds 构建脚本默认拦截策略

恶意代码常藏在postinstall这类构建脚本里。dsh-market 的做法是依赖 pnpm ≥10 的原生机制:不在白名单里的包,构建脚本一律不执行,安装结果会报出被拦截的包名。

确实需要放行时,市场 UI 的「放行构建脚本并重试」会把具体那个包写进 profile 的pnpm-workspace.yaml的allowBuilds块(setAllowBuilds,src/profile.ts)。写入前有严格的形式校验,源码注释写得很直白:只接受 npm 包名、git 克隆地址键、固定 commit 的压缩包地址三种形态,「What may be written, and nothing else」——不允许把任意文本塞进会被 pnpm 解析的配置文件。

如何验证 allowBuilds 是否生效:打开 profile 目录的pnpm-workspace.yaml,allowBuilds块里应当只有你显式放行过的包;若市场 UI 再次弹出拦截列表,说明那个包仍未在白名单内,拦截仍然有效。

数据与凭据会流到哪里去?零遥测与备份边界

零遥测:市场从不主动外联

  • 没有账号、没有官方服务器、没有埋点。隐私页 的表述:插件不会把关于你的任何信息发到任何地方
  • 市场唯一的网络行为是按需拉取精选目录,以及你明确发起的安装、下载、备份
  • Gist 备份的 token 每次操作粘贴(或宿主环境变量提供),用完即弃,源码注释明确「Tokens are never persisted」(src/gist.ts);带 token 的请求直连api.github.com,不经过任何公共加速服务
  • 「导出日志排障」同样是脱敏的:主目录路径与凭据形状被打码(src/log-redaction.ts),日志只留在本机,由你自己决定是否分享

对你的实际影响:这个市场不构成你的数据外泄通道,它也不持有任何长期凭据。

备份:目标受校验,凭据不落盘

  • WebDAV 备份仅 https;目标域名会先做 DNS 解析,指向私有或保留地址(内网段、169.254.169.254等)直接拒绝,防止同源脚本借它打通内网;密码永不存进浏览器(src/backup.ts)
  • 备份可能包含 profile 配置里的凭据,因此导出与上传前 UI 会明确警告
  • Gist 通道的 API 主机硬编码为api.github.com,不存在用户输入 URL 的注入面,Gist ID 也按严格字符白名单校验

边界与例外

设计点具体规则为什么这么定
一键重启要求直连回环客户端,带forwarded/x-forwarded-for的请求一律拒绝;原样复现 DSH 入口、参数、环境、工作目录(src/restart.ts)重启端点近似进程级控制,代理无法证明请求「就是你本人」
托管环境宿主是 systemd 服务主进程时重启按钮自动隐藏;pm2 / launchd 需显式allowRestart: false否则连宿主带 cgroup 一起杀掉,服务起不来
WebDAV 备份仅 https;私有/保留地址拒绝;密码不存浏览器用户输入 URL 不能成为内网探测通道
Gist 同步token 不落盘;请求直连api.github.com无长期凭据,主机固定消除注入面
Origin: null/ 空 Origin一律拒绝沙箱 iframe、data:文档无法解析,不能证明同源
终端/CLI 类插件安装进 web profile 前在确认框打标提醒终端界面在 web profile 里不生效,需提前告知

📋 60 秒自查

  1. 安装前核对来源:确认插件卡片的来源、作者、star 数与精选注册表一致;终端/CLI 类插件带醒目标记,目录之外的包市场根本装不了
  2. 检查构建授权:安装提示 allowBuilds 时,打开 profile 的pnpm-workspace.yaml核对已放行的包,逐包放行;该文件里应当只有你主动加过的条目
  3. 管好重启权限:DSH 跑在 systemd / launchd / pm2 下时,在 profile 的 patch 里config:下写allowRestart: false(不能写在顶层),随后/dsh-market/status返回"restart": false即为生效:
- id: dsh-market config: allowRestart: false

请求围栏决定「谁能让它动」,白名单与构建拦截决定「它能做什么」,零遥测决定「数据去哪儿」——下次点安装前,把这三层边界对一遍即可。更完整的说明见 README.md 的 Security 章节、SECURITY.md 的漏洞报告指南与 site/privacy.zh.html 的隐私说明。

【免费下载链接】dsh-marketThe plugin market inside DeepSeek Harness — browse, search, one-click install · DSH 可视化插件市场项目地址: https://gitcode.com/gh_mirrors/ds/dsh-market

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/5 3:17:59

Linux系统log日志简单清理

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/5 3:16:10

ADS122U04IPWR与PIC18F86J15的工业级RTD温度采集方案详解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/5 3:15:58

ADS122U04IPWR+STM32F765ZI工业温度测量系统设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/5 3:15:54

基于ADS122U04与STM32F401RB的高精度分布式温度采集方案设计与实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华