正在努力检测对 TLS 的 MitM 攻击?

信息安全 tls 中间人
2021-08-25 06:47:48

客户端 B 使用 TLS 连接到服务器 A。B 通过它的 FQDN(例如www.alice.tld)和 CA 的根证书知道 A,该 CA 为该 FQDN 向 A 颁发了证书。假设 B 使用 HTTPS 和标准 Web 浏览器,并且 A 持有的证书带有一系列证书,发给位于 B 浏览器白名单中的 CA。

状态参与者 M 能够强制 B 的 ISP 使用路由器 M 提供的资源(或等效地,通过 M 控制下的路由器路由 B 的流量)。M 还能够获得 B 的浏览器将信任的任何 FQDN 的证书,因为 M 已涉足具有此能力的无数 CA 之一。

如果我错了,请纠正我,但是 AFAIK TLS 或 HTTPS 中没有内置任何东西来阻止 M 让他们的路由器执行中间人攻击,其中路由器持有 A 的 FQDN 的流氓证书,使用它来模拟 A wrt B,并连接到 A 和 B 一样(这里是未经身份验证的)。理论上,没有任何公共点对点协议可以有效抵御这种中间人攻击。

但是,在实践中,可以检测到

  1. 从 A 到 B 的一些具有可信完整性的链接可以做到:A 可以发布它使用的证书(或只是它们的哈希/指纹),B 可以检查它作为 A 使用的证书是否在此列表中。
  2. 一些公共服务机构可以尝试这样做,而不是 A,通过各种链接收集 A 使用的证书,希望不受 M 的影响,并将其重新发布为推文、无线电广播、印刷的讲义或其他难以-审查员的意思。
  3. 使用 M 尚未实施对策的协议在 TLS 链接顶部传递相同的信息就足够了。首先,A 发送它当前使用的证书的哈希值的新的实验性 HTTP(S) 标头就可以了。

问题:是否有一些持续的努力来检测这种对 TLS 的中间人攻击?它使用什么方法?

2个回答

证书透明度是一个索引所有证书的系统。域所有者可以查看证书透明度日志,以查看是否已颁发任何他们未请求的证书。浏览器可能会检查证书日志,以确保将遇到的每个证书都添加到日志中。

所以M可以创建一个证书并且:

  • 不要将其添加到日志中。B的浏览器可以检测到证书没有被添加,因此很可能是伪造的证书。
  • 将其添加到日志中。A可以检测到已颁发未经授权的证书。

证书固定(或公钥固定)被许多浏览器用于至少一些站点,以及一些非浏览器客户端软件。这个想法是客户端(浏览器或其他)被编程为检查它收到的证书与合法证书的已知属性。例如,客户端可能会验证证书使用几个公钥之一(客户端构建时的当前公钥,以及未来/备份以防需要轮换),或者证书是由特定 CA 颁发的,或类似的。在极端情况下,您可以固定整个叶证书,但这意味着任何更新或轮换都需要客户端更新以删除旧证书并添加新的未来证书。

当软件和服务器由同一开发人员提供时,证书(或公钥)固定是最常见的。谷歌将其所有属性都固定在 Chrome 中。微软可能会在 Edge 中做同样的事情——不确定——但他们肯定会为其他一些软件做同样的事情(注册服务器,我认为也是默认的更新服务器)。我认为 Firefox 可能会为 Mozilla 属性这样做。您还会在应用程序之类的东西中看到它(例如,Twitter 可能会在他们的移动应用程序中使用固定,尽管我不知道他们是否这样做)。已通过此机制检测到至少一个欺诈性 Google 证书。

也有人尝试标准化网站向浏览器提供自己的 pin 的方式。它被称为HTTP Public Key Pinning或 HPKP,并允许站点指定其证书的属性(和强制备份),具有过期时间,与 HTTP 严格传输安全 (HSTS) 的工作方式非常相似。与 HSTS(也类似于 SSH)一样,它是首次使用时信任的;任何有效的 HTTPS 响应都可以包含标头,只要它与当前证书匹配,它就会被信任。与 HSTS 不同,HPKP 从未被广泛采用,现在已被弃用。某些浏览器可能可以配置为启用它——我的 Firefox 副本在 about:config 中仍然有“security.cert_pinning.hpkp.enabled”——但默认情况下它是禁用的。

HPKP 的功能之一是能够设置报告 URL。与内容安全策略 (CSP) 类似 - 尽管 CSP 似乎也弃用了这一点 - HPKP 允许指定客户端应该发送它遇到的站点无效证书的报告。这个想法是,尽可能广泛地收集有关潜在攻击的信息。如果客户端与第三方站点有明确的连接,他们可以在那里报告欺诈性证书(与欺诈性证书的站点的连接已经被拦截,攻击者可能不会允许报告通过)。

还有EFF SSL Observatory,它监控在线使用的证书。从理论上讲,这可以检测到意外的证书更改,或者不同的人看到不同证书的情况。


为了解决您的想法#1 和#3,存在的问题是,如果与服务器的连接受到破坏,攻击者可以只修改客户端接收的内容。您阅读了一个哈希列表,或检查一个标头,并查看它与您刚刚收到的证书相匹配......因为一个简单的字符串替换将合法证书的哈希换成了欺诈性的。这种转变并不新鲜。SSLStrip 之类的东西使用它来重写 URL。对于常见的哈希算法和编码格式来说,这将非常简单。

为了防止这种攻击,您需要一个可以记住旧值的系统(这是 HPKP 的目标,它的持续时间设置),或者第三方(希望可以通过安全连接访问!),例如您会看到证书透明度(如另一个答案中所述)。