Hotdry.

Article

Tor 浏览器指纹检测:跨会话识别的算法实现与测量方法

深入分析通过浏览器内部行为特征检测并跨会话识别 Tor 用户的算法实现,涵盖信号收集、权重分配与匹配策略。

2026-04-23security

当我们谈论浏览器指纹时,通常关注的是如何通过收集用户浏览器的各类属性来生成唯一标识。然而,Tor 浏览器采用了多层次的反指纹措施,试图让所有用户看起来尽可能相似。问题在于,即使有了这些防御机制,新的研究表明仍然存在可以通过测量方法突破防线的技术路径。本文将从算法实现的角度,分析检测与跨会话识别 Tor 用户的核心技术机制。

指纹检测的基本信号收集框架

任何指纹识别系统的第一步都是收集足够的信号源。对于面向 Tor 用户的检测场景,信号收集需要特别关注那些 Tor 浏览器难以完全标准化或随机化的属性。常见的信号类别包括:浏览器配置参数如 User-Agent 字符串、屏幕尺寸分桶、时区与语言设置;WebGL 渲染特征,包括显卡型号、渲染器字符串以及 WebGL 实现的细节;Canvas 和音频上下文的行为特征,通过让浏览器渲染特定内容并测量输出差异来获取硬件相关的噪声;字体列表,通过检测系统可用字体来判断字体指纹的子集。

然而,Tor 浏览器对这些常规信号做了大量处理。User-Agent 会被统一化,屏幕尺寸会被分桶到固定范围,Canvas 输出会被添加随机噪声。这些措施使得传统的指纹生成方式在 Tor 环境下变得不再可靠。正因为如此,研究者开始转向寻找那些浏览器难以完全防御的信号维度。

进程级标识符的发现与测量

2026 年发现的一个关键漏洞为跨会话识别提供了新的思路。问题的核心在于 indexedDB.databases() 这个 API 的实现细节。在 Firefox 以及基于 Gecko 构建的 Tor 浏览器中,该 API 返回的数据库名称顺序并非随机或按创建顺序排列,而是由内部存储结构的哈希表迭代顺序决定。具体来说,Firefox 在私有浏览模式下会将网站提供的数据库名称映射到 UUID 作为文件名基础,这个映射关系存储在一个全局哈希表中。当调用 indexedDB.databases() 时,浏览器遍历内部哈希集合返回结果,而哈希表的迭代顺序由 UUID 值、哈希函数行为以及哈希表容量共同决定。

这个顺序对于同一个浏览器进程是确定性的,而且因为映射关系是进程级别而非源域级别,不相关的网站可以独立观察到相同的顺序。测量方法非常简单:网站创建一个固定的数据库集合,调用 API 获取返回顺序,然后这个顺序就可以作为该浏览器进程的唯一标识符。实验表明,即使在 Tor 浏览器中使用 "New Identity" 功能(设计上应该清除所有状态并使用新的 Tor 线路),该标识符仍然保持有效,因为 "New Identity" 不会重启浏览器进程。

从熵的角度分析,如果一个网站控制 N 个数据库名称,可能的排列数为 N 的阶乘,对应的理论熵为 log2 (N!) 比特。使用 16 个受控名称时,理论熵约为 44 比特,这足以在现实场景中区分大量并发的浏览器实例。实际的哈希表行为可能会降低可达到的排列数,但即使如此,剩余的熵仍然远高于区分所需的阈值。

跨会话匹配的权重分配算法

当需要将多次访问关联到同一个 Tor 用户时,算法需要处理不同类型的信号稳定性差异。常见的匹配框架采用加权分数的方法:对于每个信号维度 i,分配一个权重 wi 表示其可靠性,然后计算两次会话之间的匹配分数。匹配值为 1 表示完全一致,0 表示不匹配,对于不稳定的信号则可以赋予部分权重。

权重分配的核心逻辑在于区分信号的稳定性等级。高度可靠的信号包括上面提到的进程级标识符,它在浏览器进程存活期间保持不变;硬件相关的属性如显卡型号在短时间内通常不变;字体列表在大多数用户环境下相对固定。中等可靠性的信号包括时区和语言设置,这些可能随用户配置改变但频率不高;屏幕分辨率在某些设备上会变化。应该低权重处理或不作为主要依据的信号包括 User-Agent(Tor 会统一化)以及 Canvas 指纹(通常会被随机化)。

一个典型的评分公式可以写作:score (sessionA, sessionB) = Σ(wi × matchi)。当总分超过某个阈值时,系统判定两次访问来自同一个用户。阈值的选择需要在误报率和漏报率之间取得平衡。

对抗指纹检测的防御考量

从防御角度理解攻击算法的细节至关重要。上面描述的攻击之所以有效,关键在于它利用了浏览器内部实现细节而非直接的识别数据。修复方案因此也相对直接:在返回 indexedDB.databases() 结果之前进行字典序排序,消除由内部存储结构引入的熵。这个修复已被 Mozilla 应用于 Firefox 150 和 ESR 140.10.0,Tor 项目也需要应用相应的补丁。

对于希望强化隐私的用户来说,这个案例揭示了一个重要事实:反指纹措施不仅要关注表面的可识别属性,还要关注那些可能泄露进程级状态的 API 行为。当前的 Tor 浏览器默认配置已经做了大量工作,但在面对利用内部实现细节的攻击时,仍然需要持续更新以封堵新的向量。

工程实践中的检测阈值与监控

在实际部署检测系统时,有几个关键参数值得关注。首先是置信度阈值的选择,这取决于应用场景对误报和漏报的容忍程度。对于高安全性场景,建议在进程级标识符匹配成功时直接判定为同一用户,因为这类标识符的熵足够高。对于仅依赖常规浏览器属性的场景,需要更谨慎的阈值设置,通常建议匹配属性数量超过总体信号池的 70% 且总分超过 0.8。

其次是信号新鲜度管理。不同信号的稳定性不同,进程级标识符在进程存活期间永久有效,而网络相关的信号可能在几分钟到几小时内失效。系统应该为每个信号维护时间戳,并在匹配计算时考虑信号的时间衰减。

最后是异常检测机制。当检测到来自同一标识符的访问模式发生显著变化时(例如地理位置突然跳转),系统应该标记为可疑行为并触发人工复核。这不仅有助于识别攻击,也能发现真实的账户被盗情况。

小结

Tor 浏览器的反指纹设计并非无懈可击。通过深入理解浏览器内部实现细节,攻击者仍然可以找到稳定的信号来实现跨会话识别。进程级标识符的发现尤其说明了这一点:即使是最基本的 API 调用,其内部行为也可能成为泄露用户身份的通道。对于安全研究者和隐私保护实践者而言,理解这些检测算法的实现细节是构建更好防御的基础,也是持续追踪浏览器隐私边界的重要工作。


资料来源:

security