安全模型

先说不承诺什么

安全页通常从「我们保护你」开始。这一页从边界开始, 因为一个说不清边界的承诺没有用。

边界

画布上的授权是产品护栏,不是安全边界

Termspace 里所有终端和应用本身跑在同一个用户身份下。 底层是 tmux,而任何已经能在你机器上执行命令的进程, 都可以直接向那些会话发送按键 —— 绕开画布上的连线、弹窗、开关,一个都不经过。

所以「连线即授权」防的是:agent 拿错账号、连错数据库、把活派到你没打算派的地方, 以及你自己手滑。它不防一个已经拿到你 shell 的攻击者 —— 那种情况下,你的 ssh 私钥和浏览器 cookie 早就没了,Termspace 的弹窗是最不重要的一环。

这句话同样写在项目的开发文档和代码注释里。任何时候有人(包括我们自己) 把它描述成安全机制,那是错的。

做到的

在那条边界之内,具体做了这些

每一条都给出它挡住的那个具体场景。挡不住什么也一并写。

数据

东西存在哪,谁能看到

什么存在哪出网吗
凭证内容本机,系统钥匙串加密不出网
画布布局 / 节点本机 JSON,原子写 + 备份不出网
终端滚动历史本机文件不出网
派活与授权记录本机追加式日志不出网
额度数据不落盘,内存里向对应厂商的官方接口查询
崩溃日志本机不自动上传

没有账号体系,没有服务端。 Termspace 不向我们的服务器发送任何东西 —— 我们没有那样的服务器。唯一的固定出站是检查更新(见下), 其余全部是你自己配置的 agent 在跟它们各自的厂商说话。

更新

更新链条到底保证了什么

更新包会替换掉整个应用,所以这条链的每一环都值得说清楚 —— 包括每一环保证什么。

环节保证不保证
HTTPS 连上的确实是那个地址的服务器,传输中没被改 那台服务器可信
校验和 下载到的文件完整、没损坏 发布者身份 —— 控制了发布目录的人可以给恶意包算一个匹配的校验和
代码签名 候选包的签名与当前正在运行的这个应用同源 它来自官方目录、版本更新、通过了公证、私钥没泄漏

结论:这条链的信任根是发布目录的控制权,代码签名是最后一道防线而不是第一道。 更新源地址在设置里可以改 —— 这有代价,所以界面上会显著提示当前生效的域名。 只接受 HTTPS,明文地址一律拒绝。

装不装你说了算

后台检查、后台下载,但绝不自动安装、绝不在退出时静默替换。 终端里跑着你的活,自动重启会把正在进行的 agent 对话掐掉。

不会降级

签名本身不提供版本单调性,防降级完全靠这一层,所以它是显式写死的。

修过的

发布前审计拦下的三个

写出来不是为了显得坦诚 —— 是因为它们说明了这套东西的失效模式长什么样: 不报错,测试全绿,只是安静地做了错误的事。

这三个都不是在写代码时发现的,是在发布前专门做一遍审计时发现的 —— 改动审查看的是「这次改了什么」,而它们不在任何一次改动里。

报告

发现问题

如果你找到了这一页没说清的问题,或者发现某句话与实际实现不符,请告诉我们。 「文档描述与实现不符」本身就算一个有效报告 —— 这一页的价值全在于它是准确的。

软件当前处于早期阶段。它跑在你的开发机上、握着你的账号凭证, 请按这个前提评估要不要用。