当我们访问 github.com 的时候,需要首先将域名转变成 IP 地址,浏览器会优先查找本地的 hosts 文件,如果没有找到对应的记录,就会向 DNS 服务器请求解析(这里省略了一些与本文无关的细节,具体整个流程可以参考 what-happens-when)。如果 DNS 服务器解析出错或者受污染,将 github.com 解析到错误的 IP 地址,就会导致用户访问错误的服务器。而错误的服务器无法提供正确的证书。不过根据网友提供的截图,DNS 解析到正确的 Github 的 IP 地址,同样排除此原因。
正确的 IP 地址,错误的服务器
即使知道了正确的 IP 地址,也不能代表你连接的就是该 IP 对应的服务器,什么意思呢?回忆下当你使用 SSH 协议以及 IP 地址连接一个从未访问过的远程服务器的时候,会出现这样的提示:
The authenticity of host '138.197.19.xxx (138.197.19.xxx)' can't be established.
ECDSA key fingerprint is SHA256:qwR9naUT7NA6RrLSnu9RQ/jR1fJ2K5eakv52ONEyuOE.
Are you sure you want to continue connecting (yes/no)?
BGP 是一种路由协议,我们知道连接服务器需要使用 IP 协议,而连接过程需要在不同的路由器中进行跳转(也称为 hop),每个路由器只负责自己网段的服务器,其他会根据路由表分发,BGP 协议就是一个路由寻址的最优路径算法,它使用了 Bellman-Ford 算法,能够帮助我们高效地查找 A 服务器到 B 服务器的最佳路由路径。国内的运营商使用它来进行路由路线规划,在终端中,我们可以使用traceroute指令来找到这个路由器路径。
什么是 BGP 劫持
BGP 劫持就是某些 AS 通过宣称自己拥有某个 IP 地址,而将对该 IP 地址的请求引向一些恶意服务器。下图中 AS 指的是一个区域中大量计算机组成的网络,中国各家运营商管理着相应的 AS。用户知道 github.com 的 IP 地址后,从 AS 1 出发,正常来说,应该访问在 AS 4 的 Github 服务器,但是 AS 5 与 AS 6 欺骗 BGP 它拥有 github.com 的 IP 地址并且误导 BGP 的路径经过它,于是用户变成访问 AS 6 服务器,但是用户还以为自己连接的是正确的服务器(根据 IP 地址)。万幸的是,由于 AS 6 的服务器无法提供正确的 Github 证书,所以 HTTPS 连接无法正确建立,而这也是整个事件的真正原因。Cloudflare 有一篇非常好的文章 What Is BGP Hijacking? 解释了什么是 BGP 以及 什么是 BGP 劫持。
总结
整起事件中,有组织或者个人使用 BGP 劫持将 github.com 的 IP 地址指向了使用某 qq 邮箱自签名的证书的服务器,由于浏览器并没有信任该证书,所以出现了“您的连接不是私密连接”的错误信息。这样的事情早就不是第一次发生,2008 年巴基斯坦的 ISP 运营商就使用 BGP 劫持屏蔽用户浏览 Youtube。2018 年,黑客通过 BGP 劫持将重定向了亚马逊 DNS 服务器的流量,然后盗取加密货币。
No comments:
Post a Comment