理解SSL窃听

insecurity

近日在网络传得比较离谱的一条消息是对TLS/SSL应用层的窃听。随着瓷翁生日的临近,长城似乎有越蹦越高的趋势,导致不少人对SSL v3的安全性也产生了怀疑,这里客栈尝试用简短的图文解释一下所谓的窃听如何完成,以及通过什么方式避免。

首先要强调的是,目前没有对SSL v3这个安全协议的可行攻击;所有窃听均需利用客户端(浏览器及用户)的弱点执行,而非对协议本身的直接攻击。

So, in before the fear spreads…

SSL会话破解有三种主要方式一是通过嵌入系统获取密匙,二是通过巧妙的方式进行Cryptanalysis(密码分析),三是设立中间人执行MITM攻击。

假如攻击者能入侵用户主机或服务器,那用户资料就直接沦为刀俎了,再绕道SSL属于白费力气。因此保持个人系统安全对防止第一类“破解”尤为重要。攻击者并不是在破解SSL协议,而是在直接想办法和你的系统挂钩,盗取加密前和解析后的信息。

what-you-see-is-what-it-sees

本地分析加密会话很简单,类似Http Analyzer的软件支持IE,Firefox,Chrome和Safari几款浏览器的请求记录,它们是站在用户与浏览器之间的看客,而非本地与远程主机之间的黑客(对于不支持的软件,例如Opera或Putty,它是无法记录HTTPS请求的)。

第二种方式因缺乏有效的密码分析,并没有实际应用;SSL v3本身没有已知漏洞,解开会话需要利用客户端和服务器端的漏洞完成(获取密匙);等同第一类攻击了。

mitm-basic

相比之下,最可行的SSL窃听方式是第三类:通过MITM。无需获得密匙,无需本地木马,远程窃听者通过建立两条链接:一条从窃听对象到窃听服务器,另一条从窃听服务器到目的服务器,尝试偷换身份并做到会话窃听。

之前我们也说了,协议本身并没有漏洞,因此浏览器的安全设计和用户的安全意识就成了最受考验的部分。第三类攻击要生成不合法的证书,当今的浏览器在遇到该类证书时都会提示错误,但信息的表达方式各不相同,误导用户接受非法证书也时常发生。

mitm-chrome

Chrome 3-beta的警告是最显眼的。

mitm-firefox

Firefox 3.5的警告需要阅读,也算显眼的。

mitm-opera

Opera 10的警告包含有用信息,但未必能帮助分析。

mitm-safari

Safari 4 on Windows的警告和普通提示没什么区别,一点就过了……

mitm-ie7

IE7的警告够简洁,但解释不足。不知道IE8如何(安装不能,无法测试)。

mitm-ie6

IE6的警告有够误导,以多数票计算,这是可以接受的对吧?

为了更好地测试各浏览器在MITM攻击下的反应,这里使用Stanford教学用的简单SSL MITM Proxy来测试。具体设置如下:

先准备好浏览器与Java。下载工具并解压压缩包后,使用命令行工具,转到该目录,并输入以下命令(Linux用户请看Readme)。

java -cp iaik_jce.jar; mitm/MITMProxyServer -localHost localhost -localPort 8001 -outputFile output.txt -keyStore FakeCAStore -keyStorePassword passphrase -v

mitm-client-1

这样就会在本地设立一个窃听用的Proxy,它会尝试修改所有加密链接发送的证书,将自己寄生在加密连接上。(注意该Proxy并不需要安装在本地,它可以安装在信息途经的任意服务器上,包括任何Tor节点。)

mitm-client-3

配置浏览器使用这个代理(localhost:8001),模拟请求通过远程的窃听服务器。和目的服务器配上之后,Proxy就会接收原证书,并制造假证书发送给浏览器,这时浏览器应该提示错误。

mitm-client-4

假如用户选择接受该证书,则余下的通信可被监听,这些通行将被记录在本地的output.txt,各位可自行瞻仰其详尽程度。

mitm-client-5

如果你看到的传输内容是一大串数字,请看Encoding是否启用了gzip,那是gzip后的网页数据;Amazon不启用gzip,直接返回HTML代码。

一个简单的SSL窃听就是这样完成的。但如何防止呢

I. 认真检查URL——这是废话,但也是最致命的用户疏忽。

mitm-key

II. 不要接受非法证书——当前用户关注度不足。

尤其是在存放了个人信息的网站。例子中的非法证书替换了发行者的部分(替换为locahost和stanford),是非常好辨认的错误。实际应用中,普通用户将很难分辨证书的真伪,这时选择拒绝才是上策,不管你有多信任该网站。

对于部分没有证书却强迫使用HTTPS的网站,请避免提交任何涉及个人隐私的信息,以免发生意外(接受非法证书将建立未验证的加密连接,用户和网站都没有办法判断是否有人窃听该链接)。

最后是检查CA机构,CA机构告诉浏览器是否应该相信一个网站:假如你不信任签发证书的那家CA,那它验证的网站你也不应相信(浏览器均内置了CA列表,但根据浏览器的不同,它们支持的CA数量也略有不同)。

mitm-downgrade

III. 不要允许SSL v1和v2——过期的SSL版本。

SSL v1和v2都有已知漏洞,不要允许浏览器降至这两个级别。主流浏览器都有禁止老加密协议的选项。

mitm-filter

IV. 使用现代化的浏览器——你想要安全,却继续使用IE6核心?

有些网站存在HTTPS与HTTP混用的问题,这时要小心拦截。虽然无法在远程修改被加密的对象,但未加密对象是可以修改的;若有攻击者插入隐藏表格或JS代码,数据可能被提交至第三方服务器,而用户不会察觉曾被窃听。IE7+会提醒用户有关“安全与不安全内容同时存在”的问题。

(我发现Opera 10和Safari 4都比较沉默,不会提示“存在未加密对象”,是我没设置对还是它们不受影响就不清楚了。)

实际应用中,由于SSL窃听十分耗费资源,是无法大规模长时间实施的;若你在浏览时经常碰到证书错误的情况,请尝试换用浏览器以排除软件上的错误。若情况继续,祝君好运……话说回来,收买CA机构也许比购买窃听服务器便宜得多;所幸咱们这边没什么大型的CA机构,否则……

大体的解释就这么多了,欢迎留言指教。

完。

2009-09-28 更新添加了备注,欢迎指教。

Author: 店长

The Master of BitInn

37 thoughts on “理解SSL窃听”

  1. 我不太关心技术,反正这段时间翻墙软件集体抽风,就说明老大哥其实早就掌握了拦截技术,只是以前一直睁一只眼闭一只眼,事实就是如此,这很可悲。

  2. 这就比较麻烦了,比如19xxbbs这样的论坛,本身没有有效的证书,使用的是一个错误的证书。

    这种网站也许最容易被这种中间人攻击方法击破,只需要在路由上做一些手脚……因为用户本来就知道这个网站的证书不正确,极少会去二次验证证书的差异。

    Twitter:chenshaoju

  3. Opera 10中如果在https网页中有插入HTTP的内容,数据提交的时候会有警告。
    比如使用https连接的谷歌阅读器,rss有插入外部链接的视频就老是提示个不停。

  4. 好文。防止SSL窃听需要用户自身提高防范,正如作者所说的大规模部署需要大量的资源,最有可能的是小规模的,定点的实施。

    自己提高警惕吧,防人之心不可无。

    1. 明明是Arch Linux竟然会认作Ubuntu,无语。博主换WP-UserAgent插件吧。
      Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.3) Gecko/20090913 Arch Linux Firefox/3.5.3

  5. ca签发证书都会向几个固定的email发送验证信息。比如要伪造一张example.com的证书,ca会向root|webmaster|admin@example.com之类的邮箱发送一封确认邮件,只要点击了邮件中的确认信息,那么就可以证明这个域名是申请人的,然后ssl证书会发送到申请人指定的邮箱去(和用于验证的邮箱可以无关)。email拦截可比ssl劫持要容易得多了。只要拿到系统认可ca签发的证书,自然就不会出现根证书不受信任的警告,然后。。。。

    1. 如今的网络认证你还需要生成被认证服务器本身的CSR,这个只有服务器管理人才知道;同时服务器需要安装了那个证书,方可称之为有效。我不觉得攻击者可以绕过这个。

      用email认证是极度危险的,如今还有CA这样做吗?
      CA自己操作错误导致的问题,浏览器自然帮不上忙;这也是我说用户应该判断自己信不信某个CA的主要理由。

      1. ssl证书申请一般都是基于域名的。只要你愿意,你也可以生成一个google.com的csr并且提交给ca,只要你有能力截获ca发送给google.com的这封验证邮件,你就可以获得一张google.com的ssl证书
        市面上所有品牌的ssl证书,只有高端产品才需要企业给证明才会办法,所有低端产品都是只基于域名和email进行验证。当然,这样颁发出来的证书没有企业的任何标示,只有一个域名的标示。但这样对于ssl劫持已经足够了,只要不出现警告信息,用户是根本不会留意这张证书的可信度

      2. 按照国家信息安全的想法,也许靠国内的pki来“伪造”证书这种事情是很容易的。看样子战争很快就会升级了

  6. 补充下,申请ssl证书的成本极为低廉,几十块钱甚至免费就能拿到(有些域名注册商会随域名注册送一张证书,可以自定义申请内容)

  7. 对了,我再补充一下,国内有某些软件会在安装的时候给用户的机器装上一张自己的root ca并且设为可信。我相信没有一个人会留意到这个问题。windows下强行添加一张root ca是没有任何警告或者提示的

    1. 当店长准确地叫出藏在各种面具之下旅客的名字的时候他们该多么高兴啊……

      1. 就从你开始吧XD

        小众Linux发行版的用户啊,催你们的开发者转UA吧……
        什么关键字都没有,检测个毛啊(翻台

    1. 漂亮的劫持,但这里有三个问题:

      1. sohu让你注册了可用于验证的邮箱;这是sohu的严重漏洞。
      2. PositiveSSL给了你过多的email选择(还是Comodo,mozilla那次也是他们)
      3. 一旦被OCSP认定是非法证书,它立马就无效了。

      这些都不是SSL协议的错。

      1. Iron的图标很好看啊~ 这应该是Chrome的改编版吧,不知道用起来怎么样?说是安全性很强,那么究竟强在哪呢?

  8. 说起来,我这个浏览器其实是Google[b]Chromium[/b]4.0.204.0,是移动免安装版的,只要拷贝就能用,看样子两者并没有区分嘛~

  9. “话说回来,收买CA机构也许比购买窃听服务器便宜得多;所幸咱们这边没什么大型的CA机构,否则……”不幸被言中了…CNNIC

Comments are closed.