一个你根本想不到的追踪方式
先说一个让我后背发凉的细节。
你在Tor浏览器里点了"New Identity",以为一切重置了——新cookie、新历史、新Tor线路。理论上,你应该是个全新的人。
但有个漏洞说:不,你还是你。
不是你在某个网站暴露了身份,而是浏览器本身在偷偷给你打标签。一个稳定、进程级别的标识符,藏在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用户的"新身份"形同虚设
这点最让我无语。
Tor Browser有一个功能叫"New Identity",官方文档说这是给"想防止后续浏览活动与之前行为关联"的用户准备的。
但在这个漏洞面前,这就是个心理安慰。
因为标识符是进程级别的,不是窗口级别的。你点多少次"New Identity",只要没把浏览器整个关掉重启,标识符就还是那个标识符。
想象一下这个场景:你用Tor访问了一个敏感网站,然后点了"New Identity",觉得自己安全了。接着你又访问了另一个网站,觉得这次是全新身份。
但这两个网站背后如果有同一个运营者,或者他们愿意交换数据,就能通过这个标识符发现:哦,两次访问的是同一个人。
当然,这不代表他们知道你是谁。Tor的匿名性还在——他们只是知道"这两次是同一个人",而不是"这个人是张三"。
但对于某些威胁模型来说,这已经足够致命了。
技术细节:问题出在哪
简单捋一下:
在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/