HTML 5 APIs 是如何跟踪用户轨迹的

jopen 9年前

如果你认为 IP 地址、cookies 和 HTTP 头是在 web 上唯一标识和跟踪用户的要素的话,那么你就大错特错了!

新的现代化特征辨别技术依赖于以下多种要素:

  • IP地址

  • Cookies

  • 语言

  • 时区

  • HTTP 头(用户代理, 参考页等)

  • HTML5 APIs(WebRTC, Battery API等)

  • HTML5 和 CSS3 特征检测

  • CSS 媒体查询

  • WebGL

  • 浏览器插件(Flash, Silverlight, Java等)

  • 浏览器加载项

  • 浏览器选项(阻止浏览器追踪等)

  • 浏览器存储

  • 系统字体

  • TLS/SSL 会话ID

  • 硬件检测(摄像头,麦克风,触摸屏等)

  • 屏幕(分辨率,色彩深度,像素等)

  • 音视频编解码器

  • 装配特征

最近 W3C 在 HTML 标准中允许开发者与用户设备通讯,以增强网页、App 和游戏设置。很多 API 被开发出来以便更精准的辨别用户身份已不足为奇。


什么是指纹特征呢?

想象一下,当你走进一家商店入口处,一个高级的摄像头对你进行扫描,然后保存你的相关信息,如:体型、身高、肤色、服饰、鞋子、走路姿态、语调等。所有这些数据将被排成一个序列,然后通过一个哈希函数来计算你的特征图谱。下次你再来到这家商店或属于相同机构的其他商店时,通过快速分析你的特征,即使你着装风格不同,也能将你与之前访问的那个人联系起来。

使用浏览器访问网页也同样如此(不需要用户做任何特别的操作)。无论你尚未登录或者禁用 cookies,它都可以将用户与一个标识联系起来,它还不是百分之百的准确但一直在改进。

电子前线基金会(Electronic Frontier Foundation)在出版的“Web浏览器如何独特?”(PDF)一文中研究了浏览器的用户跟踪。WebKit WikiWikipedia上有设备识别的精确描述。

客户端的JavaScript

如果你想对指纹特征有更好的了解,可以查询一下 web 开发者专用的 JavaScript 库:Fingerprintjs2

要想有效地防止识别指纹特征的脚本运行,你可以通过阻止全局 JavaScript 的运行来实现,又或者使用NoScript 或者 uMatrix 拓展。但还有很多因素会暴露过多与你相关的信息,并且会继续保存在其他未知的指纹特征方式中。

HTML5 APIs

得益于新型的 HTML5 标准,开发者在某些情况下不需请求批准,就有有权限去获得和检测的用户信息或硬件设备。以下的 API 仍处于无监管下被滥用。要避免这种情况,最普遍的方法是禁止 JavaScript 运行,或者使用特殊的加载项。

Canvas

这是令人讨厌,隐秘和(启用 javascript)几乎就不可停止的技术,从 2012 年以来就积极被利用,在广泛使用的脚本(记得添加这个 “探索”找到替代品放到 cookies 中)中偶尔嵌入。

当浏览器访问一个网页是一个 canvas 的指纹脚本,它就被要求去绘制一个隐藏的图形并转换为一个令牌。令牌的独特性等因素取决于浏览器,操作系统和安装的图形硬件。

为了避免 Canvas 指纹你可以:

  • 显示全局 javascript

  • 使用 NoScript, uMatrix 或者CanvasFingerprintBlock (仅Chrome支持) 扩展

  • 使用 Tor 浏览器

电池

由于检测电池状况的 API 能够获得设备电池的充电时间和放电时间。这些数据一旦结合起来就会近似于每个设备和电池状态的特征,成为网络中跟踪活动的潜在因素。

一篇名为《正在泄露的电池——对 HTML 5电池信息 API 的隐私调查》的论文针对 Linux 系统上的 Firefox 浏览器用户进行了调查。其中最深刻的研究结构是:“我们打算对电池状态 API 进行小改造,并在 Firefox 浏览器里运行,去定位调查中的隐私流出。后来,我们给 Firefox 的漏洞汇报被接受了,而且开始修复漏洞。

在 Chrome 浏览器,你可以安装名为 Battery Info Blocker 的加载项去禁止网站获取你的电池信息。

WebRTC(Web Real-Time Communication,网页实时通信)

当你不使用 WebRTC 时,应当禁止它。WebRTC 不仅会泄露你的本地 IP 地址,还会在 V*N 上泄露你的 IP 地址(在 Windows 系统下),这不同于采集系统的指纹特征的因素

为了避免 WebRTC 泄露你的隐私,应该使用 Firefox 浏览器并且禁止 WebRTC,这可以通过打开about:config,找到值为 media.peerconnection.enabled 的项并且设置成 false

在 Chrome 中,你可以安装名为 WebRTC 的加载项,否则会发生隐私泄露。

资源时序

开发者能够使用 API 去收集完整的与文件资源有关的时序信息。在 Working Draft 中有表达对隐私的担忧:“统计性的指纹特征是一种对隐私的担忧,恶意网站会通过检测浏览器缓存的时序信息,包括访问和忽略第三方网站的资源,来判断使用者是否访问过第三方网站“

如果你使用 Firefox 浏览器,可以通过打开 about:config,并且把选项 dom.enable_resource_timing, dom.enable_user_timingdom.performance.enable_user_timing_logging 设置为 false,来阻止这些 API 运行。

在 Chrome 浏览器下,唯一的办法是禁止 JavaScript 脚本运行。

Geolocation(地理位置)

如果使用这个功能,它会泄露你的物理位置,侵犯你的隐私。现代浏览器总是询问许可来泄露地理位置给网站和 app。

在 Firefox 上禁用这个功能,你应该在地址栏上输入 about:config,找到 geo.enabled 的值,设置其值为 false。

在 Chrome 点击设置(Settings),从显示高级设置(Show advanced settings)上,找到隐私(Privacy)并且点击内容设置(Content settings), 在窗口里找到定位(Location)并设置选项不允许任何网站追踪你的物理位置(Do not allow any site to track your physical location)。

硬件指纹识别

一篇名为 “Hardware Fingerprinting Using HTML5” 的论文(PDF)提到,有一项新的潜在的技术,它基于与硬件设备通信的能力,来获取特定的硬件指纹,作为对基于软件的指纹(浏览器,操作系统,等)的补充。

这篇论文提到,例如 GPU(现代浏览器使用硬件来加速),摄像机,扬声器,麦克风,运动传感器,GPS 和电池等硬件,都可以被 HTML5(未必需要用户许可)访问,尤其是 GPU,对进行指纹识别的用户很有用。

链接

设备指纹识别
https://en.wikipedia.org/wiki/Device_fingerprint

什么是设备指纹识别
https://trac.webkit.org/wiki/Fingerprinting

EFF: 你的网络浏览器到底有多特别? (PDF)
https://panopticlick.eff.org/browser-uniqueness.pdf

EFF: Panopticlick测试您的浏览器,看看它有多特别
https://panopticlick.eff.org

网络不会遗忘:疯狂的持续跟踪机制
https://securehomes.esat.kuleuven.be/~gacar/persistent/

HTML 5的电池状态 API 的私密性分析
https://eprint.iacr.org/2015/616.pdf

资源定时 API 工作草案
http://www.w3.org/TR/resource-timing

使用 HTML 5 进行硬件指纹识别
http://arxiv.org/abs/1503.01408

浏览器漏洞和网络浏览器的指纹识别
http://browserleaks.com

现代的&灵活的浏览器指纹识别库
https://github.com/Valve/fingerprintjs2