今天分享的论文主题是基于浏览器网站图标缓存的持续跟踪,由伊利诺伊大学芝加哥分校计算机科学系的研究人员完成。该论文介绍了一种新颖的跟踪机制,利用了一个通用的浏览器功能:网站图标(favicons),使网站可以通过图标缓存中条目的唯一组合来创建和存储唯一的浏览器标识符,无损地从图标缓存中读取该标识符,从而跟踪用户在整个浏览会话中的活动。该论文已被网络安全领域顶级会议NDSS 2021录用(共录用87篇,录用率:15.2%)。
全文约2500字,阅读时间约7分钟。
图标(favicon)是现代浏览器专门用于改善用户体验而提供的一种功能。最初是为了帮助用户快速区分书签列表中的不同网站而引入的。其会显示在浏览器中的不同位置,如地址栏、书签栏、选项卡等等。目前,所有主流浏览器都支持favicon的获取、渲染和使用。
现代浏览器由于性能原因,会对favicon进行缓存,以便重新访问时,无需再获取对应的favicon,而是直接从cache加载。现代浏览器的favicon缓存具有以下特点[1]:
持久性(不受用户清除浏览器缓存影响)
未隔离性(不受无痕模式影响)
而这两点提供了favicon缓存作为跟踪向量的适用性。
图表 1 Alexa top1万的网站中图标的有效期
威胁模型:论文提出的攻击模型,便是在用户浏览器带有图标缓存机制的前提下,将浏览器的favicon缓存中条目的特定组合作为用户浏览器标识符,对用户在会话中的活动进行追踪。其中,攻击者是用户可能访问的任何网站;而只要使用了带有图标缓存机制浏览器的用户,即可能成为受害者。
基本思路
用户追踪攻击的关键,便是为每个用户生成唯一的追踪标识。本篇论文的追踪方式,是对网站下的每个子域生成一个不同的favicon,每个favicon是否被用户缓存作为标识符中的一位,即用户浏览器缓存中,若某个子域的favicon存在,则该浏览器标识符中对应的位值为1,否则不存在,则为0。
整个追踪流程大致为:在用户第一次访问这个网站时,攻击者就会通过某种方法对其生成一个favicon缓存标识符,并写入到用户浏览器的favicon缓存中;之后,用户再访问时,攻击者就可以通过某个方法读取之前写入到浏览器缓存中的标识符,并以此对用户进行追踪。
假设攻击者控制了网站,只要用户访问了网站主页(主域),攻击者便可以在没有任何用户交互的情况下强制浏览器访问子域。
图表 2 用于写入/读取浏览器ID的服务器端进程的整体伪代码
图表2的伪代码介绍了具体的用于写入/读取浏览器ID的服务器端进程,下面将对上面的伪代码进行详细解释。
图表 3 判断是否第一次访问的伪代码
进程的第一个判断是:查看当用户访问页面时,服务器是否请求了基本域的favicon。如果该favicon被请求,则这是用户的第一次访问,进程进入写入模式;否则,这是用户的后续访问,进程进入读取模式。
图表 4 写入模式的伪代码
1. 首先,进程会生成一个ID作为该浏览器的唯一标识符。
2. 之后,会根据该ID映射到特定路径重定向链,即将二进制向量转换成子路径,使得每个路径表示N位向量中的一位。
图表 5 写入模式的流程示意图
3. 然后,通过302状态码,遍历上述生成的重定向链,让用户浏览器重定向到这些子路径,获取每个子路径对应的favicon,存到浏览器的favicon缓存中,完成标识符的写入,即在用户浏览器中写入了对应该浏览器的唯一ID。
图表 6 写入模式的伪代码
1. 首先,进程会先初始一个N位的ID向量,每位都设为1(此部分伪代码在图表2开头)。
2. 为了重建ID,可以通过JavaScript以及302状态码强制用户浏览器重定向到重定向链中的所有可用子路径。如果接收到浏览器对新子路径的favicon请求,则代表该浏览器的favicon缓存中不存在此图标,ID中对应该子路径的位的值为0。同时,返回404状态码,以保证在后续访问中重建标识符不会改变缓存条目的现有组合。
3. 遍历完成后,当前ID即为存储在该浏览器的唯一标识符。
图表 7 读取模式的流程示意图
作者在主要操作系统平台上,对最主流的浏览器是否支持favicon缓存标识攻击进行了测试,结果如下:
图表 8 攻击在不同平台和浏览器之间的兼容性(不存在的组合标记为N/A)
如图表8所示,测试覆盖的全部平台浏览器组合均支持相应攻击。
此外,作者还测试了浏览器在用户采用的不同正常防御行为下的攻击效果,包括隐身模式、清除数据、开启反跟踪模式甚至使用VPN前提下的缓存情况,如图表9所示,因为该攻击是对favicons的第一次侵犯隐私的滥用,所以即便采用了防御行为,攻击仍然有效。
图表 9 不同场景下的攻击效果:隐身模式、清除数据、反跟踪和使用VPN时
本篇论文提出的攻击思路较为直接,但除了给出攻击方法和可行性之外,作者还对提升攻击效率的方法展开了讨论。
为了在具有计算约束(例如,智能电话)或网络连接时间开销较大的设备(例如,蜂窝)上,减少写入标识符的开销,一种策略是,分配需要更少重定向(即,具有更少的1)的标识符到资源受限的设备。此类策略可依靠启发式排序方法完成:在ID位数一定的情况下,对标准的二进制ID进行排列,并按1的总数对其进行升序排序。
[001,010,011,100,101,110,111] ——> [001,010,100,011,101,110,111]
当新用户访问网站时,资源受限设备将被分配从序列顶部起的下一个可用标识符,而从序列的底部分配更强大的设备或高速网络上的设备。这种方法可以减少受限设备的写入阶段的持续时间。
除本文提出的图标缓存跟踪标识符之外,事实上,浏览器本身还存在一些在某段时间内保持不变的、可以用来标识用户的指纹特征,例如平台,Canvas,是否接受Cookies... 因此,另一种减少图标缓存ID开销的策略,便是将一类较为鲁棒的浏览器特征纳入进来,也作为跟踪标识符的一部分,从而减少缓存ID的长度。作者基于香农熵的概念,对此类特征的鲁棒性进行了测试。
图表 10 很少随着时间改变的浏览器属性,以及对应的熵值和累积的总熵
如图表10所示,可以看出,基于上述鲁棒属性获得的熵大概在21-26比特之间。因此,可以利用浏览器指纹的熵,形成标识符,减少基于favicon缓存所建立的标识符位数,从而缩短攻击时间。采取这种方法,攻击可以在2秒内重建一个唯一的32位跟踪标识符。
目前的浏览器允许用户在隐身模式下浏览时,读取浏览器的图标缓存。如果在隐身模式下能为每个浏览会话创建一个单独的cache,虽然会引入一个额外性能开销,但浏览器基本功能不受影响,而且用户的隐私会得到更好的保护。
如果把favicon缓存和cookie绑定,当用户清理该网站cookie等数据时,就可将对应的favicon缓存一起清理。虽然每次访问时需要重新获取图标,会有性能上的一些损失,但可以缓解本文提出的favicon缓存跟踪问题。
尝试构建基于导航的转换类型来管理的favicon缓存。具体而言,如果导航到在favicon缓存中不存在对应条目的其他子路径或子域,则浏览器会获取favicon,并仅在用户启动导航时才创建条目。虽然该策略没有引入额外的性能开销,但是网站可以在用户的浏览会话期间缓慢地重新创建标识符,依旧有被追踪的风险。
论文指明了当前浏览器中favicon缓存策略的不妥之处:持久性(不受用户清除浏览器缓存影响)、未隔离性(不受无痕模式影响)。据此,其介绍了一种基于favicon缓存的持续追踪攻击,同时,进行了攻击优化以及提出了一些解决方案。这种标识符构建方式可以学习借鉴,尝试用于在清理方面存在问题的缓存中。
https://www.ndss-symposium.org/wp-content/uploads/ndss2021_1C-5_24202_paper.pdf
参考文献
[1] R. Fielding, J. Gettys, J. Mogul, H. Frystyk, L. Masinter, P. Leach, and T. Berners-Lee, “Rfc2616: Hypertext transfer protocol–http/1.1,” 1999.
[2] A. Vastel, P. Laperdrix, W. Rudametkin, and R. Rouvoy, “Fp-stalker: Tracking browser fingerprint evolutions,” in 2018 IEEE Symposium on Security and Privacy (SP). IEEE, 2018, pp. 728–741.