跳转到内容

安全

安全是 OxideTerm 设计的核心优先事项。整个 SSH 协议栈为纯 Rust(russh + ring),从根本上消除了 C 内存安全漏洞。本页介绍已实施的安全措施。

OxideTerm 使用 russh 0.61 配合 ring 加密后端:

  • SSH 栈不依赖 C/OpenSSL/libssh2 — SSH 密码学能力由 Rust 实现,不再受系统 OpenSSL 版本差异影响
  • 完整 SSH2 协议:密钥交换、通道、SFTP 子系统、端口转发
  • ChaCha20-Poly1305 和 AES-GCM 密码套件
  • 这消除了与 C 内存安全问题相关的一整类漏洞(缓冲区溢出、释放后使用等)

包含敏感数据的内存使用 zeroize crate 在使用后安全清除。

所有敏感凭证存储在 操作系统原生钥匙串 中:

平台钥匙串
macOS钥匙串访问
WindowsWindows 凭据管理器
LinuxSecret Service API(GNOME Keyring / KWallet)

密码、私钥口令和 API 密钥 绝不 存储在配置文件、数据库或明文中。

并不是所有重要字段都适合直接塞进系统钥匙串,所以 OxideTerm 还会对本地保存的配置做静态加密。

  • 磁盘上的本地配置以加密文档形式保存,而不是明文 JSON
  • 专用的本地配置密钥保存在系统钥匙串中
  • 连接元数据、跳板路由、标签等保存状态会在本地使用 ChaCha20-Poly1305 密封
  • 较旧的明文配置会在启动时迁移到加密存储

实际效果是:真正的秘密放在系统钥匙串里,其余已保存连接状态在磁盘上也不会裸奔。

OxideSens AI API 密钥存储在操作系统钥匙串的 com.oxideterm.ai 服务下,与 SSH 凭证分开存储。

在 macOS 上,密钥读取受 Touch ID 保护(通过 LAContext):

  • 无需 entitlements 或代码签名
  • 每次会话首次认证后缓存——只需认证一次
  • 提供硬件级访问控制,无需额外配置

用于分享连接配置的 .oxide 导出格式使用:

  • ChaCha20-Poly1305 — AEAD(带关联数据的认证加密)
  • Argon2id — 内存硬化 KDF(密钥派生函数)
    • 256 MB 内存开销
    • 4 次迭代
    • 抵抗 GPU/ASIC 暴力破解
  • SHA-256 完整性校验和
  • 敏感字段单独加密
  • 非敏感元数据(主机名、标签)可选择保持明文以便组织管理
  • 可选密钥嵌入 — 私钥可 base64 编码后嵌入加密载荷
  • 预检分析 — 导出前,OxideTerm 分析认证类型并检测缺失的密钥,让你清楚知道将导出什么内容

包含敏感数据的内存使用 zeroize 进行安全清除。

OxideTerm 实现 TOFU(首次使用时信任)

  • 首次连接:接受并存储主机密钥
  • 后续连接:与已存储的密钥进行验证
  • 拒绝主机密钥变更 — 防止中间人攻击
  • 使用 ~/.ssh/known_hosts,行为与 OpenSSH 兼容
  • Ed25519(推荐——最快、最小的密钥)
  • ECDSA(P-256, P-384)
  • RSA(最低 2048 位)
  • SSH 证书 — 完整的基于证书的认证支持

OxideTerm 支持系统 SSH Agent 进行密钥管理:

平台Agent
macOS/LinuxSSH_AUTH_SOCK Unix Socket
Windows\\.\pipe\openssh-ssh-agent Named Pipe

功能:

  • 重连时自动重放 Agent 认证
  • 每个 ProxyJump 跳板可独立使用 Agent 认证
  • 自定义 AgentSigner 实现封装系统 Agent 并满足 russhSigner trait

桌面界面、终端状态和领域服务位于同一个 Rust 进程中。终端字节直接更新 TerminalState,连接、SFTP、端口转发、IDE 和 AI 通过进程内调用协作,因此不需要暴露本地控制端口,也没有浏览器前端与后端之间的套接字认证面。

独立的 oxideterm CLI 直接读取指定配置目录并调用相同领域 crate;它不是桌面应用的远程控制客户端。

插件系统使用多层安全机制:

层次机制
WASM 沙箱WASM 插件在 wasmtime 中运行,不能获得任意宿主进程访问权
能力校验Host API 调用会核对清单声明和插件权限
路径约束运行时入口必须位于插件目录内,拒绝路径逃逸
执行限制宿主可中断超时或失败的插件执行,并记录诊断
原生界面插件提交声明式界面数据,由宿主使用 GPUI 控件渲染

插件只能通过受控 Host API 使用宿主能力。文件、连接、终端、存储和网络访问都受清单与权限边界约束。

OxideTerm 不加载网页界面,也没有 DOM、脚本注入或内容安全策略配置面。应用界面由本地 Rust 代码和 GPUI 绘制;插件也不能注入 HTML、CSS 或脚本。

  • 无遥测 — OxideTerm 不收集或传输使用数据
  • 默认本地优先 — 不要求账号,也不强制依赖云服务
  • 本地优先 — AI 功能自带密钥
  • 云工作流按需启用 — Cloud Sync 只有在你配置后才会访问远端后端,不是本地工作区的前置依赖
  • 显式数据发送 — 终端缓冲区数据仅在你主动请求时(点击 Context 按钮并发送消息)才发送给 AI 服务商
  • 本地 AI — 通过 Ollama 使用本地模型,AI 查询零网络流量
  • 分层本地存储 — 设置、连接和配置使用 JSON 或加密文档存储;部分历史、索引和运行时状态使用本地 redb 数据库