您的浏览器中是否安装了隐私保护扩展程序?周围有这么多,每个安全厂商都在推广自己的产品。通常,这些工具将提供称为“防指纹”或“指纹保护”的功能,以减少您在网络上的身份。您不会注意到的是:此功能几乎普遍存在缺陷,可能会带来更好的指纹识别。
我看到许多扩展程序都没有使用此功能,但我很少去写报告。充分解释该问题的工作量很大。另一方面,很明显,对于大多数供应商而言,隐私保护只是他们可以放入其功能列表中的一项检查。质量并不重要,因为没有用户能够知道他们的解决方案是否真正起作用。如果资源很少,我的问题报告就不太可能采取有意义的行动。
这就是为什么我决定在博客文章中解释这些问题的原因,典型的扩展名至少有四分之三。下次当我遇到一个浏览器扩展程序时,遇到同样的缺陷,我可以向他们发送指向该帖子的链接。也许某些供应商会解决问题。或者,甚至更好的是,甚至根本不会犯这些错误。
浏览网络时,您不仅在与您访问的网站进行交互,而且还与众多第三方进行交互。其中许多人对在不同网站上可靠地识别您有极大的兴趣,例如,广告商想要“个性化”您的广告。传统方法是在您的浏览器中存储一个cookie,其中包含您的唯一标识符。但是,现代浏览器的设置非常值得推荐,可以在浏览会话结束时清除Cookie。有专用浏览模式,其中不会永久存储Cookie。第三方cookie的进一步技术限制预计将很快实施,并且欧盟数据保护规则也至少使cookie的存储变得复杂。
因此,cookie变得越来越不可靠。指纹识别应该通过识别单个用户而不在其端存储任何数据来解决此问题。这样做的目的是查看浏览器无论如何都能获得的有关用户系统的数据,例如显示分辨率。数据是什么都没有关系,应该是:
注意,没有数据点需要自己识别一个人。如果他们每个人都指的是不同的人群,那么只要有足够的数据点,所有这些人群的交集将永远是一个人。
防指纹的目标是减少可用于指纹识别的数据的数量和质量。例如,CSS用于允许识别用户之前访问过的网站,这是一种设计缺陷,可用于指纹识别等。这花费了很多时间和精力,但最终浏览器找到了不会破坏网络的修复程序。今天,该数据点不再可用于网站。
其他数据点仍然存在,但已被大量混淆。例如,浏览器向网站提供用户代理字符串,以便这些网站知道例如他们正在处理哪个浏览器品牌和版本。用户安装的应用程序用于使用自己的标识符扩展此用户代理字符串。最终,浏览器供应商意识到如何将其误用于指纹识别,因此决定删除任何第三方添加的内容。最初在此处可用的许多其他信息也已被删除,因此如今,任何用户代理字符串通常对于一大群人来说都是通用的。
浏览器供应商已经在防指纹方面投入了大量工作。但是,他们通常将自己限制在不会破坏现有网站的措施上。尽管没有太多的网站考虑诸如显示分辨率(与窗口大小不同)之类的东西,但这些网站显然足够多,以至于浏览器仍然为它们提供用户的显示分辨率和可用空间(通常是不带任务栏的显示分辨率)。
另一方面,隐私保护扩展并没有引起太多关注。因此,他们通常会执行以下操作:
到了那里,网站现在将为每个人看到相同的显示分辨率,对吗?好吧,除非网站这样做:
突然,screen.width和screen.height恢复为原始值。指纹现在可以使用两个数据点代替一个数据点:不仅是真实的显示分辨率,还包括假的分辨率。即使那种虚假的显示分辨率非常普遍,它仍然会使指纹更加精确。
这是魔法吗?不,只是JavaScript原型的工作方式。请注意,这些属性未在屏幕对象本身上定义,它们是对象原型的一部分。因此,该隐私权扩展程序为原型的属性添加了替代项。删除替代项后,原始属性再次变得可见。
好多了。该网站无法再轻松地获取原始价值。但是,它可以通过调用Object.getOwnPropertyDescriptor(Screen.prototype," width")来检测到该值已被操纵。通常,生成的属性描述符将包含一个吸气剂,但是该吸气剂具有静态值。隐私扩展将这些值弄乱的事实再次成为可用的数据点。
快好了。但是现在该网站可以调用Object.getOwnPropertyDescriptor(Screen.prototype," width")。get.toString()来查看我们的吸气剂的源代码。再次是可以用于指纹识别的数据点。源代码需要隐藏:
此bind()调用确保getter看起来像本机函数。正是我们需要的。
这里有一个复杂之处:一个网站不仅有一个JavaScript执行上下文,而且每个框架都有一个。因此,您必须确保您的内容脚本可以在所有这些框架中运行。因此,浏览器扩展程序通常会在其清单中指定" all_frames&#34 ;: true。没错。但随后,该网站执行了以下操作:
为什么这个新创建的框架仍然报告原始显示宽度?我们回到第一个广场:该网站又有两个数据点,而不是一个。
这里的问题是:如果未设置框架位置,则默认为加载特殊页面about:blank。 Chrome开发人员最初创建扩展API时,并没有提供任何扩展来在此处运行内容脚本。幸运的是,此漏洞现在已经关闭,但是扩展清单必须将" match_about_blank"设置为true。
由于浏览器扩展中的防指纹功能具有侵入性,因此很容易破坏网站。因此,重要的是让用户在特定网站上禁用此功能。这就是为什么您经常在扩展内容脚本中看到这样的代码的原因:
因此,此内容脚本不是立即立即初始化所有的防指纹措施,而是先等待扩展程序的背景页面告诉它是否实际上应该执行任何操作。这使网站有必要的时间来存储所有相关值,然后再进行更改。它甚至可以稍后再返回并检查修改后的值-再次,两个数据点要好于一个。
这是Chrome扩展架构的一个重要限制,可悲的是如今所有浏览器都共享该架构。可以在运行任何网页脚本之前运行内容脚本(" run_at&#34 ;:" document_start")。但是,这只是一个静态脚本,不知道任何扩展状态。并且请求扩展状态需要时间。
动态内容脚本支持最终可能会解决这个问题,该请求最初是十年前创建的。但是,与此同时,似乎唯一可行的解决方案是立即初始化防指纹。如果扩展名后面说“不,您被禁用” –好吧,那么内容脚本将只需要撤消所有操作。但是这种方法可以确保在常见情况(启用功能)中,网站不会看到同一数据的两种变体。
假设所有的技术问题都已解决。安装假值的机制可以完美地工作。这仍然存在一个问题:如何选择“正确的”假价值?
如何选择一个随机值?我的显示分辨率是1661×3351,现在是指纹!有趣的是,指纹识别并不依赖有意义的数据。它所需要的只是稳定且足够唯一的数据。而且该显示分辨率当然是极其独特的。现在,人们可以提出一些方案来定期更改此值,但事实是:让用户脱颖而出并不是正确的方法。
您想要的是找到最大的团队并加入。我的显示分辨率是1920×1080 –只是普通的Full HD,在这里看不到任何东西!想知道我的可用显示空间吗?与其他所有人一样,我的Windows任务栏位于底部。不,我也没有调整大小。我只是你平常的乔
这种方法的唯一麻烦是:必须定期重新评估值。二十年前,1024×768是最常见的显示分辨率,也是防指纹的不错选择。今天,声称拥有此屏幕尺寸的人肯定会脱颖而出。同样,在我的网站日志中,引人注目的是声称使用Firefox 48的访客:它可能是几年前的通用浏览器版本,但如今,它通常只是假装为网站访客的机器人。