浏览器指纹追踪

前言

随着flash逐渐退出浏览器,传统的浏览器指纹开始不适用,为此本文介绍目前最常见的浏览器指纹模型,以及新的浏览器指纹技术,方便需要的人.

浏览器指纹技术

  • 常见浏览器指纹: 常见的浏览器指纹技术;
  • Canvas指纹以及WebGL 指纹: 用过Canvas以及WebGL技术获得指纹信息;
  • 新浏览器指纹技术: 目前前沿的浏览器指纹技术;
  • 驻留技术: 提高cookie的存活率,即使被删也能恢复,甚至是跨浏览器;

引言

  最近研究如何在用户匿名的时候,来标识一个用户,于是就发现了浏览器指纹,浏览器指纹是指用户在使用浏览器的时候,脚本会自动收集用户浏览器的配置信息以及系统信息,而这些信息可以用来唯一的标识一个用户.由于flash组件对于浏览器而言始终是一个隐患,明年Chrome浏览器,会逐步消去flash组件,取而代之的是html5技术,在新的技术下,浏览器指纹信息也要相应的更新.

常见的浏览器指纹技术

  相对比较成熟的浏览器指纹模型是AmIUnique模型.其使用具体指纹属性包含如下几种

属性 来源 例子
User agent HTTP header Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36
Accept HTTP header text/html,applicationxhtmlxml,applicationxml;q=0.9,image/webp,/;q=0.8
Content encoding HTTP header gzip, deflate, sdch
Content language HTTP header en-us,en;q=0.5
List of plugins JavaScript Plugin 1: Chrome PDF Viewer. Plugin 2: Chrome Remote Desktop Viewer. Plugin 3: Native Client.Plugin 4: Shockwave Flash..
Cookies enabled JavaScript yes
Use of local/session storage JavaScript yes
Timezone JavaScript -60 (UTC+1)
Screen resolution and color depth JavaScript 1920x1200x24
List of fonts Flash plugin Abyssinica SIL,Aharoni CLM,AR PL UMing CN,AR PL UMing HK,AR PL UMing TW…
List of HTTP headers HTTP headers Referer,X-Forwarded-For,Connection,Accept,Cookie,Accept-Language,Accept-Encoding,User-Agent,Host
Platform JavaScript Linux x86_64
Do Not Track JavaScript yes
Canvas JavaScript vext quiz
WebGL Vendor JavaScript NVIDIA Corporation
WebGL Renderer JavaScript GeForce GTX 650 Ti/PCIe/SSE2
Use of an ad blocker JavaScript no

  正如我们所看到的,amiunique使用了多个维度的指纹信息.但是有些属性是属于可以更改的,比如屏幕分辨率.由于目前获得屏幕分辨率的方式是通过js代码完成的.如果用户使用Ctrll++,屏幕的分辨率就会不准确了.所以缩放等级可能更加适合用来当做浏览器指纹,或者使用长宽比,因为长宽比不受缩放的影响.
  此外,availHeight, availWidth, availLeft,availTop,以及screenOrientation这四个属性也有一定的用户,因为其表示浏览器的可用屏幕(不包括系统区域),比如mac系统的toolbar是不计算的.通过这个可以潜在的标识一些信息.

Canvas指纹技术和WEBGL指纹技术

  随着HTML5的更新,新的API可以用来获取指纹信息.

Canvas指纹

  HTML5中的canvas元素允许脚本进行2D形状和文本的渲染。通过这种方式,我们可以让一个程序输出打印图案两次,使用不同文字和颜色.来观察他们的区别.

字体探测

  告诉浏览器渲染同一个字符串(一个字符串包含所有字母)两次。 对于第一次强制浏览器使用它的一个备用字体。 根据设备上安装的操作系统和字体,备用字体不同。 对于第二次浏览器被要求使用常见的Arial字体,通过这种方式,我们可以获得其是哪一种操作系统.

设备和操作系统指纹

  例如emoji表情的笑脸在不同系统版本显示不一样,如下图所示,因此通过emoji表情可以判断操作系统甚至是版本信息.
PS-PNG-work

硬件操作系统指纹

  打印字体,观察渲染图像的过程,会有像素点的偏差.虽然此字体具有相同的尺寸,但是在操作系统中,最终图像由于渲染过程的差异,存在像素可见的变化。渲染图像的过程是复杂的,并且依赖硬件和软件(例如GPU,渲染引擎,图形驱动程序,抗锯齿,OS),并且这些层中的任何层中的变化都会使得测试受到影响。有趣的是,测试结果也是相对稳定的,因为在渲染过程中,用户不经常改变图层配置。

WebGL 指纹

  通过WEBGL_debug_renderer_info 接口,获得产品名和供应商名

其他指纹

  Platform(UA),Do Not Track & Ad blocker

新浏览器指纹技术

CPU虚拟核心数

  新的浏览器特性具有hardwareConcurrency函数,即使不支持,我们也可以通过侧信道攻击,也能发现,比如可以在增加worker的数量,观察有效载荷的完成时间。当完成时间随着worker的数量级显著增加时,说明达到硬件并发的限制,使得可以预估CPU核心数量。 当然值得注意的是,某些浏览器(例如Safari)会将Web Workers的可用核心数减少一半,那么我们需要将浏览器指纹的worker数量加倍.

音频上下文

  音频上下文借助OS和音频卡中的音频堆栈,为音频信号产生到信号滤波,提供处理功能。具体来说,现有的指纹识别工作使用振荡器节点生成三角波,然后将波馈入产生压缩效果的信号处理模块,该节点可以抑制较大的声音以及放大微小的声音。 然后,经处理的音频信号通过分析节点转换为频域。
  这种波形在同一台机不同浏览器是不一样的.但是对于跨浏览器,其峰值和它们对应的频率相对稳定.通过映射关系可以将这个作为跨浏览器的特征.其中作为特征的有采样率,最大通道数,输入数,输出数,通道数,通道计数模式和通道解释。
  此处推荐篇论文https://nanshihui.github.io/public/crossbrowsertracking_NDSS17.pdf,其指纹模型目前能够达到99%的识别率.

字体检测

  以往检测字体,是通过falsh达到的,这里使用侧信道攻击,通过测量某个字符串的宽度和高度以确定字体
类型.

驻留技术

  通过各种属性生成的指纹需要长期保存,防止被用户删除,或者可恢复,这就需要驻留技术,驻留技术比较成熟的是evercookie.其存储cookie的思路从以下几个方面

  • 标准HTTP Cookie
  • Flash本地共享对象
  • Silverlight隔离存储
  • CSS历史
  • 将cookie存储在HTTP ETag中(需要后端服务器)
  • 将cookie存储在Web缓存中(需要后端服务器)
  • window.name缓存
  • Internet Explorer userData存储
  • HTML5会话存储
  • HTML5本地存储
  • HTML5全球存储
  • 通过SQLite的HTML5数据库存储
  • HTML5画布 - 将Cookie值存储在自动生成的RGB数据中,强制缓存PNG图像(需要后端服务器)
  • HTML5 IndexedDB
  • Java JNLP 持久化服务
  • Java漏洞利用CVE-2013-0422 - 尝试将applet沙箱转储并将cookie数据直接写入用户的硬盘驱动器。
      以上维度,不是所有浏览器都是支持,但是evercookie提供一个很好的支持.

总结

  对于浏览器指纹,攻与防在不断的转换,目前浏览器指纹也不能绝对的标识一台主机,如果用户切换显卡或者双系统,虚拟机这些因素,那么目前的浏览器指纹就无法唯一标识了.未来随着新的HTML5技术不断更新,新的浏览器技术会提供更多的API.以及通过侧信道技术,在浏览器指纹会有新的突破.

文章目录
  1. 1. 前言
    1. 1.1. 浏览器指纹技术
  2. 2. 引言
  3. 3. 常见的浏览器指纹技术
  4. 4. Canvas指纹技术和WEBGL指纹技术
    1. 4.1. Canvas指纹
      1. 4.1.1. 字体探测
      2. 4.1.2. 设备和操作系统指纹
      3. 4.1.3. 硬件操作系统指纹
    2. 4.2. WebGL 指纹
    3. 4.3. 其他指纹
  5. 5. 新浏览器指纹技术
    1. 5.1. CPU虚拟核心数
    2. 5.2. 音频上下文
    3. 5.3. 字体检测
    4. 5.4. 驻留技术
  6. 6. 总结
|
Fork me on GitHub