Security of Browser

Rainbow Reine

by @uglefisk, from AGORA Awards 2019

之前一直纳闷为什么“出国”时,发现都讲中文,说好的世界语呢?直到有一天好心人whoer指出了原因,我的隐私泄露了,还给我列出了一系列数据。
如家庭住址(IP)、服务号(DNS)等等,详细的令人发指。还好whoer又告诉我如何去保护隐私的方法。

主要建议为两点:

  • 更改浏览器的配置
  • 更改我家的默认服务号(DNS)

浏览器里的WebRTC

WebRTC (Web Real-Time Communication),中文翻译为网页即时通信,是一个支持网页浏览器进行实时语音对话或视频对话的API。它于2011年6月1日开源并在 GoogleMozillaOpera 支持下被纳入万维网联盟的W3C推荐标准。

漏洞(Bug)

2015年,TorrentFreak报告了一个 WebRTC 的安全漏洞,该漏洞会致使安装有 WebRTC 的使用者泄露真实IP,即使用户已经使用虚拟私人网路(=-V-P-N-=)。

解决方案

wikipedia.org上给出了解决方案。

  • Microsoft Edge: 在地址栏输入「 about:config」,搜索「开发人员设置」选项并点击「在WebRTC上隐藏我的本机IP地址」,即可隐藏IP地址。
  • Mozilla Firefox:在地址栏输入「about:config」,搜索「media.peerconnection.enabled」并双击将值改为「false」,就可将WebRTC关闭。
  • Google Chrome:在谷歌应用商店安装谷歌官方扩展「WebRTC Network Limiter」。
  • Opera:在官方应用商店搜索并安装「WebRTC Control」扩展。
  • 其它方案
  • uBlock Origin:安装「uBlock Origin」并在设置中启用「避免WebRTC 泄露本地IP地址」可以避免本地IP泄露。但需注意的是,该方案不适用于Firefox 41(或更低)、uBlock Origin 1.3.3(或更低)版本用户。
  • WebRTC Control:对于主流浏览器(Firefox, Opera, Google Chrome…),此扩展基本上都已经支持。

Language(语言)

  • Mozilla Firefox: 在地址栏输入「about:config」,搜索「intl.accept_languages」,去除「zh」,改为「en-us,en」。
  • System:请善用 Google/Baidu

TimeZone(时区)

  • In Linux:
    1
    :~$ sudo ln -s -f /usr/share/zoneinfo/Europe/Paris /etc/localtime
  • In Winwos: 点点鼠标即可。

DNS

浏览器打开一个网站的时,首先向 DNS 服务器发起域名解析请求,获取到域名(网站)所对应的 IP 后,再向网站服务器发起 HTTP 请求。
HTTP 请求不会包含用户当前系统所设置的 DNS 服务器的 IP 地址,原则上网站是获取不到用户系统的 DNS 服务器的 IP 地址。
人类的智慧是无穷尽的,正面无法获取用户隐私(DNS 服务器 IP)了,就想出了一个“曲线救国”的方法来获取用户更多详细隐私内容。
在万网上自建一个DNS权威服务器来解析一个特定的域名,然后让用户去解析此域名。

获取用户本地 DNS 服务器地址的流程图

自建 DNS 权威服务器很简单,直接像 VPS 提供商购买即可。

浏览器打开一个网页的主要流程如下:

  1. 向 DNS 服务器发起域名解析;
  2. 向网站服务器发起 HTTP 请求;
  3. 网站服务器响应 HTTP 请求。

在这个流程第 1 步中,客户端发送域名解析请求到 DNS 服务器,不会与网站服务器发生交互。
在第 2 步中,客户端会发送 IP 地址、浏览器信息、语言等信息到网站服务器,这其中也没有包含 DNS 服务器的信息。
那么,DNS 服务器地址是在什么时候泄露的呢?

经过抓包分析,发现浏览器发起了一个 CSS 文件的请求,地址为:

1
https://twfos1559410.ba.whrq.net/css/null.css?_=1456472191430

随后又向网站服务器发起了一个请求,告诉网站已查询到 twfos1559410.ba 的地址,请求地址如下:

1
https://whoer.net/zh/dns?domain=twfos1559410.ba&_=1456472133109

其中 domain 这个参数的值 twfos1559410.ba 与前一个请求的域名前半段一致,是个随机字符串。
看来,获取客户端 DNS 服务器地址的关键就在这里。

使用 dig 命令查看该域名的解析流程,命令如下:

1
:~$ dig twfos1559410.ba.whrq.net +trace

dig 命令的返回结果中,比较关键的一行是:

1
whrq.net.        172800    IN    NS    ns8.whdn.net.

这是一条 NS 记录,即所有 whrq.net 的子域名由 DNS 权威服务器 ns8.whdn.net 负责解析。
如果该 DNS 权威服务器手脚不干净,并与网站服务器有“串通“,那么网站服务器就可以获取到客户端的 DNS 服务器的地址了。

具体流程如下:

  1. 客户端向网站服务器发起 HTTP 请求;
  2. 网站服务器返回的网页中包含一个由随机字符串组成域名的 CSS 链接;
    https://twfos1559410.ba.whrq.net/css/null.css
  3. 客户端浏览器解析到该 CSS 链接的时候,需要先向客户端 DNS 服务器发起请求解析该域名;
  4. 客户端DNS服务器向DNS权威服务器ns8.whdn.net发起解析twfos1559410.ba.whrq.net域名的请求。
  5. DNS 权威服务器 ns8.whdn.net 记录下随机数 twfos1559410 与客户端 DNS 服务器的 IP 地址。
  6. DNS 权威服务器将客户端 DNS 的 IP 地址告诉网站服务器。
  7. 客户端向网站服务器发起请求获取客户端 DNS 的 IP 地址。

至此,网站获取客户端DNS服务器IP地址完成。

如何应对这种情况呢?只能在”出国留学”时使用远程 DNS 解析网址,或者修改本地 DNS。

修改本地 DNS:

1
2
3
:~$ sudo vim /etc/resolv.conf
8.8.8.8
208.67.222.222

References:

  1. 阿毛的博客
  2. WikiPedia