跳转至

AnyTLS 客户端元数据

AnyTLS 协议具有设计缺陷:其 settings 帧要求客户端向服务器发送软件名称和版本,且协议规范要求客户端不得伪装此信息。

此字段不承担协议功能——AnyTLS 已有独立的版本字段用于兼容性协商,且开源服务端实现不使用客户端元数据。然而,此字段使得供应商可以收集并统计客户端类型,对于某些平台特定的客户端,还可能推断出操作系统类型与版本范围等隐私信息,而这不应该,也不是被用户预期的,在一个反审查协议中出现。我们收到报告,有商业代理提供商利用此信息识别和阻止来自 sing-box 使用的、由 AnyTLS 提供的用于 sing-box 集成的官方代码库的连接,据传原因是恶意用户使用 sing-box 或使用相同官方代码库的客户端连接到服务器,这表明客户端元数据在实践中已被用于收集和区别对待。

协议规范称「伪装它没有任何意义」。我们不同意:这类似于浏览器实现 TLS ECH GREASE——如果没有这一机制,保护隐私的客户端会被识别并受到差别对待。

状态

2025-02-20

我们合并了添加此协议的 PR。由于在供我们使用的实现中,metadata 被固定在 sing-anytls/<library version>,且我们没有仔细审查协议规范和其他实现,我们错误地认为这不是隐私信息。

2025-04-05

协议文档加入了要求第三方实现填写真实软件名称与版本号的条款,并声称「伪装它没有任何意义」。

2026-07-18

向 sing-box 提出的 PR 被发现额外上传了 sing-box 和实际版本的字符串,随后此更改被回退,没有发布。

2026-08-03

发布了 sing-box 1.13.16 和 1.14.0-beta.5,现在 AnyTLS 请求中的客户端元数据默认为空。出于兼容性考虑,client_metadata 出站选项允许用户自定义此值。

由于开源服务端实现不使用此信息,且它没有合理用途,这不被视为破坏性更改。

建议

我们建议 AnyTLS 协议移除客户端元数据,或将其替换为非默认提供、且用户可以自定义的选项;并建议其他客户端实现也采取行动,共同阻止基于客户端元数据的统计和区别对待。