# Security Policy ## 状态与适用范围 本项目当前是未发布的 public Beta 候选。这里描述的是插件与开发者兼容层已经实现的安全边界,不代表 stock DSH 已正式兼容,也不构成对任意服务器环境的安全认证。 ## 威胁模型与信任边界 安全模型包含三个独立主体:运行 UI 的浏览器或 Desktop Renderer、运行插件的 DSH Host,以及通过 SSH 访问的远端服务器。 - DSH Host 是 SSH 凭据、连接配置、`known_hosts`、远程 helper 与执行监督器的信任边界。Desktop 和 Web UI 都不能把浏览器所在机器当成 Host。 - 远端服务器及其 SSH 服务端处于 Host 边界之外。插件固定主机公钥指纹,但不能证明服务器自身没有被入侵。 - Agent 输出、远端命令输出、服务器文件名和文件内容均视为不可信数据,不得用作控制帧或静止证明。 - DSH Host 本机管理员能够读取 Host 账户可访问的数据,因此不在“防止本机管理员取证”的威胁模型内。 ## SSH 凭据 - 只支持系统 SSH Agent 或 DSH Host 上的私钥文件;密码、键盘交互认证和在 UI 中提交口令均不受支持。 - 私钥内容不进入 Renderer、HTTP 响应、连接配置、剪贴板或日志。连接配置只保存 Host 上的密钥绝对路径引用。 - 自动生成的 ED25519 私钥只写入 Host 的插件数据目录。Windows 使用受保护 ACL,POSIX 使用目录 `0700` 和文件 `0600`;权限无法严格验证时失败关闭。 - 加密私钥必须预先加载到 SSH Agent。插件不会保存解密口令,也不会自动把公钥写入服务器的 `authorized_keys`。 - 不要在 issue、聊天、浏览器表单或故障报告中粘贴私钥、服务器密码、解密口令、SSH Agent 转发材料或完整凭据文件。 ## 主机身份 首次配置必须检测并由用户确认 `SHA256:` 主机指纹。插件随后通过隔离的 `known_hosts` 数据严格核对目标主机;主机、端口、用户名或指纹变化会使旧工作区绑定失效。 主机指纹只说明本次连接使用了被确认的 SSH 主机密钥。确认前应通过云厂商控制台、服务器本地控制台或另一条可信通道独立核对指纹,不应只信任首次网络扫描结果。 ## 管理 API 与 Web 边界 - 连接管理、密钥生成、目录与文件 API 只接受直接 loopback 请求,并执行同源/`Origin` 防护。 - Web 端的 SSH 由运行 DSH Web Host 的机器发起;浏览器中的本地路径不是 Host 的密钥路径。 - 非 loopback Web 管理被禁用。反向代理头和 DSH `trustedHosts` 不是插件身份认证,不能绕过该限制。 - 需要远程使用 Web UI 时,应先通过可信 SSH 本地端口转发访问 Host 的 loopback 监听;不得直接暴露管理 API。 ## 权限与路径边界 - 建议使用权限受限的普通服务器用户。用户名为 `root` 时,连接表单要求不可跳过的独立风险确认;这不会放宽指纹、认证或目录限制。 - 每个连接至少配置一个 `allowedRoots`。服务器端对目标执行 `realpath` 后再校验,阻止 `..` 和符号链接越界。 - `/root` 与文件系统根目录 `/` 属于高风险工作区,必须针对当前服务器身份和规范化路径逐次确认。选择 `/` 等同于把该 SSH 用户可访问的整台服务器文件系统交给 Agent。 - 远程工作区按结构化 target 路由。provider 缺失、断联、API 版本不匹配或 SSH 身份变化时失败关闭,不得回落为 Host 本机路径或本地命令。 - 文件写入携带内容版本;检测到并发变化时拒绝覆盖。 ## 远程执行与 cleanup fence 普通远程命令由 Linux subreaper、独立进程组和固定 SSH 控制通道监督。终止流程为 `TERM → grace → KILL`,并在 Host 返回成功前独立扫描远端 `/proc`,确认父进程 identity 已消失且进程组和 session 都已静止。 插件在首次 spawn 前持久化 cleanup fence。Host 强杀、断电、SSH 传输异常、监督器异常或任何无法证明静止的状态都会失败关闭,并保留 fence,阻止身份修改或连接删除。只有管理员在服务器侧独立确认残留进程已经清理后,才可在退出 DSH 后备份并按运维流程移除 fence;远端输出、旧 control 文件或 SSH 退出码不能替代该确认。 ## 日志与故障报告 - 报告问题前删除或替换真实主机名、IP、用户名、本机绝对路径、公钥注释、主机指纹、连接 ID、工作区 ID 和命令输出中的敏感业务数据。 - 示例地址使用 RFC 5737 保留段,例如 `203.0.113.10`;路径使用 ``、`` 等占位符。 - 公钥通常不是秘密,但仍可能泄露账户关联信息;除非排障确有必要,否则也应省略或截断。 - cleanup fence、安装回执和连接配置可能包含服务器身份与本机路径。不要原样上传。 ## 漏洞报告 公开仓库与安全报告渠道尚未确定。在仓库 URL 和维护者安全联系方式确认前,请不要创建包含秘密或可利用细节的公开 issue。发布前必须补充一个可验证的私密报告渠道、响应负责人和披露流程;本文件不虚构邮箱或外部 URL。