全部文章

多账号运营

浏览器环境隔离:隔开了什么,没隔开什么

Chrome 多用户能分开 Cookie,却共用同一套指纹和同一个 IP。一份完整的隔离清单,适合绝不能被关联的账号。

作者 Mango Team发布于 4 分钟阅读

「隔离」这个词,被用来形容差别很大的几种分隔程度。第二个 Chrome 用户是隔离的,Firefox 的容器是隔离的,无痕窗口在一个小时内是隔离的,另一台电脑接另一条网络也是隔离的。只有最后一种,在网站能测量的每一个维度上都是隔离的,而它也是没人愿意为之付钱的那种。这篇列出网站识别一个浏览器所用的三层信号,说明各种工具分别隔开了哪一层,最后给出一份适用于「绝不能被关联」的账号的清单。

浏览器身份的三层

层里面有什么网站怎么读清 Cookie 后还在吗
存储Cookie、本地存储、IndexedDB、缓存、Service Worker、保存的登录每次请求随之发回,脚本可读不在,清除的就是它
指纹User-Agent、Client Hints、屏幕、核心数、显卡、Canvas、字体、音频、时区、语言首次加载页面时由脚本读取在
网络HTTP IP、WebRTC 候选地址、由 IP 推出的位置服务器直接看到,脚本也能收集在

网站不需要三层齐全才能把两个账号连起来。两个账号 Cookie 不同、指纹相同、IP 相同,就是一个人拥有两个登录。三层之间还会互相交叉检查:指纹说是 macOS 而字体列表来自 Windows,或者时区和 IP 对不上,那是一个被改过的浏览器,而不是第二个浏览器。

浏览器多用户隔开了什么

Chrome 的多用户(以及其他 Chromium 浏览器里的同类功能)各自拥有独立的用户数据目录,也就是独立的 Cookie、存储、历史、扩展、保存的密码和设置。就存储这一层而言,这是完整的隔离,而且是永久的,不是按会话的。

它们共享的是所有来自机器和程序的东西。两个用户跑的是同一个程序、同一个操作系统、同一块显卡、同一套字体、同一块屏幕、同一个时钟、同一条网络。它们的指纹完全一样,IP 也完全一样。在网站眼里,这是一个浏览器配了两个 Cookie 罐子。

Firefox 的 Multi-Account Containers 做的是同一件事,只是粒度更细:同一个 Firefox 配置文件里,每个容器有自己的 Cookie 和存储,所以你可以在两个标签页里登录两个账号。指纹和网络在所有容器之间共享,这是设计使然;容器是为了把网站彼此隔开,不是为了让一个人看起来像两个人。

代理和 VPN 隔开了什么

代理改变的是经过它的流量的网络层。绑定到一个环境上,就给了那个环境自己的出口。VPN 改变的是整台机器的网络层,也就是说每个环境得到的是同一个新出口:它把你和家里的 IP 隔开了,却没有把环境彼此隔开。

两者都不碰指纹层。而网络层还有自己的一致性规则:WebRTC 候选地址要和 HTTP IP 一致,时区和语言要和两者都一致。WebRTC 那篇讲了这里最常见的翻车方式。

指纹浏览器隔开了什么

指纹浏览器按环境把三层全部隔开,还多做了一件其他工具做不到的事:让每个指纹内部自洽。声称是 Windows 的环境,就配 Windows 的字体、Windows 的显卡字符串和 Windows 的 Client Hints;绑定新加坡代理的环境,就配新加坡的时区和语言。隔离只有在每个环境同时看起来像一个真实、单一的浏览器时才有用,因为一个自相矛盾的指纹,在被拿去和别的指纹比较之前就已经被标记了。

不同还不够,不同且一致才是目标。

两个环境需要两套指纹,每套指纹都要描述一台合理的机器。每次加载页面都随机化数值,两样都得不到:环境每次来访都像一台不同的设备,而且是一台不可能存在的设备。

隔离清单

对于绝不能被关联的账号,每一条都适用于每一个环境:

  1. 存储独立且持久。 各自的 Cookie、存储和缓存,会话之间保留,让账号看起来是回访用户,而不是每天换一台新设备。
  2. 指纹彼此不同。 Canvas、WebGL、音频、字体和硬件数值,与你运行的其他每个环境都不一样。
  3. 指纹内部一致。 操作系统、字体、显卡、Client Hints、navigator.platform 和屏幕描述同一类机器,浏览器版本是当前版本。
  4. 网络各归各。 一个环境一个代理,WebRTC 报告代理出口,IPv6 不从旁边漏出去。
  5. 位置信号一致。 时区、语言和地理位置与出口 IP 匹配。
  6. 行为不出环境。 永远不要「就这一次」在环境 A 登录账号 B;手机号、支付方式、恢复邮箱不跨环境复用;如果网站会查,也不要在同一台机器上同一秒钟用两个环境打开同一个网站。
  7. 扩展不出卖你。 所有环境都装同一套少见的扩展,本身就是一种指纹。扩展列表按环境配置,并保持精简。

怎么测试隔离

在每个环境里打开实验室。比较指纹标识、Canvas 与 WebGL 行、IP 与 WebRTC 行、时区行。每个环境都应得到不同的标识;来自同一台机器的那些行在环境之间不应相同;而在每个环境内部,位置相关的行应彼此一致。有任何一个测量行相同的两个环境,就共享了一条网站可以利用的关联。

比较你的两个环境

在你使用的每个环境里运行实验室。环境之间相同的行是关联,环境内部不一致的行是标记。

打开实验室

Mango Browser 怎么处理隔离

Mango 的每个环境都是完全独立的浏览器目录,Cookie、存储、缓存和扩展互不相通,每个环境的数据在会话之间保留。每个环境有一套为自洽而生成的指纹:Windows 或 macOS 上的 Chrome/Chromium 或 Firefox,User-Agent、Client Hints、字体、显卡渲染器和平台都跟随所选的操作系统。Canvas、音频和 client rects 的噪声按环境设定种子,数值在环境之间唯一,在每次绘制时相同。

网络隔离同样按环境。给环境绑定 HTTP、SOCKS5 或住宅代理;WebRTC 默认报告代理出口,时区、语言和地理位置可以跟随出口。模板和批量创建把同样的一致性一次应用到很多环境上,团队角色则让每个人只待在自己该用的环境里。

参考资料

  1. Google Chrome 帮助:与他人共用 Chrome
  2. Mozilla 支持:Multi-Account Containers
  3. MDN: 存储配额与清除标准

到指纹实验室看看你的浏览器暴露了什么

继续阅读