通过互联网进行秘密交流的能力,对于异政见分子和激进分子是非常重要的。话又说回来,几乎每个人都会关心网络上的隐私问题。
虽然 Tor网络 本身给用户提供了一个较高的隐私安全级别,让大多数人几乎无法发现使用者的真实IP。但是,这还不足以保护用户的隐私。当你浏览网页的时候,你的身份可能因为浏览器漏洞、cookie、浏览器历史记录、浏览器插件之类的问题而泄露。
Tor浏览器 是一个使用Tor进行预定制的Firefox,在用户浏览量web网页时,能对其隐私进行保护。浏览器插件会被禁用,浏览记录和缓存并非持久存储。只要你关闭了浏览器,一切痕迹都会被抹去。
防止用户的IP泄露,是一个保护他们隐私的关键点,而且我们还需要考虑许多其他东西。Tor浏览器的一些配置,或许能防止许多可能获取用户隐私的东西,不仅仅是Tor网络本身提供的通信保护。
Tor浏览器试图解决一个普遍性问题,那就是用户指纹。如果用户在某个网站能生成一个独特的指纹,追踪者就可以用来甄别每个访问该网站特定页面的用户,以便及时跟踪这个用户的活动。比如,一年中有相似访问记录的,我们可能判断其为同一用户。
更糟的是,追踪者有可能在你访问正常网络时,将你匹配为在访问Tor网络时的同一指纹。Tor浏览器在这点下了不少功夫,阻止追踪者通过指纹识别用户。
在过去,我们见过了许多识别指纹的方法,Tor浏览器自然作出了相应的对策。比如读取文本的大小,屏幕尺寸,当地时间,操作系统信息等。
浏览器指纹中, Canvas指纹 是非常知名的。然而现在很多可以用来识别用户身份的指纹,在Tor浏览器已近被禁用掉了。
在过去的几周,我能在可控环境内识别出tor浏览器的指纹,我们在这里分享下其中有趣的研究结果,以便进一步讨论如何改善Tor浏览器。
这里提供鉴别指纹的方法是基于Javascript的,现在的Tor浏览器都是默认启用的。我创建了一个简单而有效的POC,并称之为UberCookie。
UberCookie的demo
Tor浏览器有个有趣的指纹,那就是Javascript函数Date.getTime()(unix时间),会每100ms执行一次刷新,所以你不能计量低于100ms的事件。这避免了特定web页面的Javascript代码对用户指纹进行匹配计量。因此我尝试了一些事件,为了绕过这个限制,它们会超过100ms。
其实用Javascript有许多办法,可以来衡量在Tor浏览器里低于100ms的事件,有些显而易见,有些则显得非常有趣。
首先,我增加了一个简单的变量,每秒会使用setInterval递增一个计数,即使这个精度并不是毫秒级别的,也是比Date.getTime提供的100ms精度更优的。
另一种测量时间的办法,则是用css3创建一个动画,配置好1ms的间隔,并监听animationiteration事件。
然而,我在web上使用setInterval进行递增能达到更好的效果。
Tor浏览器(大多数浏览器也一样)的鼠标滚轮事件会在web网页中滚动时,泄露潜在的硬件信息。这个事件提供了delta滚轮的信息,然而如果你使用是正常电脑鼠标,delta会是三个。但是如果你使用的是触控板,delta的数量就变为一个变动的值,这个值将与你的触摸板和使用模式挂钩。
鼠标滚轮还会因其滚动速度,泄露操作系统信息和硬件性能信息。
我在这里创建了一个可用的实验POC:
滚轮信息泄露demo
这个演示创建了三个图表,其中一个与滚动速度有关,另一个跟delta挂钩,最后一个与用户滚动次数有关。
还有一个有趣的指纹可以揭示一些信息,那就是鼠标在网页中移动的速度。因为鼠标移动的速度是靠相关操作系统和硬件进行控制的,如果你使用上面提到的测量时间的策略,可以由Javascript对其进行读取。
测量网页上鼠标移动的平均速度,可能也是非常有趣的。
随着在web上setInterval精度的提高,我们可以创建一个CPU(或者内存)密集脚本,试试用户的浏览器会花多少时间去执行它。
我找了不同的电脑做了测试,在相同Tor浏览器版本的情况下,得到了完全不同的结果。
我在tor浏览器上发现的最有趣的指纹向量是 getClientRects ,阻止从canvas读取返回值,
却会询问javascript的API特定某个DOM元素会在屏幕上如何绘画,在这里并没有任何限制和保护。
getClientRects可以得到精确的像素位置,以及给定的DOM元素画出的框大小。依据分辨率、字体配置和其他因素,getClientRects能得到不同的结果。这能让我们快速轻松地得到指纹向量,这点比固定的canvas指纹更优。
getClientRects在相同页面、相同版本的tor浏览器、不同的电脑上的案例:
电脑1:
电脑2:
正如你所看到的那样,getClientRects在这样的情况下,在相同页面和相同的DOM元素有很大的不同。
电脑1上使用ubercookie的POC的案例:
Clientrects:{"x":131.5,"y":462,"width":724,"height":19,"top":462,"right":855.5,"bottom":481,"left":131.5} scrollingmilis:[2,2,0,3,0,1,0,2,3,0,0,3,1,2,2,1,2,1,4,4,35,2,1,3,0,1,0,3,0,1,0,3,0,1,0,3,1,0,3,1,3,0,1,3,2,4,4,8,44,4,1,4,4,405,2,3,2,1,3,1,3,57,2,0,2,2,0,2,2,4,60,2,0,2,2,0,2,2,6,54,2,2,2,0,2,1,4,8] scrollingdeltas:[3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] Biggest mouse step: 65 In a few seconds, the result of theCPUbenchmark will appear, please wait... CPU Mean: 3245
电脑2上使用ubercookie的POC的案例(相同版本的Tor浏览器):
Client rects: {"x":159.51666259765625,"y":465.25,"width":664.6500244140625,"height":18.449996948242188,"top":465.25,"right":824.1666870117188,"bottom":483.6999969482422,"left":159.51666259765625} scrolling milis: [0,3,0,2,2,2,2,0,3,0,2,1,2,2,1,3,1,1,4,1,2,1,1,3,1,2,2,3,2,5,3,3,5,3,0,0,2,0,2,0,1,1,0,2,0,3,2,1,1,3,1,3,2,3,1,3,2,2,2,2,0,2,3,2,2,2,244,0,2,1,2,1,3,2,0,2,0,1,2,1,0,2,0,3,1,0,2,1,1,1,2,1,1,1,1,1,1,2,2,1,2,2,2,2,1,4,2,2,2,2,2,4,2] scrolling deltas: [3,0.975,1.65,1.5,1.725,2.25,2.775,2.4,3.15,3.375,3.975,3.675,4.35,4.95,5.625,5.55,5.25,5.25,4.2,6.3,9.975,13.95,7.575,6.9,2.85,5.925,8.85,0.9,4.425,3.675,4.725,2.625,2.4,5.475,2.625,3.675,5.4,5.775,7.275,6.975,8.175,9,8.475,3.45,2.475,2.25,0.6,1.8,11.1,8.4,8.475,8.1,7.5,6.375,8.175,4.95,4.8,4.275,3.525,3.375,1.125,2.7,2.175,1.95,1.65,1.2,1.05,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] Biggest mouse step: 40 In a few seconds, the result of the CPU benchmark will appear, please wait... CPU Mean: 4660.5
很明显,getClientRects是完全不同的,它给我们提供了一个有趣的指纹向量。滚动速度milis不同,而且滚动delta也是不同,因为硬件有差异。你可以在上面的数据里看到,电脑1的鼠标是最快的。CPU benchmark提供了不同的结果,电脑1很明显比电脑2要快。
用户即使使用Tor浏览器,我们还是很容易跟踪他们的网络活动,关联他们对不同页面的访问行为的。getClientrects为识别Tor浏览器用户提供了一个非常有趣的指纹向量。CPU benchmark和鼠标滚轮以及鼠标速度,甚至在区分相似用户上,给我们提供了更多判断信息。
*参考来源: jl ,FB小编dawner编译,转载请注明来自FreeBuf黑客与极客(FreeBuf.COM)