Files
WebDrop/docs/threat-model.md
T
2026-10-02 00:59:22 +08:00

4.6 KiB

威胁模型

1. 信任边界

角色 是否受信
用户浏览器中运行的前端代码 受信(信任根,见 §5 的残余风险)
后端进程、其内存、磁盘、日志、核心转储 不受信
反向代理、CDN、TLS 终结点、负载均衡 不受信
网络路径 不受信
持有链接的成员 对频道内容受信,对管理权不受信

设计目标:即使整个服务端被攻击者完全控制,攻击者也读不到内容和文件名,并且无法在不被发现的情况下篡改、重排、截断或替换内容。

2. 服务端能看到什么

能看到 说明
频道 id、模式、设置 席位数、权限、TTL、下载上限等,服务端需要据此执行
帧数量、时间、序号 追加顺序由服务端分配
密文大小 经过档位 padding,见 protocol §6
帧标志 FINAL、SNAPSHOT、GATED、ENC
条目 id、帧序号 随机值,与内容无关
令牌的哈希、终端的哈希 不是原值,但每次请求中会短暂看到令牌原值
下载次数 服务端计数
传输层信息 IP、TLS 指纹、访问时间
看不到(enc 模式) 说明
内容 文本、JSON、文件字节
文件名、类型、总大小、设备名 都在加密的条目元数据里
密钥 K、管理密钥 A 只在 URL fragment 中,不会发给服务器

raw 模式下服务端能看到全部负载,界面必须明确提示。

3. 令牌的含义

令牌(T_read / T_write / T_owner)是授权凭证,每次请求都会经过服务端,所以恶意服务端可以截获它们。这不会导致内容泄露:

  • 令牌由 K 经 HKDF 单向派生,不同用途用不同 info 标签,令牌无法反推 K 或 K_enc。
  • 令牌只授权访问密文,而密文本来就在服务端手里。
  • 截获 T_owner 的恶意服务端可以改设置、删除内容,影响的是可用性,不是机密性或完整性。

4. 攻击与对策

攻击 对策
服务端篡改帧内容 AES-GCM 认证,失败即拒绝
重排、丢弃中间帧 帧序号在 AAD 中,接收方要求 0..n 连续
截断条目 FINAL 标志在 AAD 中,没收到已认证的 FINAL 帧就标记为不完整
把帧搬到其他频道或条目 AAD 绑定 channel_id 和 item_id
翻转 FINAL 或 SNAPSHOT 标志位在 AAD 中
模式降级(enc 换成 raw) 链接带 k 就只接受 enc 且认证通过的帧,不匹配直接拒绝
重放旧帧 同一条目内 (item_id, frame_index) 唯一,服务端幂等,客户端按条目去重
服务端隐瞒或删除条目 无法防止(可用性),见 §6
链接泄露 链接即能力。席位上限限制加入数,所有者可释放席位和删除频道
fragment 外泄 取出后立即 history.replaceState;Referrer-Policy: no-referrer;不把 K 放进查询串
XSS 严格 CSP;条目预览在沙箱中渲染;raw 内容不内联渲染,下载带 attachment 和 nosniff
暴力猜频道 id id 128 位随机
匿名滥用与 DoS 创建时的 Cap 验证码(工作量证明由 Cap 提供)、限流、频道配额、条目数和字节数上限

5. 前端信任根(残余风险)

端到端加密的前提是浏览器执行的是正确的代码。如果同一个被攻破的后端同时下发前端,它可以换成偷 K 的页面。

第一版的缓解:

  • 前端静态资源托管在独立于 API 的域名,API 节点被攻破不影响前端。
  • 所有脚本使用 SRI,构建产物带版本哈希,发布时公布哈希。
  • 前端托管方被攻破的风险仍然存在。

后续:发布签名加 PWA 校验、CLI 客户端(协议不依赖浏览器,第三方可自行实现)。

6. 不做的事

  • 不隐藏 IP 和访问时间。需要的话用 Tor 或自己的代理。
  • 不阻止成员保留明文。复制和下载发生在浏览器里,服务端只能限制拉取密文的次数。「界面禁止复制或下载」只是界面约束。
  • 不防服务端的可用性攻击:隐瞒、删除或拒绝服务。
  • 不提供前向保密:持有链接的人可以解密该频道的全部历史密文。保护手段是删除密文和 TTL。
  • 不提供不可否认性:帧没有逐发送者签名,所有成员共享同一密钥。
  • 不防已被攻破的终端。
  • 不做口令叠加、后量子,留待后续版本。

7. 服务端内存与日志的要求

  • 服务端代码路径中不出现明文和 K,也没有解密函数。
  • 令牌只做哈希比对,使用常量时间比较,不写日志。
  • 日志不记录请求头、请求体、完整 URL;频道 id 在日志中截断或哈希。
  • 错误信息不回显令牌和任何用户提交的字节。