破坏匿名的凶手——WebRTC

先和诸位匿名者说一条坏消息[1]:有一个家伙,一个浏览器的API(应用程序编程接口),叫做WebRTC的,可以在使用VPN或设置好浏览器代理的情况下泄露你的真实IP,事实上你的公网IP和内网IP都会被得知。这真的很糟糕啊。

到底是怎么回事?还是让我们先一起看看WebRTC是什么吧。

WebRTC[2](Web Real-Time Communication,网页实时通讯)是一个可以实现网页实时语音或视频对话以及P2P文件分享的API,而且他的P2P功能不受NAT[3]影响。主流浏览器都支持WebRTC。

要知道NAT可是会对P2P造成大麻烦的,因为处在NAT之内的的设备只有内网IP,没有公网IP,事实上都不能说真正接入了互联网。在这种情况下,设备无法被动监听建立连接,那么P2P自然也无从谈起(P2P的时候有一方必须被动监听建立连接的)。

WebRTC通过STUN[4](Session Traversal Utilities for NAT,NAT会话传输应用程序)解决了这一问题:在NAT之后的设备发起通向STUN服务器的连接,从而获得自己的公网IP(STUND服务器会知道公网IP和内网IP,再将公网IP和端口响应回去),然后就可以被动监听建立连接了。

这样一来,P2P问题就解决了,但是同时带来了一个极大的安全隐患:WebRTC可以通过JavaScript(一种大名鼎鼎的编程语言,在网页编程中被广泛采用)程序调用,也就是说你访问的网站可以通过一段JavaScript程序探知你的公网IP和内网IP(具体来说就是网站可以通过JS来抓取STUN服务器返回的请求结果,因为STUN服务器的返回结果是告诉了浏览器的。对,JS功能非常强大,可以直接与本地浏览器交互,cookie就是通过JS去生成和读取的)。你可以访问一下https://diafygi.github.io/webrtc-ips/ 看看,有人写了这个程序[5]

有人看到这里大概会很奇怪吧:”为什么WebRTC能轻易在STUN协议的帮助之下绕过浏览器代理设置,甚至是绕过VPN呢?尤其是VPN,默认情况下启动之后是会修改系统路由表,把操作系统里所有的流量都中转到VPN的虚拟网卡上的。“

问题出在P2P上面。P2P最大的特点就是直连,客户端之间的直连。这一特性使得P2P程序不仅不会遵守浏览器代理设置,而且很多时候连VPN都绕过了,直接忽略了操作系统里的虚拟网卡。还有一点,P2P(特别是bt下载)总是会把你的真实IP给泄露出去,因为你在使用P2P的时候既当客户端又当服务器端吗,为了别人能把你当成服务器,你的IP只能被更多的人知道了:)

补充说明:据读者反映,IP泄露这事是看情况的,有些人的VPN或shadowsocks没有被绕过,但有些就被绕过了。

这事的确够糟糕的,经我亲自测试,连Tor都没能幸免,各种VPN更是全部阵亡,好在现在还没有哪个网站使用了这一追踪技术的相关报道,但估计很快就会有网站这么干了!

那么,怎么办呢?

Firefox:地址栏里输入about:config,回车,找到media.peerconnection.enabled这一栏,把后面的值改为false。PS:Tor Browser这一栏的值默认就是false,不用去改。

Chrome:请安装WebRTC Block扩展[6]。很不幸,扩展失效了,请看最新解决方案:https://plus.google.com/109790703964908675921/posts/JfJMXX9i5nV

IE这次反倒没受影响,不过我依旧建议把IE换掉,总的来说IE的安全性远比不上firefox和Chrome

对了,因为WebRTC需要靠JS程序调用,所以firefox的NoScript和Chrome的ScriptSafe扩展也是能解决IP泄露问题的,前提是你要完全禁止掉网页JS的加载。

也许你们以为浏览器厂商们也是刚刚才知道并发布这一漏洞的吧,错了!他们早就知道了:”WebRTC 通过 STUN 协议获取真实 IP,这个漏洞浏览器厂商(自然包括 Chrome )早就知道,也可能对于 Google 不认为这是一个漏洞,所以没有审查或修复这个问题。像之前名声大噪的翻墙项目 uProxy 就是依赖于 WebRTC,技术核心是 STUN 协议“[7]

事实上,早在一年前就有人在Chromium(Chrome的内核就是Chromium)的开发社区里提出这一安全问题了,结果google的开发者说什么”设计如此“”随着IPv4逐步被淘汰问题就会自然消失“之类,死活都不肯做出任何改变。[8]

我说,就算你们认为WebRTC是必须的功能不能做成用户可选择的模块,那也请你们做一个通知功能,告知用户在启用WebRTC时有IP泄露的危险,OK?这样一直把事情捂着算怎么一回事?太不负责任了吧!

科普文链接集合:https://plus.google.com/109790703964908675921/posts/TpdEExwyrVj

参考资料:
1,WebRTC Leaks Local IP Addresses
http://www.i-programmer.info/news/149-security/8219-webrtc-leaks-local-ip-addresses.html
2,WebRTC
https://en.wikipedia.org/wiki/WebRTC
3,SSL/TLS的原理以及互联网究竟是如何工作的(6)
——嘿,我是IP!
https://plus.google.com/109790703964908675921/posts/8GLWQxp5yJN
4,STUN
https://en.wikipedia.org/wiki/STUN
5,https://github.com/diafygi/webrtc-ips
6,https://chrome.google.com/webstore/detail/webrtc-block/nphkkbaidamjmhfanlpblblcadhfbkdm?hl=en
7,https://twitter.com/oiax/status/561795885730775040
8,https://code.google.com/p/chromium/issues/detail?id=333752&q=IP%20leak&colspec=ID%20Pri%20M%20Week%20ReleaseBlock%20Cr%20Status%20Owner%20Summary%20OS%20Modified