一个你根本想不到的追踪方式

先说一个让我后背发凉的细节。

你在Tor浏览器里点了"New Identity",以为一切重置了——新cookie、新历史、新Tor线路。理论上,你应该是个全新的人。

AI配图

但有个漏洞说:不,你还是你。

不是你在某个网站暴露了身份,而是浏览器本身在偷偷给你打标签。一个稳定、进程级别的标识符,藏在IndexedDB返回的数据库顺序里。

16个数据库名,理论上能产生44位的熵。够把全球每一台正在跑的Tor浏览器实例都区分出来。

更离谱的是——这漏洞影响所有Firefox内核浏览器,包括那个被几百万人当"最后防线"的Tor Browser。

隐私浏览模式的"遮羞布"被扯了

让我们先搞清楚隐私浏览模式到底承诺了什么。

两件事:第一,不同网站不应该知道它们在跟同一个浏览器实例说话;第二,私人会话结束后,这次会话的所有痕迹应该消失。

这个漏洞把两个承诺都踩碎了。

问题出在一个叫indexedDB.databases()的API上。正常情况下,它应该返回当前网站创建的数据库列表,一个普普通通的元数据查询。

但在Firefox的私有浏览模式里,它返回的顺序不是按创建时间来的,而是取决于内部哈希表的数据结构。哈希表的迭代顺序是确定的——对于同一个Firefox进程,同一个内部布局,它永远返回同一套排列组合。

因为这个映射是全局的、跨源的、进程级别的,所以:

A网站创建16个数据库,调用这个API,得到顺序X。
B网站(跟A没有任何关系)也创建16个数据库,调用这个API,得到同样的顺序X。

两边一对上,就知道:哦,你在用Firefox。

而且这个X只要Firefox进程没重启,就会一直存在。你关掉所有隐私窗口,只要浏览器还在跑,X就还在。

Tor用户的"新身份"形同虚设

AI配图

这点最让我无语。

Tor Browser有一个功能叫"New Identity",官方文档说这是给"想防止后续浏览活动与之前行为关联"的用户准备的。

但在这个漏洞面前,这就是个心理安慰。

因为标识符是进程级别的,不是窗口级别的。你点多少次"New Identity",只要没把浏览器整个关掉重启,标识符就还是那个标识符。

想象一下这个场景:你用Tor访问了一个敏感网站,然后点了"New Identity",觉得自己安全了。接着你又访问了另一个网站,觉得这次是全新身份。

但这两个网站背后如果有同一个运营者,或者他们愿意交换数据,就能通过这个标识符发现:哦,两次访问的是同一个人。

当然,这不代表他们知道你是谁。Tor的匿名性还在——他们只是知道"这两次是同一个人",而不是"这个人是张三"。

但对于某些威胁模型来说,这已经足够致命了。

技术细节:问题出在哪

简单捋一下:

AI配图

在Firefox的私有浏览模式下,数据库名字不会直接用作磁盘文件名,而是通过一个全局哈希表映射成UUID。

这个哈希表的特点是:

  • 只用数据库名字作为key
  • 生命周期跟Firefox进程绑定
  • 所有源共享
  • 只有完全重启浏览器才会清空

然后indexedDB.databases()去查询的时候,Firefox通过QuotaClient::GetDatabaseFilenames获取数据库文件名,塞进一个哈希集合。

关键在于:返回之前没有排序。

所以最终顺序由哈希表的内部桶结构和UUID值决定。只要进程没重启,这个顺序就固定不变。

两个不同源的网站,只要在同一个Firefox进程里跑,就会观察到完全相同的顺序。

这就是那个标识符。

为什么这个漏洞特别危险

因为它几乎没法防御。

用户不需要点击任何东西,不需要下载任何文件,不需要授权任何权限。网站只需要跑一段JS代码,调用indexedDB.databases(),就能拿到这个标识符。

不需要cookie,不需要localStorage,不需要任何显式的跨站渠道。

浏览器自己的实现细节,把你卖了。

而且这个标识符的熵足够高。16个数据库名,16的阶乘种可能排列,44位的熵——在现实场景里,几乎不可能重复。

足够精确地把每一个浏览器实例都标记出来。

修复:简单,但暴露了更大的问题

好消息是这个漏洞已经修复了。

Mozilla在Firefox 150和ESR 140.10.0里打了补丁。方案也很简单:返回结果之前先排序。

canonical order,字典序什么都行。只要把顺序规范化掉,这个标识符就消失了。

但这件事让我想到一个问题:类似的问题还有多少?

隐私漏洞不一定来自对敏感数据的直接访问。有时候,恰恰是那些看起来完全无害的API——返回一个列表顺序这种小事——会在特定实现下变成追踪向量。

浏览器是一个极其复杂的系统,几百万行代码,几百个API。每一个都可能在某种边缘情况下泄露信息。

对于做隐私浏览器的人来说,这大概就是日常:永远不知道哪个角落藏着一个定时炸弹。

一个老生常谈的追问

评论区有人问了一个问题,我觉得值得单拎出来:

"为什么网站可以访问这些信息而不用通知用户?为什么浏览器不能像手机应用那样要权限?"

说实话,这是一个很好的问题,但答案很残酷。

因为Web的设计哲学不是这样的。Web是一个开放平台,它假设网站和用户之间是合作关系,而不是对抗关系。浏览器提供API,网站用这些API构建功能,用户选择信任网站。

但现实是,网站和用户之间的关系早就变成猫鼠游戏了。

浏览器厂商在努力修漏洞,但Web标准本身还在不断扩张。每一个新API都是一个新的攻击面。IndexedDB这样的功能,真正用来存储数据的网站可能没几个,但用来指纹识别的可能车载斗量。

有人甚至说:大部分Web标准,主要用途就是指纹追踪。

这话偏激,但不算错。

最后说几句

这个漏洞已经被修复了,大部分用户其实不用太担心。

但它提醒我们一件事:隐私从来不是理所当然的。

你以为你开了隐私模式、用了Tor、点了"New Identity",就安全了。但底层代码里一个哈希表的迭代顺序,就能把你的所有努力打回原形。

技术的东西,说到底还是要靠写代码的人不出错。

而人,是不可能不出错的。

【锐评】:开了隐身还被抓现行,不是你不够小心,是浏览器自己挖了个坑——还是那种修完都后怕的坑。

参考链接:
https://fingerprint.com/blog/firefox-tor-indexeddb-privacy-vulnerability/