开源、安全、可审核

每一层实现都公开,每一次远程访问都要经过加密握手,每一个安全发现都公开记录并修复。

DSH 不是把开源当口号。macOS、Android、Chrome 扩展、远程中继、计算机使用各自一个仓库,能读、能自建、能自行编译。手机远程访问唯一的公网组件是中继,它不持有任何用户数据。下面这份安全评审包含 8 个发现、全部已验证的复现步骤,以及修复后的实测数据。

全部开源

每个组件一个仓库,源码可读、可自建、可自行编译,构建脚本随仓库提供。

  • 5 个仓库以 MIT 许可发布
  • 远程中继 dsh-proxy 是 Rust 单端口实现,无 TLS、无证书、无配置文件、无磁盘状态
  • 可以指向自己的中转服务,不依赖我们的托管

安全

远程访问默认是「不开放端口、不落盘、不留状态」的形态,配对凭据一次一码。

  • Noise_IK 端到端加密:设备必须先完成握手才拿得到一个字节
  • 不监听端口、不写状态文件、不额外常驻进程
  • 配对码一码一台设备,5 分钟后失效
  • Chrome 控制复用你已登录的浏览器,不上传 Cookie

可审核

我们对自己的远程访问做过一次完整的对抗性安全评审,8 个发现全部修复并公开记录。

  • 评审含可复现的攻击脚本与实测数据,不是纸面检查
  • 每个发现都记录修复方式与修复后的实测测量值
  • 工具调用逐条留痕:命令、diff 与输出都能回看
  • 权限分级(计划 / 只读 / 工作区写入 / 完全访问)随时切换

安全评审:8 个发现,全部修复

对 dsh-mobile-bridge + dsh-proxy 的对抗性评审,威胁模型是互联网攻击者经公网中继拿下 Mac 上的 /api。

  1. V1

    已配对手机可以签发新的配对二维码

    高 已修复

    mobileBridge/* 对手机一律返回 403,仅保留 Mac 应用本地的已认证通道;实测:手机调用 403,本机 200。

  2. V2

    已配对手机可以枚举状态并吊销任意设备

    高 已修复

    同上,随 V1 一起移出手机可达范围。

  3. V3

    被触达的设备拿到整个 /api,含文件读写与 agent RPC

    严重 已收窄

    移动通道改为默认拒绝的精确路由白名单(/api/file、/api/session/uploadFileBinary、/api/remote.mux,可由配置扩展);未列出的插件路由 404。

  4. V4

    吊销设备不会终止已建立的会话

    高 已修复

    注册表为每个连接保留 dispose 句柄,吊销与 TTL 到期都会销毁套接字;实测:被吊销设备的会话约 0 ms 断开(原先 ≥30 秒)。

  5. V5

    中继:无上限的未认证网关注册

    高 已修复

    握手前做准入控制:全局许可池(--max-bridges,1024)加每 IP 的 RAII 守卫(--max-bridges-per-ip,32);实测:3000 个同地址恶意网关只准入 31 个,RSS 增量 0 MB(原先 3000 个全进,+180 MB)。

  6. V6

    中继:未认证即可耗尽单网关的流量额度,定向锁死受害者

    高 已修复

    preamble 与 Noise_IK 共用 10 秒 deadline;中继的流额度改为原子 Semaphore 预留,不再是 check-then-insert;实测:2100 条静默流全部回收,真实手机随后 10 ms 内被服务(原先被无限期拒绝)。

  7. V7

    中继:XX 握手无超时(slowloris)

    中 已修复

    整个 XX 握手包在 --handshake-timeout-ms(10 秒)内,握手帧长度在分配前先按 1 KiB 上限校验,不再每连接预留 64 KiB 缓冲。

  8. V8

    中继收件箱按帧数封顶,且流额度检查存在 TOCTOU

    低-中 已修复

    超出收件箱的流只丢自己(中继发 KIND_CLOSE 并收回额度),流上限改为持有整个生命周期的原子许可。

以下为评审结论摘要。评审同时确认了「未发现」的部分:无法在无有效设备密钥或实时配对令牌的情况下触达 Mac,未发现预认证 RCE 或伪造设备路径。

评审确认未发现的问题

  • 中继侧无法劫持路由密钥:路由密钥取自握手静态密钥,第三方无法注册自己不持有的 bridgeKey。
  • 每设备门禁成立:未配对设备被拒、配对令牌一次性、错误 magic 被拒。
  • 帧长有界:无由长度前缀驱动的无界分配。
  • 中继解析路径在 panic=abort 下没有可达 panic。

已知残留风险(如实公开)

  • 旧版 bridge 会让 V6 仍然成立:中继的许可阻止超额发放,释放额度依赖 bridge 的超时,因此中继与客户端需一起升级。
  • RPC 通道仍是完整的 RPC 面:白名单移除了手机不该调的插件路由,但已配对设备按设计仍是完整 harness 客户端 —— V3 是被收窄,不是被消除。吊销丢失的手机是既定补救方式,且现在立即生效。
  • 每 IP 网关上限不喜共享出口:在 L4 负载均衡或大型 NAT 后面所有 bridge 同一地址,需有意调高 --max-bridges-per-ip。

GitHub 仓库

所有源码地址,按组件划分。

源码都在这,欢迎来读

安全评审的完整报告、可复现的攻击脚本与实测数据,都在对应仓库里。