HTTPS劫持研究
这篇文章描述了我们对哈萨克斯坦政府实施的电信级HTTPS劫持的分析。
哈萨克斯坦政府最近开始使用一个假的根证书颁发机构,对包括Facebook,Twitter和Google等网站在内的HTTPS连接进行中间人(MitM)攻击,在此文中,我们给出了还在进行中的研究的初步结果,以及哈萨克劫持系统中新的技术细节。
情况提要
哈萨克斯坦最近开始使用一个假的根证书颁发机构对HTTPS连接进行劫持。这一行为显著弱化了哈萨克网络用户的互联网安全体验。
默认情况下,这一证书颁发机构是不被浏览器信任的,因此必须通过用户手动安装。如果用户不安装这一假证书颁发机构的根证书进而允许劫持,那么用户则完全无法访问受影响的网站。
第一次检测到的劫持行为是在7月17日,我们从7月20号就开始了持续追踪。期间劫持行为出现了几次停止又再次启动的现象。只有某些网站被劫持,劫持是由基于SNI 主机名字段触发的。至少37个域名受到影响,包括社交媒体和即时通讯网站(完整列表见文章后)。
截至目前,该攻击似乎会影响该国最大的ISP ——Kazakhtelecom(9198 KazTelecom)中传输的连接中的一小部分。这意味着只是部分而不是全部哈萨克网络用户会受到影响。劫持行为可以在国外触发,因此使得国际研究者们可以进行远程研究。
什么是HTTPS劫持?
HTTPS通过加密传输数据来保护浏览器和网站之间的安全交互,从而防止ISP和政府对传输进行读取和篡改。服务器通过提供由证书颁发机构(CA)进行数字签名的证书来验证自己身份,而证书颁发机构就是被浏览器信任、能担保网站身份的一个实体。例如,facebook.com会提供一个由DigiCert签名的证书给浏览器,而DigiCert则是一个被信任并且内置在几乎所有浏览器中的证书颁发机构。通过验证提供的证书并且确认证书是由浏览器所信任的证书颁发机构(DigiCert)所签发,浏览器就可以确信是在和真正的facebook.com进行交互。facebook.com提供的证书同时也包含一个用来保护接下来浏览器和Facebook之间通信的公钥。
在HTTPS劫持攻击(“中间人攻击”的一种类型)中,网络中的攻击者会伪装成一个网站(例如facebook.com),并且提供带有攻击者公钥的假证书。通常,攻击者无法让任何合法的CA来对一个不受攻击者控制的域名的证书进行签名,因此浏览器会检测并阻止这种攻击行为。但是,如果攻击者可以说服用户安装一个新CA的根证书到浏览器当中,浏览器就会信任攻击者提供的由这个合法CA签发的假证书。通过这些假证书,攻击者可以模仿任何网站,进而可以篡改网站内容、记录用户在网站上的操作或发表的内容等。因此,用户不应该安装根CA证书,因为这样就会将原本安全的通信暴露无遗,导致通信被劫持或篡改而不被用户所感知。
Censored Planet的发现
Censored Planet是一个在密歇根大学运作的全球审查行为观察站,该机构利用一些远程检测的方法,连续不断地在超过170个国家监测多种类型的网络接口。我们的扫描器第一次报告在哈萨克斯坦出现可能的中间人攻击是在2019年7月20日。利用一个叫做HyperQuack的技术,我们第一次检测到了这一攻击行为。这一技术通过连接到TLS服务器,发送握手包,而该握手包的服务器名称指示(SNI)扩展中包含可能被审查的域名。如果响应结果显示出不同于正常的握手包的扰乱迹象,那么这一域名就会被标记为可能被审查。
图一 CensoredPlanet是如何使用HTTPS服务器来监测TLS中间人攻击的例子
我们的调查揭示了在这些案例中返回的证书是一个由哈萨克斯坦的根CA(Qaznet Trust Network)(图2)签发的假证书。我们的实验同时显示这一审查行为是通过透明代理实现。这意味着审查者在转发流量到目的机器之前,先对流量进行了解密并用其自己的密钥进行了加密。
图2 KazTelecom AS(AS 9198)中的HTTPS服务器拥有可信证书和中间人注入证书的示例
我们的调查显示,只有网络路径经过劫持系统的连接才会被劫持;但是不论连接的方向如何,只要经过劫持系统,连接就会被拦截。这意味着我们可以通过发起到哈萨克斯坦国内的TLS服务器的连接,从而在国外触发劫持,使得我们能方便地进行更加精细的检测。
深入分析
被Censored Planet的HyperQuack扫描自动生成的结果所提醒之后,我们进行了几次实验来更好的理解哈萨克斯坦的HTTPS劫持的基础设施。
我们在哈萨克斯坦的条件是有限的:我们拥有这个国家里2台VPS客户机和52个RIPE Atlas探针的访问权限。由于已知劫持可以被双向触发,甚至可以被在国外的客户端连接触发,所以我们在国外对该国的TLS主机也进行了更加全面的扫描。
我们在该国内的机器上,仅观察了2个HTTPS劫持的实例,两个都是从RIPE Atlas探针发起。我们的两个VPS客户机都可以访问受影响的站点(例如facebook.com)且不被HTTPS劫持,表明HTTPS劫持在该国并不是普遍行为:即使在连接到已知受影响的域名的时候,很多客户端浏览器都未收到中间人注入的证书。
我们发现证书注入必须要有一定的前提条件:
1、客户端到服务器的路径必须经过AS 9198(KazTelecom)的特定部分,即我们观察到发生了证书注入的那个唯一的AS。
2、客户端必须发送一个包含受影响域名的TLS SNI扩展
3、服务器必须提供一个有效的、浏览器信任的TLS证书,但不必是SNI中所包含域名的证书。
我们注意到这些条件是必要不充分条件:例如我们已经发起了经过AS 9198的连接,但仍没有发现证书注入的现象,即使其他的条件也已成立。我们仍在研究触发劫持所必须满足的其他条件。
哈萨克斯坦有超过200,000个能访问的TLS主机,但是来自Censys的数据表明,只有其中6736个TLS主机提供了一个有效的且被浏览器所信任的证书。7月21日,我们进行了一个TLS握手实验——从位于美国的客户端逐一发起到这6736个HTTPS服务器的连接,将其中的SNI设置为facebook.com和google.com,而这两个域名都已确认会触发HTTPS劫持。我们发现只有459个服务器(7.0%)发生了证书注入,表明哈萨克斯坦的HTTPS劫持目前只发生在该国的一部分地区。
而在该国内,通过我们的其中一个VPS对这6736个可信HTTPS服务器进行了同样的扫描,却发现有1598个(24%)服务器发生了证书注入。而这些服务器都部署在不同的位置,但都会经过AS 9198,而这就恰恰说明了它就是HTTPS劫持所发生的位置。在7月22日的早些时候,我们注意到劫持行为不再继续发生,但是9小时后又再次出现。当我们重新运行我们的检测时,我们发现存在证书注入的HTTPS主机的数量有所减少:从美国位置发起的扫描显示只有300个(4.4%),从哈萨克斯坦的VPS发起的扫描显示有400个(5.9%)。这表明该劫持系统仍处于测试调整阶段,或许是更大规模部署的征兆。
网络跳数级分析
为了定位劫持发生的位置,我们采用了一个基于TTL的技术,这一技术常用来做网络检测。对于每个我们能够触发劫持的HTTPS主机,我们都发出了多次连接,在这些包含SNI主机名的连接中,其 IP报文的TTL字段都带有不同的数值,我们记录了收到注入证书的响应包所对应的最小TTL值。IP报文的TTL字段控制报文能到达的最大网络跳数,所以如果我们把一个报文的TTL值设为3跳,而未收到任何证书注入的响应,我们就能知道注入设备很可能与我们源机器的距离超过3跳。这一技术使得我们能够精准定位注入设备的网络位置。
我们从在哈萨克斯坦部署的VPS上,针对之前检测到存在证书注入的1598个HTTPS服务器,进行了这一类型的扫描。对每一个主机,我们都发起了两次连接,一次包含facebook.com的TLS SNI头,另一次则包含一个未受影响的域名,检测收到响应时的第一跳。在这次扫描的过程中,HTTPS劫持短暂地停止了一段时间,但是如果我们仅观察在发生变化之前扫描的前1212个HTTPS主机,99.5%的结果都显示证书注入行为发生在到达服务器之前的网络路径中的某一跳。在大部分情况下,注入证书返回的网络位置与真正目标主机的网络位置只有3或4跳的网络距离,意味着注入是在距离用户相当近的位置发生的。我们利用相同的技术在美国进行的测试也证实了相似的结果。
通过观察注入发生那一跳所在的IP地址,我们发现95%的时间里,注入发生的前一跳都是92.47.151.210或92.47.150.198,注入发生的后一跳都是95.56.243.92或95.59.170.59。所有这些IP地址都位于AS 9198(KazTelecom),表明AS 9198是目前唯一的造成注入HTTPS证书的网络地址。一个traceroute的示例如下,该实例中证书注入发生在第5跳。
证书注入发生在第四和第五跳之间。
注入的证书
我们也观察了HTTPS劫持所返回的证书的模式规律。当客户端的SNI信息触发了证书注入的时候,返回的假证书似乎是基于服务器的合法证书而不是客户端的SNI信息。这意味着在一次TLS请求中发送包含facebook.com的SNI到一个不相关的站点iqala.kz,会收到一个CN=iqala.kz的注入证书。该注入证书有以下的属性:
和原本主机的证书相同的主题和主题别名(SAN)公钥被替换为一个指定的加密指数为3的RSA-2048密钥有效期(Not Before/Not After)与原本证书相同,但具体时间上有提前6小时整的偏移序列号除最后4字节被修改了之外,其余与原本相同所有其他x509扩展都被移除,该证书是由一个中级证书(C=KZ, CN=Security Certificate)签发,而中级证书又是由根证书(C=KZ, CN=Qaznet Trust Network)签发。中级证书使用2048位的RSA密钥(使用典型的加密指数65537),有效期3年,而根证书则使用4096位的RSA密钥,拥有30年的有效期。
审查痕迹
AS 9198中负责进行劫持的中间组件需要连接到原本的TLS服务器,从而可以获取到其合法的证书,用于验证和替换。我们使用RIPE Atlas检测来发送一个TLS连接到我们控制的服务器,在这台主机上我们可以捕获到来自RIPE Atlas探针的IP数据包。当我们把Atlas 探针客户端的SNI设置为不会触发证书注入的一些域名时,可以在我们的服务器中看到由RIPE Atlas探针发送的正常的客户端hello包,并且拥有一个特定的TLS指纹。但是,当我们把SNI设置为facebook.com时,我们的服务器会收到一个来自HTTPS劫持设备的不同的TLS指纹。与RIPEAtlas的指纹不同,该中间组件的TLS指纹在正常的网络流量中是几乎看不到的。受影响的域名可以使用这一指纹来鉴别连接是否被劫持,对用户进行提示,撤销已经暴露的登录凭据,或者不向用户发送敏感数据。为了进一步分析,我们在这里提供了捕获的数据包。(PCAP包或未发生劫持)
域名目标
HTTPS劫持是由客户端发送的SNI扩展所触发。Censored Planet发现在约10000个测试域名中,有37个域名会触发假证书的注入。这些域名大部分都是社交媒体和即时通讯网站,列表如下:
ISP让用户安装哈萨克斯坦根证书,声称这样可以帮助阻挡诈骗、黑客攻击和非法内容。然而,上面列出的域名表明其真实意图却是监视用户在社交网络和即时通讯网站上的行为。
结语
哈萨克斯坦的HTTPS劫持降低了该国互联网用户的安全性和隐私性。虽然目前劫持还没在全国范围内出现,但似乎政府既希望同时又有潜能,在不久的将来进行大范围的HTTPS劫持。国际社会需要密切监视这一令人忧心的举动,而这一危险信号,已经飞舞在计算机安全界数十年间致力于对所有网站进行高强度、端到端加密的努力和进步的面前。
*本文作者:Kriston,转载请注明来自FreeBuf.COM