跳转到内容

安全

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

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

  • 零 C/OpenSSL 依赖 — 完整加密栈均为 Rust 实现。不再有 “哪个 OpenSSL 版本?” 的调试烦恼
  • 完整 SSH2 协议:密钥交换、通道、SFTP 子系统、端口转发
  • ChaCha20-Poly1305 和 AES-GCM 密码套件
  • 这消除了与 C 内存安全问题相关的一整类漏洞(缓冲区溢出、释放后使用等)

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

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

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

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

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

内部 WebSocket 连接(前端和 Rust 后端之间)通过以下方式保护:

  • 首帧进行 令牌认证
  • 一次性令牌,带有时间限制——令牌不可重复使用
  • 连接仅限本地(localhost 绑定)
  • 服务端每 30 秒发送心跳;5 分钟超时容忍 macOS App Nap 和浏览器 JS 节流

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

层次机制
冻结 API所有 PluginContext 对象通过 Object.freeze() 冻结——插件无法修改或猴子补丁 API
Proxy ACL每个命名空间访问都根据声明的权限进行验证
IPC 白名单插件只能调用白名单中的 Tauri 命令
熔断器多次运行时错误后自动禁用
错误边界React 错误边界将插件 UI 崩溃与主应用隔离

插件在渲染进程中运行,系统访问权限有限——没有 PluginContext API 之外的直接文件系统或网络访问。

Tauri 应用使用 null CSP。不加载外部 Web 内容——所有 UI 均从本地二进制文件提供。任何新的 Web 内容暴露都应仔细审查。

  • 无遥测 — OxideTerm 不收集或传输使用数据
  • 无云服务 — 所有数据留在你的设备上
  • 本地优先 — AI 功能自带密钥
  • 显式数据发送 — 终端缓冲区数据仅在你主动请求时(点击 Context 按钮并发送消息)才发送给 AI 服务商
  • 本地 AI — 通过 Ollama 使用本地模型,AI 查询零网络流量
  • redb 存储 — 所有持久化数据(会话、设置、聊天记录)存储在本地嵌入式键值数据库中