浏览器缓存信息泄露

信息安全 网页浏览器 缓存 敏感数据暴露
2021-08-19 18:14:23

观察浏览器加载外部资源(例如图像)所需的时间可能会泄露有关这些资源之前是否曾被访问过的信息。

解释:

例如,通过在第三方网站中嵌入 StackOverflow 徽标<image src="https://cdn.sstatic.net/Sites/security/img/sprites.svg?v=a1e0cd003b7d">并观察其加载速度,该第三方可以推断访问者最近是否访问过 StackOverflow。

这是因为与尚未在浏览器缓存中且需要通过 Internet 传输的资源相比,缓存资源的加载时间要短得多。

可以通过多种方法观察加载时间。其中之一是附加一个 DOMonload事件处理程序并测量从请求源到load事件触发的持续时间。

这种方法有一些需要注意的缺陷:

  • HTTP 响应标头可能会阻止或限制缓存
  • 初始 DNS 解析可能需要一些额外的时间
  • 资源 URL 可能包含一些变量标记

例子:

但是,它通常工作得很好。以下 Chrome 代码片段允许验证用户是否以及何时访问了 pornhub.com [NSFW]:

function cached(src) {
  return new Promise((resolve, reject) => {
    const img = new Image();
    img.onload = (event) => resolve(src);
    img.onerror = (event) => reject(src);
    img.src = src;
    setTimeout(() => img.src = '', 10);
  });
}

cached('https://bi.phncdn.com/www-static/images/pornhub_logo_straight.png?cache=2018011910').then(
  src => console.log('visited between 24.01 and 28.01'),
  src => console.log('not visited')
);

现在,上面的代码片段不健壮且不完整。通过添加更多资源 URL 以及目标网站请求这些 URL 的日期范围,可以创建一个非常详细的配置文件。当然,这是一个比较极端的例子来说明这一点。

问题:

  • 通过浏览器缓存推断信息是一个已知问题,那么是否有可供用户或 Web 应用程序开发人员使用的对策来防御它?这个问题通常是如何解决的?
  • 这种信息披露是否存在现实生活中的漏洞?
1个回答

浏览器指纹识别

您所描述的问题是浏览器指纹识别领域众多技术中的一种浏览器指纹识别主要分为三种类型,通常是相关的。按照研究数量的顺序,它们是:

  • 设备指纹识别,旨在区分个人用户。它侧重于在无法依赖 IP 地址进行识别时在浏览器上查找唯一标识符。这是研究最充分的,有许多可用的概念验证,也是最难缓解的。在极端情况下,无论操作系统或浏览器如何,这都可以检测到唯一设备。

  • Supercookies是网站可以注入浏览器的持久标识符。它们不是真正的 cookie,因此在清除 cookie 时不会被删除。例如,这可以通过巧妙的缓存指纹识别、HTML5 Web 存储、HSTS甚至HPKP来实现。

  • 历史嗅探,其中涉及一个网站检测访问者是否也访问过不同的、非附属的第三方网站。这类似于超级cookies,但依赖于第三方网站无意中设置了一个。历史嗅探技术可用于实现超级cookie,但并非总是如此。这就是你要问的。

还有一种类型的指纹,称为 TCP/IP 指纹,也称为网络堆栈指纹或操作系统指纹。它涉及查看您的计算机正在使用的网络协议的低级结构(设置了哪些选项以及以什么顺序、ISN 和 TCP 序列号等)。避免这种情况需要使用“真正的”代理,例如 Tor(VPN 无法使用,因为它们使用您自己的网络堆栈)。这种技术在它可以收集的信息量上是有限的。由于这不是浏览器独有的,我不会详细介绍它。我建议您查看一个示例 TCP 指纹识别实用程序,例如p0f,以了解有关它的工作原理和功能的更多信息。

缓解措施

为了防止网站检测到您是否访问过给定网站,浏览器不得在访问网站和另一个网站尝试确认访问之间保留任何持久信息。在许多情况下,私有/隐身模式是不够的,因为它只会清除特定的标识符,例如 cookie。最有效的解决方案是拥有一个临时数据目录。这是Tor 浏览器使用的技术,它在浏览器重新启动时避免了最后两种指纹技术,并尝试通过浏览器补丁限制第一种技术。

使用众多“隐私插件”和自定义配置之一并不是有效的缓解措施。在许多情况下,它们实际上是通过减少您的匿名集而不删除所有甚至大部分跟踪向量来添加到您的浏览器指纹中的。一个完整的解决方案需要一个运行标准版本的标准化浏览器,并通过大量补丁来删除可能被滥用于指纹识别的各种功能。Tor 浏览器做到了这一点,但即使它并不完美,并且存在许多针对现有指纹矢量的开放票,具有不同程度的影响。例如,有多个打开的票证可以通过几种不同的方式来识别浏览器正在运行的操作系统。

一般来说,减轻浏览器指纹识别的最有效策略如下:

  • 使用最新的官方版本的 Tor 浏览器。
  • 将“安全滑块”设置为高,这会禁用 JavaScript(一种常见的指纹识别向量)。
  • 不要修改任何配置设置或安装任何插件。
  • 重新启动浏览器以清除指纹,因为它只能隔离会话之间的身份。

即使您只想避免历史嗅探并且不关心设备指纹或超级cookie,这也可能是必要的。据我所知,所有其他浏览器即使在重置配置文件或调用私有/隐身模式时也会保持某种状态,然后可以用来检测您是否访问过某个第三方站点。

现实世界的影响

有各种新闻文章和论文讨论了使用各种形式的浏览器指纹来跟踪跨站点的用户和清除 cookie(或以私密模式浏览)的用户的广告网络我不知道涉及浏览器缓存的任何特定事件,但很可能是因为还有其他更强大的技术可供使用。广告公司通常使用设备指纹识别,画布指纹识别是最常见的载体之一,还使用了更先进和隐秘的技术,例如AudioContext 指纹识别