本文件记录 dsh-essential-tools 的安全设计、已落实的缓解措施与已知边界(面向开源发布与使用者)。
- 模型工具(
det_global_plugin_*)只能作用于当前会话(工具执行上下文exec.agent即调用会话),档位(全局启用/可自行启用/需审批/不再会有新启用/全局禁用)在宿主侧强制执行,客户端不可绕过;审批路径复用 DSH 动态 Cordis 审批,awaiting-approval后模型侧被禁止重试。 - 设置页(typert 端点)为本机单用户 GUI 能力面:接受任意 sessionId 是产品语义(用户手动在任意会话启用/停用),无多用户/多租户概念;所有写操作(档位/删除/启用)均有确认与可读错误。
- 已修复:
verProgDelete/verProgRestore的版本 id 现在经过白名单校验(^[A-Za-z0-9_-]{1,64}$)且必须存在于清单,杜绝rmdir /s /q ..\..\X式目录穿越删除/任意目录读取回写。 - 已知边界:全局插件代码与动态 Cordis 插件一致,以当前进程真实权限运行;DSH 官方对动态代码的沙箱仅防误用,不是安全边界(官方文档口径)。设置页/工具均明示此口径。
- 引入通道:① 从对话 Cordis 拉取(代码本就在本进程执行过,无新增暴露面)② URL 下载 ③ GitHub 商店安装。所有通道均:
- 大小上限(host/client ≤ 512KB 字符)、名称/描述长度限制、非 JSON 单文件滚动告警;
- 安装/下载前安全提示 + 确认(明文说明"以当前进程权限运行");
dsh-plugin.json清单 /plugin/host.js+plugin/client.js约定格式;商店安装记录 commit sha(originRef = repo@branch@sha)供溯源;- 可疑特征扫描(
scanCodeWarnings,黑名单启发式:eval/new Function、child_process、exec、process.env、require 逃逸、原始 socket/http.request、fetch、Cookie/localStorage、base64 混淆、遥测上报、疑似硬编码密钥sk-、超长单行混淆)——结果在 安装/下载返回提示 与 设置页「预览代码」 展示。
- 已知边界:黑名单启发式不是安全边界(无法证明无恶意行为);真正边界 = 用户审批 + 信任来源 + 官方沙箱不可靠假设。不提供任何"加白/签名"升级前,请只启用你审查过/信任的代码。
- 重复「拉取/下载/安装」同一插件不再清空既有档位与各会话启用映射(
upsert保留level/sessions,仅更新代码与元数据;兼容早期gp-gp-*前缀数据)。 - 版本快照 id 统一白名单;未配置工作区(默认值中性化后)各端点返回明确错误而非落到进程 CWD。
- 其余已知薄弱点(已记录、供后续改进):启停后再启会产生新 Cordis 插件实例(旧的停止的残留在会话清单,属噪音)、
gpSync恢复依赖会话打开时机、设置页"本会话启用"状态在会话切换间可能短暂滞后。
- SSRF 防护(新增):所有宿主网络抓取(下载 URL、清单
hostUrl/clientUrl、GitHub 内容 API)经safeHttpUrl:仅 http/https、拒绝 URL 内嵌凭据、拒绝私网/环回/链路本地/云元数据(含 IPv4 保留段、IPv6::1/ULA/link-local、::ffff:映射的点分与十六进制形式、localhost/.local/.internal/.localhost);重定向手动跟随、每一跳复验、最多 5 跳。 - 余额/定价只访问官方主机(
api.deepseek.com/api-docs.deepseek.com),并校验最终响应主机仍为官方(防重定向劫持)。 - 凭据:API key 仅由宿主解析(配置 → DSH 凭据缝 → 环境变量),只存在于请求头;不落盘、不进日志、不返回浏览器/客户端;错误提示只含引用名(如
DEEPSEEK_API_KEY)。 - XSS:客户端全部经 React 渲染(无
innerHTML/dangerouslySetInnerHTML/jQuery),插件名/描述/摘要/README/官网 note 均为文本节点。 - DoS:fetch 响应大小上限(下载 ≤1MB、GitHub 内容 ≤3MB 传输)、横幅上限、清单/代码上限、搜索结果 ≤15 条、余额 60s / 价格 6h 缓存节流。
- 已知边界:DSH 核心(Web 服务绑定地址、
/api的 Origin/跨域策略、Typert 网关鉴权)不属于本插件——若你的 DSH 暴露到公网/局域网,请另行评估;本机使用模型下插件按"单用户自用"设计。
- 已扫描全仓库(含 git 历史)与机密模式(
sk-…、内嵌 Bearer、api_key=等):未发现任何真实密钥。 - 已中性化:宿主配置默认值中的个人路径(
C:\Users\<用户名>\Desktop\项目\LVAL等)→ 空/占位默认,配合会话 cwd 或cordis.patch.yml显式配置;README 示例本来就用占位路径。 - 凭据实际存放于 DSH 域(
~/.dsh/credentials*.yaml/ 模型设置),不在本仓库;cordis.patch.yml属于用户 profile(~/.dsh/profiles/...),不在仓库内。 - 保留标注:LICENSE 版权行为作者公开署名(
L2959159224,与 npmauthor一致)——属作者有意披露;若不想保留可自行修改。 - 开源前建议(发布侧):发布前
git log -p | grep -i "sk-"复核、启用 GitHub secret scanning、.gitignore已含node_modules/本地数据目录。
verProgDelete/verProgRestore/_restoreVersionById:版本 id 白名单 + 清单存在性校验(路径穿越/任意目录删除-读取)。- 宿主网络抓取:SSRF 防护(私网/环回/元数据/IPv6 映射拒绝、重定向逐跳复验、内嵌凭据拒绝)。
- 全局插件
upsert:重复导入保留档位与会话启用映射;id 规范化兼容旧数据。 - 商店安装记录 commit sha、返回并展示可疑代码扫描结果;新增
gpCode(代码预览 + 扫描)端点与设置页「预览代码」。 - 余额/定价:校验最终官方主机(防重定向劫持)。
- 配置默认值去个人化(中性占位);未配置时端点明确报错,不再落到进程 CWD。
- 客户端
DsModelPrice等仅 React 文本渲染复核(无 unsafe HTML)。