有关 Trojan 关闭证书验证的安全警示
Qv2ray Developer Community为了你和他人的安全,请避免使用关闭证书验证的 Trojan 节点。如果机场要求用户关闭证书认证,请提醒机场主并拒绝使用。
Trojan 协议的安全性仅依赖于 TLS 。关闭证书验证等同于放弃 TLS 的安全性。 一旦关闭,第三人可轻易执行 TLS 中间人攻击,进而审查所有流量明文内容。
这不是 Trojan 协议本身缺陷或是 Trojan 代理的 Bug,这是机场和用户滥用仅供开发者使用的调试选项造成的安全隐患。
生态现状
以下是 Trojan 生态圈中一些错误的认识和做法:
- 部分人认为要中转就必须关闭证书验证;
- 部分人从一开始就使用自签名证书而关闭证书验证;
- 部分人证书过期或失效后,使用关闭证书认证的方式继续使用同一证书;
- 部分机场无论节点证书是否有效,均通过分享链接推送关闭验证的选项……
这些认识和做法直接导致了 Trojan 仅有的 TLS 安全性被放弃,造成安全隐患。
技术细节
Trojan 的层次结构
根据 Trojan-GFW 的官方文档,Trojan 协议承载于 TLS 协议之上,TLS 的底层传输为 TCP 协议。一个 Trojan 包由包含 Trojan 密码的哈希值的用户身份标识、Trojan 指令以及数据载荷组成,彼此之间由回车换行符分开。
为伪造 HTTPS 服务器,Trojan 协议被设计为类似 HTTP 协议的存在,使用回车换行符分割,使用可见字符传输,本身并不加密头部和数据载荷,传输安全完全由 TLS 负责完成。因此,若关闭了证书验证,一旦遭到中间人攻击,Trojan 的用户身份标识、指令和数据载荷都会对中间人完全透明。最糟糕的是,中间人完全可以对其中明文的数据载荷进行审查和分析。
概念验证(PoC)
我们使用 Golang 写了一个极其粗浅的中间人程序,使用 Golang 随机生成的自签名证书,在 Trojan 客户端关闭了证书验证的情况下,让客户端与我们的中间人程序通信。中间人可以非常轻易地识别和审查其中的明文数据。下图是在测试主机上运行的结果:
由此可见,若此时你的内部载荷没有可靠的加密,如 HTTP 协议、WebSocket 协议、DNS 协议等,这部分数据就如同在“裸奔”,可以被“老大哥”看个一清二楚。
上述代码以 WTFPL 协议开源并可用于下面的地址:
https://gist.github.com/DuckSoft/f199041beda6b7dd5ec3897cea2ea16d
若你有兴趣进一步探索,这段代码可供你参考。
总结及建议
根本问题
- 问题的根本不在 Trojan 协议。
- 问题的根本在于滥用了本应仅用于调试的“允许非安全证书”功能。
- 开发者可能需要对这类危险参数的使用加以限制。
如果你是……
- 机场用户:暂时避免使用此类节点,通知机场对节点做出相应调整。
- 自建用户 / 机场主:使用有效的证书,根据证书配置对应的 SNI 完成中转,不要关闭证书验证。
附:我如何确认自己是否受到了影响?
配置分享
- 分享链接:检查其中有无出现
allowInsecure=1
等字样。 - Trojan-Go: 检查配置文件中“
verify
”和“verify_hostname
”是否设置为false
(Trojan-Go 默认为true
)
软件设定
- Qv2ray: 点击编辑链接,查看节点有无勾选 Ignore Certificate 项。
- Trojan-Qt5: 点击编辑按钮,查看节点验证证书选项是否被取消勾选。
- Trojan-Client-Slim: 检查 Verify 下的 Cert 选项。
- v2rayA: 点击查看(修改)按钮,检查
AllowInsecure
是否设置为“是”。
其他玄学
- 标为“中继”的节点很有可能是关闭了证书验证的节点。
版权声明
本文由 Qv2ray Developer Community 成员以CC-BY-ND 4.0 协议授权。
Copyleft 2020 DuckSoft, Leroy, p4gefau1t, and KevinZonda