返回博客

指纹浏览器检测的实验方法:从版本声明到行为校验

一项发表于 IMC 2024 的研究把检测做成了可复现的线上实验:不看浏览器怎么自称,而是数它底层对象的属性,再和声称的版本比对。方法比结论更值得读。

关于浏览器指纹能不能被检测出来,市面上的说法很多,多数停在结论上。与其争论谁赢谁输,不如看看研究者是怎么把这件事做成一个可以复现的实验,以及他们用什么指标下判断。

有一项发表在互联网测量会议 ACM IMC 2024 上的研究,论文标题是 Browser Polygraph,由亚利桑那州立大学、波士顿大学和 Amazon 的研究者合作完成,论文编号可查 DOI: 10.1145/3646547.3688455。它没有在实验室里跑模拟数据,而是部署在一家大型金融公司的真实生产环境,观察窗口 4.5 个月,覆盖 20.5 万个真实用户会话,被测对象是 10 款常见的环境伪装方案,同时以正常用户的流量作对照。

实验是怎么搭起来的

检测能做到全量部署而不影响业务,靠的是三个设计。

特征要便宜。检测只读取一批固定属性,单次开销在毫秒和 KB 量级,所以可以对全部流量执行,不需要抽样,用户侧也感觉不到。

特征要稳定。它选中的不是用户能改的那些参数,而是浏览器出厂时就定死的底层结构。每个浏览器版本自带的 JavaScript 引擎不同,底层有多少个 API、每个对象挂多少属性,版本之间存在细微差别。研究中拿来做对照的是 Chrome 110 和 Chrome 114 这个版本区间:检测系统去数 28 个关键对象的属性数量,再和浏览器自称的版本号比对。对不上,就说明声明和实际行为不是同一套东西。

标签要可信。被测环境逐个接入同一套线上流量,用同一套规则判定,对照组是真实用户的正常行为。这样得到的结论不是测出来像不像,而是这批流量在这套规则下能不能被区分出来。

判断是否被真实模拟的几个指标

研究里用到的衡量方式可以归成四类。

  • 一致性:浏览器声称的版本和它底层对象结构是否匹配。这是最核心的一项,也是最难伪造的,因为改一个字符串并不会连带改掉引擎里的对象数量。
  • 检出率:研究对其中四款做了详细实验,检出率落在 67% 到 84% 之间。
  • 与真实设备的偏离度:同一套判定规则下,正常浏览器的风险评分是 0,被测的那几款平均落在 8.85 到 11.66 之间。这个分数的含义是离真实分布有多远,而不是一个主观的像不像。
  • 可区分性:能不能把这批流量从正常流量里分出来。分不出来的那一类,说明它在行为层面和真实浏览器之间没有缝隙。

四项指标里,第一项是原因,后面三项都是它的结果。

四类结果各自卡在哪里

研究按底层实现方式,把被测方案分成了四类。

第一类,底层特征和任何已知的真实浏览器版本都对不上,等于没有可以对应的引擎,扫一遍就暴露了。

第二类,本身带着真实的指纹特征,但切换身份的时候,只有表层声明跟着变,底层引擎不动。这类在研究里最常见。打个比方,名片上写着新版本,口音还是旧的。它的问题不是参数调得好不好,而是声明和行为之间出现了一道缝,检出率主要就来自这里。

第三类,切换身份时底层引擎同步切换。声明自己是哪个版本,跑的就是哪个版本对应的引擎,一致性成立,因此在这套检测下没有被区分出来。论文也说明,要识别这类需要引入更复杂的检测手段。

第四类,不动浏览器,直接在虚拟机里运行真实浏览器再加载目标配置。它本来就是真的,检测当然分不出来,但操作成本很高,很难规模化。

四类的差别不在参数多少,而在声明和行为是不是同一套

对选择环境方案的实际提示

检测的重心已经从读声明移到校验行为,能改的表层参数越来越不构成优势。落到具体判断上:

  • 问底层,不问参数表。切换版本声明时,底层是否同步变化;环境的指纹是自动生成的真实组合,还是手工拼起来的一组值。
  • 看环境之间像不像。多个环境如果返回高度一致的底层特征,说明隔离并不彻底。
  • 先一致性,再差异化。内部互相矛盾的特征,调得越多暴露面越大。
  • 通用检测页面通过,不等于平台侧认可。最终还是要用一小批真实流量自己验证一遍。

环境隔离这一层要处理的核心问题,其实就是让每个环境自成一套、内部不矛盾,PurpleMark 在做的就是这件事。检测与反检测本身都应当在合规边界内使用,这项研究真正的价值也在于让评估有据可依,而不是给出一份谁好谁坏的排名。