有关 Trojan 关闭证书验证的安全警示

有关 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 客户端关闭了证书验证的情况下,让客户端与我们的中间人程序通信。中间人可以非常轻易地识别和审查其中的明文数据。下图是在测试主机上运行的结果:

A PoC from @DuckSoft. Special Thanks to @p4gefau1t.

由此可见,若此时你的内部载荷没有可靠的加密,如 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

Report Page