开源、安全、可审核
每一层实现都公开,每一次远程访问都要经过加密握手,每一个安全发现都公开记录并修复。
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。
- V1
已配对手机可以签发新的配对二维码
高 已修复mobileBridge/* 对手机一律返回 403,仅保留 Mac 应用本地的已认证通道;实测:手机调用 403,本机 200。
- V2
已配对手机可以枚举状态并吊销任意设备
高 已修复同上,随 V1 一起移出手机可达范围。
- V3
被触达的设备拿到整个 /api,含文件读写与 agent RPC
严重 已收窄移动通道改为默认拒绝的精确路由白名单(/api/file、/api/session/uploadFileBinary、/api/remote.mux,可由配置扩展);未列出的插件路由 404。
- V4
吊销设备不会终止已建立的会话
高 已修复注册表为每个连接保留 dispose 句柄,吊销与 TTL 到期都会销毁套接字;实测:被吊销设备的会话约 0 ms 断开(原先 ≥30 秒)。
- V5
中继:无上限的未认证网关注册
高 已修复握手前做准入控制:全局许可池(--max-bridges,1024)加每 IP 的 RAII 守卫(--max-bridges-per-ip,32);实测:3000 个同地址恶意网关只准入 31 个,RSS 增量 0 MB(原先 3000 个全进,+180 MB)。
- V6
中继:未认证即可耗尽单网关的流量额度,定向锁死受害者
高 已修复preamble 与 Noise_IK 共用 10 秒 deadline;中继的流额度改为原子 Semaphore 预留,不再是 check-then-insert;实测:2100 条静默流全部回收,真实手机随后 10 ms 内被服务(原先被无限期拒绝)。
- V7
中继:XX 握手无超时(slowloris)
中 已修复整个 XX 握手包在 --handshake-timeout-ms(10 秒)内,握手帧长度在分配前先按 1 KiB 上限校验,不再每连接预留 64 KiB 缓冲。
- 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 仓库
所有源码地址,按组件划分。
源码都在这,欢迎来读
安全评审的完整报告、可复现的攻击脚本与实测数据,都在对应仓库里。