GitHub 和中间人攻击

发什么了什么?

在1月26日晚上8点,微博和Twitter上有报告指出中国用户在访问 Github.com的时候会出现警告错误的SSL证书的信息。这个证据,在后文有列出,表示这是因为中间人攻击造成的。

什么是中间人攻击?

维基百科将中间人攻击定义如下:

中间人攻击…是指攻击者与通讯的两端分别建立独立的联系,并交换其所收到的数据,使通讯的两端认为他们正在通过一个私密的连接与对方直接对话,但事实上整个会话都被攻击者完全控制。在中间人攻击中,攻击者可以拦截通讯双方的通话并插入新的内容。

我们会在后文详细解释到底发什么了什么,但我们现探索为什么此次攻击发生了。

为什么?

在编写此文的时候,大概有大概有5,103,522个计划在GitHub上存储,虽然有许多对中国政府屏蔽/干扰Github理由的猜测,我们着重阐述一种猜测。注意,这完全是我们的猜测。

在1月25日,中间人攻击发生的前一天,以下请愿书的请愿书被递交在白宫官方网站WhiteHouse.gov上:

帮助建立互联网审查的人, 比如建立GFW的人, 应该被禁止入境美国.

这个请愿书在5天内获得了超过8000个签名。为了具体化这个请愿,内容包含了一个帮助中国互联网审查的嫌疑人清单。这个清单被建立在Github上。这个清单招来了上百个评论,大多数是中文评论。其中有一个评论包含了方滨兴-今任北京邮电大学校长,的家庭住址和身份证号码。他被称为GFW之父。

另一个评论链接到了一个更长的帮助建立GFW的人员名单,也是建立在Github上的

在此次事件一个星期前,Github在中国被完全屏蔽。但几天后,屏蔽就取消了。屏蔽的取消是因为意料之外的公众抗议,抗议可能导致中国政府重新考虑封锁Github的决定。中国的许多程序员依靠Github来分享代码。完全屏蔽Github会影响商业公司。Github可能太重要,不能完全屏蔽。

这让中国政府陷入两难的境地。他们不能选择性屏蔽部分页面,也不能检测用户在Github上到底在干什么。他们不能完全屏蔽Github,伤害了在中国的公司。这样中间人攻击是唯一可行的方案。利用伪造的SSL证书,中国政府能窃听并且监控加密的流量。

白宫网站的请愿书没有被屏蔽。但是Github上面的名单更引人瞩目,因为用户能在名单下面自由评论与合作。因为到Github的流量是加密的,中国政府取消了对Github的完全屏蔽,他们唯一的审查手段是中间人攻击了。

此次攻击发生在周六晚上。攻击非常粗糙,因为伪造的证书是自签名的,一定会立即被发现。此次攻击持续了1小时。整个过程看起来非常不理智。不难想象,一个或几个在名单上的被指为自由互联网敌人的人员私自决定采取行动。他们是GFW背后的技术人员,所以他们完全有能力进行此次攻击。他们也有动机,因为他们在白宫请愿书上被个人攻击了。他们没有其他任何手段,因为他们被禁止完全封锁Github.

虽然此次攻击事件非常段,但很多Github用户的密码可能已经被记录了。并且,访问部分URL(比如GFW人员清单)的IP地址已经被记录了。维护这些清单的人员应该当心。

这个清单仍然建在。无论白宫请愿书是否收集到100000个签名,从而出发白宫官方回应,这个请愿表明对帮助政府审查互联网的人会遭到越来越大的压力。这次对审查的愤怒,已经对审查人员的攻击可能给未来招聘审查技术人员带来困难。

中间人攻击发生过么?

胖鸭子的部落格这个博客描述了2011年对Skype登陆页面的中间人攻击,当时域名似乎被DNS劫持。这是一个更加粗糙的攻击,因为域名被劫持到“北京市公安局网络安全保卫处”公开注册的IP地址。这个攻击看起来没有必要,因为Skype在中国与Tom合作,将用户的所有数据都通过中文的服务器传输,用户信息被监控。但是,如果你通过https://login.skype.com 登陆和注册,你会使用中国境外的服务器。这个攻击可能是为了获得使用原版Skype的用户信息。

中间人攻击在叙利亚被使用,来监控活动,目标是激进分子的的Facebook。

这还会发生么?

Github是一个只支持HTTPS访问的网站。这意味着所有通讯的默认加密。只有终端用户和Github能知道哪些信息被上传和下载。GFW,虽然所有出入中国的流量都要经过,只知道用户正在获取从Github获取数据,但不知道具体是哪些数据。这意味着中国政府不能选择性的屏蔽部分Github页面,他们能做的只是完全屏蔽整个网站。

HTTPS有效的阻止了半个GFW的功能。我们已经阐述过为什么Gmail没有被完全屏蔽,因为Gmail过于重要,完全屏蔽它的后果太严重。苹果的App Store也是这样。现在看起来Github也加入到这个重要名单中了。其他类似的网站可能包括Google搜索和维基百科。如果每个网站都切换到HTTPS,中国政府只有两个手段。完全屏蔽或者完全不屏蔽。他们越害怕完全屏蔽带来的公众反应,他们的能做的就越少。中间人攻击看起来越来越有利。

从我们在后文呈现的中国浏览器份额来看,即使是无效的SSL政府也极可能被许多用户接受,因为错误警告非常弱。如果中间人攻击变得平常,越来越多的用户将学会重视这些警告信息,并可能切换到更加安全的浏览器,比如Google Chrome或者火狐。

没有任何浏览器会阻止中国政府能使用他们的终极武器:被中国互联网络信息中心(CNNIC)办法的证书。CNNIC被中国政府控制。它被所有主流浏览器信任为根证书颁发机构。如果它颁发一个伪造证书来使用中间热攻击,没有任何浏览器能提出警告。

比如这样一个针对Gmail的攻击,你能像平常一样成功登陆Gmail,没有任何警告信息*。但是,你的密码和所有行动都可能被中国政府监控。

更新:Google Chrome浏览器实际上能提出警告,并且阻止访问,如果Gmail的证书是被另一个根证书颁发机构颁发的。这对许多Google网站和其他一些大型的“已经提出要求”的网站有效。这个手段叫做ublic key pinning感谢N.S(右侧评论)提供的信息。

这样的攻击只有用户人工考察证书才能被发现。虽然大部分用户不会这样做,但是只要一个用户发现了,后果是国际性恶丑闻,并且会导致主流浏览器撤回对CNNIC的信任。所以政府在万不得已不会这样做。

同时,完全不信任CNNIC会进一步让中国互联网远离全球互联网。中国太大,不值得这样做。国际安全社会只是简单的希望CNNIC遵守规则。中国的激进分子依靠加密的Gmail和Github也依靠这样的希望。

如果你并不信任希望,并且希望人工删除CNNIC的证书,编程随想有一个移除教程。Greatfire.org的人员也不是信任中国政府的粉丝。我们的自动测试系统现在还不能检测SSL证书的状况,但是我们会努力把SSL证书检测也加入系统。

攻击的证据

我们的系统没有检测到这次攻击是如何发生的。我们依靠以下的线索。许多证据都在Solidot上被列出。这次对Github的攻击的间接证据是Github在被攻击前几天刚刚被完全封锁

Github在被攻击是并没有被DNS污染。我们系统的在同一天的测试(github.com 和 https 版本)都表明在中国和美国访问都是同样的IP地址,Wireshark得到的数据也是这样。这表明,数据在传输中被干扰了。用户与Github的IP地址进行连接,但数据被干扰,用户获得的SSL证书不是真正的网站证书。

更多关于技术的讨论在YCombinator

1. 微博用户的截图

以下截图表明当用户试图用Chrome浏览器访问Github时受到证书错误的警告。

2. Wireshark的数据文件

被未知用户上传到 CloudShark我们的镜像

3. Twitter上的报告

4. 伪造的 SSL 证书

被未知用户上传到 MediaFire我们的镜像. 见以下的对照表格来观察原始证书和伪造证书的区别。

GitHub.com 真正的SSL证书伪造的 GitHub.com SSL 证书

那款浏览器能保护你?

中间人攻击并不是一个新现象。浏览器提供商早就提供了防御措施。这次的攻击非常粗糙-伪造的SSL证书没有被任何已知的证书颁发机构签名。几乎所有的浏览器都会对此报错,详情见以下截图。你可以尝试访问https://github.greatfire.org 来获得浏览器的报错警告。这样你就能知道受到攻击的用户会受到怎么样的警告了。

如果你想获得更加逼真的体验,请把以下字段加入到Hosts表中,然后访问https://github.com

54.235.205.92   github.com

使用以上的方法,我们对警告信息进行了截图,主要针对中国的主流的浏览器,以及Firefox和Chrome。后两者虽然只被中国少数用户使用,但更加安全。

所有的浏览器都会进行报错,但是如果你着急想上这个网站,并且不知道中间人攻击的后果,你可以会点击”继续“。如果你使用360安全浏览器或者使用IE6,这两者占到中国一半的市场,你只需要点击一次继续即可。之后你不会受到任何警告。当你同意第一次的警告后,360所谓的“安全浏览器”竟然还会显示一个绿色的钩,来表示此网站是安全的,

Chrome 和 Firefox 的安全措施最好。只要你在Github被攻击之前访问过它的网站,Chrome和Firefox不会让你跳过安全警告。但是用户可能会换一款浏览器来访问网站,来完成他们的工作

 首次访问再次访问
360安全浏览器 (27% 市场份额)警告。一键继续。无警告。绿色的勾表示安全证书是有效的。
 
IE6 (22%)警告。一键继续。无警告。
IE8 (21%)未测试。未测试。
IE9 (5%)警告。一键继续。在地址栏显示“证书错误”。
Safari (3%)警告。一键继续。无警告. 锁表示连接是安全的. 此外, 点击锁会显示正在使用加密通道的误导信息。
Chrome (2%)警告。如果你在攻击之前访问过Github,则不可能继续。 “你不能继续,因为网站要求使用更严格的安全措施。”. 这是因为 HSTS.

如果你在攻击之前没访问过Github,则可能继续。
如果 HSTS 已启用,不可能继续。否则,可能继续。
Firefox (1%)和Chrome一样. 如果你在攻击之前没访问过Github,建立一个安全例外是可能的, 但建立安全例外需要多次点击。

发表评论