隐私与安全
文档编写中
部分内容可能尚不完整。
ThinkTerm 不收集任何关于你、你的机器或你如何使用它的信息。没有遥测、没有统计分析、没有追踪器,项目方也没有接收这些数据的服务器。除了一次更新检查之外,ThinkTerm 通过网络发出的每一样东西,都是你自己发起的。
不经你操作就会发出的
只有更新检查。桌面应用运行期间,会向 GitHub 的 release API 询问是否有新版本:第一次是启动后大约十秒,之后每隔 check_for_updates_interval_seconds 一次,默认一天。命令行工具、TUI 和会话 server 从不自行检查。
这个请求是匿名的。除非你自己设置了 THINKTERM_UPDATE_TOKEN,否则它不带任何凭据 —— 那个变量只在访问私有 fork 时才有用。应用从不读取 GITHUB_TOKEN,所以你为别的工具导出的 token,不会被一次你没有发起的检查发送出去。GitHub 看到这个请求,就像看到任何其他请求一样;制作 ThinkTerm 的人看不到。
在配置里写 check_for_updates = false 即可关闭。更新流程的其余部分见 更新。
你使用某项功能时才会发出的
| 你做的事 | 发往哪里 |
|---|---|
| 通过 SSH、Mosh 或 ThinkTerm Connect 连接 | 你连接的那台主机 |
为某台主机开着 检测操作系统 或 识别远端程序 | 那台主机,走同一条连接:检查它的发行版,或者把 ThinkTerm 的 shell 集成复制到那里的 ~/.config/thinkterm/ |
| 打开一篇显示网络图片的笔记 | 图片地址指向的那台服务器 |
| 同意更新远端 server | 那台主机从 GitHub 下载安装脚本和发布文件 |
运行 thinkterm update,或按下 安装更新 | GitHub,获取发布文件 |
| 开启网页访问 | 打开你所生成链接的浏览器 |
笔记里的网络图片默认会加载,而加载一张图片会让那台服务器看到你的地址,和任何网页一样。note_remote_images_enabled = false 可以禁止它。
插件是你自己安装的程序,可以像其他任何程序一样使用网络。比如 ThinkTerm 源码里的 Stocks 插件,就会从 Yahoo Finance 获取报价。下载包里不含任何插件,见 插件。
保存在本机的
ThinkTerm 把它的状态保存在你的用户账户里:Space、Project 和 Thread,SSH 主机簿,片段,最近使用的命令,各项设置。它们在各个系统上分别放在哪里,见 配置。笔记 Vault 是你自己选的文件夹,里面是普通的 Markdown 文件。
终端输出保存在内存里,由应用或会话 server 持有,不会写入磁盘。
在 macOS 和 Linux 上,最要紧的那些文件以只有你能读的 0600 权限写入:
secret.key,加密已保存 SSH 密码的密钥- 片段文件
- 你导出的备份里的文件
- 网页监听的 token 文件,以及它的证书和私钥
- ThinkTerm 新建的笔记,除非所在文件夹给了它自己的权限
这挡得住这台机器上的其他账户,挡不住任何以你的身份运行的东西 —— 同步客户端、备份任务、插件 —— 它们读一个 0600 文件和 ThinkTerm 一样容易。这对保存的密码意味着什么,见 远程。
Windows 上没有对应的权限位可设,这些文件继承所在文件夹的权限;对默认的用户配置文件来说,就是你本人、SYSTEM 和 Administrators 组。为了让凭据不进入漫游配置文件(在某些域里,Windows 会在注销时把它复制到配置文件服务器),SSH 主机簿和它的密钥放在 %LOCALAPPDATA%\ThinkTerm\ssh\,网页监听的证书放在 %LOCALAPPDATA%\thinkterm\web-tls\。
网页端
在你打开之前,网页访问是关闭的。打开之后,页面、脚本和字体都由你自己的机器提供;页面不会向任何第三方发出请求,也不会收集任何使用情况。
浏览器凭你生成的 token 进入,token 是链接的一部分。页面一加载就会把 token 从地址栏里拿走,放进这个标签页的 sessionStorage,标签页关闭时浏览器会将其丢弃。拿到这条链接的人,就在那台机器上拥有一个以你身份运行的 shell,所以它和 SSH 密钥一样是凭据。
只有配置了 token_file,服务端才会把 token 写入磁盘;否则它们只在内存里,重启后全部失效。对每个 token,它写下的是 token 的 SHA-256 摘要,而不是 token 本身 —— 所以文件被复制走也放不进任何人 —— 以及它的名称、创建时间、过期时间、最后使用时间,和对最后使用它的浏览器的粗略描述,比如 "iPhone · Safari"。不会记录任何设备的地址,服务端日志里记的是哪个 token 被放行,而不是谁用了它。
只有在监听绑定到非回环地址、而你又没有提供自己的证书时,才会生成自签名证书。证书里写着这台机器的主机名和它的地址,任何连到这个端口的人都能看到 —— 证书本来就是做这个的。
页面会把你对它的选择 —— 语言、主题、字号、配色方案、当时显示的 Space、面板宽度、命令面板最近的选择 —— 保存在浏览器的 localStorage 里,留在那台设备上。清除这个站点的数据就会忘掉它们。谁能访问这个端口、如何核对证书,见 网页访问。
macOS 上的权限提示
macOS 会把一个程序做的事记在启动它的那个应用头上。ThinkTerm 启动你的 shell,你的 shell 启动你运行的一切,所以一条碰到受保护内容的命令 —— 比如 find 遍历到存放通讯录的文件夹,或者某个打开摄像头的工具 —— 弹出的提示上写的会是 ThinkTerm。提示的原文也是这么说的:An application launched via ThinkTerm would like to access…。ThinkTerm 本身没有任何去读取你的通讯录、摄像头、位置之类的代码。
放在后台会话 server 里的本地终端,是由那个 server 启动的,而不是由应用启动的,它会以自己的名义 thinkterm-mux-server 申请权限。一个你已经允许过 ThinkTerm 访问的文件夹,可能还需要为 server 再允许一次。ThinkTerm 如何告诉你被拒绝的是哪一个,见 配置。
插件
插件以你的身份、用你的权限运行。ThinkTerm 只在侧栏里显示它,但程序本身外面没有沙盒:它能读你的文件、使用网络、运行其他程序;在通过 SSH 访问的终端旁边,它还能请 ThinkTerm 在那台主机上做同样的事。安装插件时,像安装任何其他程序一样对待它。详见 插件。
报告安全问题
请私下报告,使用 GitHub 的私密漏洞报告功能:打开仓库的 Security 标签页,选择 Report a vulnerability,或者直接前往 github.com/RoversX/ThinkTerm/security/advisories/new。请不要为此开公开的 issue、discussion 或 pull request。
尽量附上以下内容:
- 版本号(
thinkterm -V的输出)和你的操作系统 - 涉及的部分 —— 桌面应用、会话 server、网页访问、SSH 或 Mosh 连接、插件 server
- 复现步骤,或者概念验证
- 攻击者能做到什么,以及事先需要具备什么
你应该会在一周内收到回复。复杂问题的修复可能需要更久,期间会告诉你进展。修复发布时,安全公告会随之公开并致谢你,除非你不希望署名;在那之前,请不要公开细节。
只支持最新的发布版,修复会进入下一个版本。报告前请确认问题在最新版上仍然存在。
什么算在范围内
仓库里的全部代码都在范围内,包括 ThinkTerm 从 WezTerm 继承的代码。如果某个问题也影响 WezTerm,请注明,以便同时向上游报告。
以下不算 ThinkTerm 的漏洞:
- 已安装的插件能做的事。它是你自己安装的程序,以你的身份运行。
- 已经持有有效浏览器 token、能读取你的 ThinkTerm 数据,或者能以你的身份登录的人所能获得的访问。token 和保护已保存密码的密钥都是凭据。
- ThinkTerm 只是负责运行的那些程序本身的问题,比如你的 shell、
ssh或mosh。
其他来源的构建
以上所说,针对的是 ThinkTerm 的源码,以及它自己的发布流程在 GitHub 上发布的构建。从其他地方获得的构建,可能已被改成另一种行为。
