V2Ray 这两天比较热闹,因为被人爆出了一个非常严重的问题:V2Ray 的 TLS 流量可被简单特征码匹配精准识别,目前 V2Ray v4.23.2 已经发布,这个潜在被识别风险已消除,如果您在使用 TLS 或 WebSocket 功能并在意这项潜在的风险,应当尽快升级 V2Ray 客户端。
1、V2Ray TLS 被精准识别的问题
这个问题是 5 月 30 日由网友发在 V2Ray issue 区的,原文地址:v2ray的TLS流量可被简单特征码匹配精准识别(附PoC)
简而言之就是仅凭 tls client hello 的 cipher suite 字段,就可以非常准确地将 v2ray 流量和正常浏览器流量区分开来,并且不限于 tls+ws,对 tls+vmess 等组合也同样可以精准识别。
2、V2Ray v4.23.2 更新日志
收到了网友的 issue,V2Ray 官方也已经给出了积极回应,目前 V2Ray v4.23.2 已经发布:
- TLS 改用 Golang 标准密码套件
- 增加 Illumos 支持
- Golang 升级至 1.14.1
注:v2ray/v2ray-core#2509 提及的潜在被识别风险已消除,如果您在使用 TLS 或 WebSocket 功能并在意这项潜在的风险,应当尽快升级 客户端。
3、扩展阅读
关于 v2ray/v2ray-core#2509 的 TLS 指纹漏洞
”漏洞“到底“漏”了什么?
客户端代码中使用了一个固定的 TLS 密码套件列表进行握手,这个固定列表可能在 V2Ray 客户端发送 TLS 握手包时被防火墙用作识别 V2Ray 客户端的特征。
“漏洞”存在多长时间?
v2ray-core 项目在 2018 年中的版本(v3.23.1)中引入了 TLS 底层配置的功能,此后这个列表便一直存在于代码中。2019 年的版本(v4.18.1)中因为加入 TLS 1.3 的支持,列表增加了一些项目。
目前处理方法?
Golang 标准库的 crypto/tls 也在活跃的维护当中,已经有完善了密码套件的选择机制,标准库会根据运行的硬件平台性能选择适当的密码套件顺序。
新版本(v4.23.2+)去掉列表,设为空值(nil),由 Golang 底层处理。
后续改进?
进一步避免指纹被侦测的另外一个思路是把 TLS 配置成跟常见浏览器一致(注:浏览器不同版本的 TLS 指纹都有所区别)。目前有 项目 (tlsfingerprint.io) 在关注这个问题。
对 V2Ray 项目而言,这属于功能性加强,会在后续版本中引入由 uTLS 库提供的伪装指纹功能。