4.9 KiB
4.9 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 与构建哈希;前端托管方被攻破的风险仍然存在。
嵌入式部署的取舍:
WebDrop.Frontend将 Vite dist 嵌入后端程序集,让 API 以同源方式提供页面。- 这只简化部署,不增强前端与后端的隔离。若部署主机或镜像被控制,攻击者仍可替换页面并窃取用户后续输入的密钥。
后续:发布签名加 PWA 校验、CLI 客户端(协议不依赖浏览器,第三方可自行实现)。
6. 不做的事
- 不隐藏 IP 和访问时间。需要的话用 Tor 或自己的代理。
- 不阻止成员保留明文。复制和下载发生在浏览器里,服务端只能限制拉取密文的次数。「界面禁止复制或下载」只是界面约束。
- 不防服务端的可用性攻击:隐瞒、删除或拒绝服务。
- 不提供前向保密:持有链接的人可以解密该频道的全部历史密文。保护手段是删除密文和 TTL。
- 不提供不可否认性:帧没有逐发送者签名,所有成员共享同一密钥。
- 不防已被攻破的终端。
- 不做口令叠加、后量子,留待后续版本。
7. 服务端内存与日志的要求
- 服务端代码路径中不出现明文和 K,也没有解密函数。
- 令牌只做哈希比对,使用常量时间比较,不写日志。
- 日志不记录请求头、请求体、完整 URL;频道 id 在日志中截断或哈希。
- 错误信息不回显令牌和任何用户提交的字节。