在苹果官网上,Safari浏览器一直以强大的隐私保护功能作为卖点。其中,智能防跟踪和隐私标签等功能满足用户需求。但在近日,浏览器指纹识别服务商FingerprintJS发布了一篇博客,经他们调查发现,Safari 15在实现IndexedDB API时存在一个漏洞,该API允许任何网站跟踪用户的浏览记录,甚至泄露用户Google帐户的部分身份信息。
在揭露该漏洞之前,我们先来了解一下IndexedDB API是什么。
IndexedDB(索引数据库)是一个用在浏览器客户端存储的API(应用程序编程接口),可以保存大量用户数据,目前被普遍使用在所有主要的浏览器上。由于IndexedDB是一个低级别的API,许多开发者选择使用包装器将大部分技术问题抽象化,并提供一个更易于使用、对开发人员更友好的API。
像大多数现代网络浏览器技术一样,IndexedDB遵循同源政策。这是一种基本的安全机制,它限制了从一个源头加载的文档或脚本与其他源头的资源交互。来源由方案(协议)、主机名(域)和用于访问它的URL端口定义。被索引的数据库与特定的源相关联,本质上,只有生成数据的网站才能访问它。例如,如果在一个标签页中打开电子邮件帐户,然后在另一个标签页中打开恶意网页,同源政策会阻止恶意页面查看和干预电子邮件。
FingerprintJS发现,在基于苹果开源浏览器引擎WebKit的新版浏览器,包括macOS上的Safari 15,以及iOS 15和iPadOS 15上的所有Safari浏览器,IndexedDB API都违反了同源策略。每次网站与Safari中的数据库交互时,在同一浏览器会话中的所有其他活动框架、标签和窗口中都会创建一个同名的新(空)数据库。窗口和标签通常共享同一个会话,除非用户切换到不同的配置文件,例如使用Chrome浏览器,或者打开一个私有窗口。
这意味着其他网站可以看到在其他网站上创建的其他数据库的名称,其中可能包含具体到用户身份的详细信息。FingerprintJS还注意到,由于苹果要求所有iPhone和iPad上的浏览器都使用WebKit,所以该漏洞还会危及第三方浏览器,如 iOS 15和 iPadOS 15上的Chrome浏览器。使用Google帐户的网站,例如YouTube、Google日历和Google Keep,都会生成名称中包含Google用户唯一ID的数据库。Google用户ID允许 Google访问例如个人资料、照片等公开信息,Safari漏洞可能会将这些信息暴露给其他网站。
图源:FingerprintJS
数据库ID跨源泄漏是一种明显的隐私侵犯,它可以让任意的网站了解用户在不同的标签或窗口中访问了哪些网站。因为数据库名称通常是唯一的,并且特定于网站。此外,FingerprintJS观察到,在某些情况下,网站在数据库名称中使用唯一的用户特定标识。这意味着经过身份验证的用户可以被唯一且精确地识别。通俗点讲就是,像YouTube、Google日历和Google Keep,这些网站创建的数据库都包含经过身份验证的谷歌用户ID,如果用户登录到了多个帐户,谷歌就会为所有这些帐户创建数据库。
谷歌用户ID是谷歌生成的内部标识符,它能唯一标识一个谷歌账户,还可以与谷歌API一起获取账户所有者的公共个人信息。这些API暴露的信息受多种因素控制,一般来说,至少用户的个人资料照片通常是可用的。这不仅意味着不受信任或恶意的网站可以了解用户的身份,还允许其将同一用户使用的多个独立帐户链接在一起。
需要注意的是,这些泄漏不需要任何特定的用户操作。一个在后台运行并持续查询IndexedDB API的标签或窗口,可以实时了解用户访问了哪些其他网站。另外,网站还可以在一个iframe或弹出窗口中打开任何其他网站,以便对该特定网站触发一个基于IndexedDB的泄漏。
FingerprintJS查看了Alexa前1000个访问量最大的网站主页,以了解有多少网站使用IndexedDB,并且可以通过它们数据库的交互进行唯一标识。
结果显示,超过30个网站直接在其主页上与IndexedDB交互,无需任何额外的用户交互或认证,包括Instagram、Netflix、Twitter、Xbox等。FingerprintJS怀疑这个数字在现实场景中要高得多,因为网站可以在子页面上、在特定的用户操作之后或在页面的认证部分与数据库进行互动。
FingerprintJS还看到了一种模式,在这种模式下,广告网络可以创建名为通用唯一标识符(UUIDs)的IndexedDB。庆幸的是,这些资源的加载在某些情况下似乎被Safari的防止跟踪功阻挡了,这有效地防止了数据库名称的泄漏。如果通过其他方式阻止这些资源,例如使用adblocker扩展或阻止所有的JavaScript执行,这些泄漏也将被阻止。
首先,同源策略是所有窗口模式的有效安全机制。无论访客是否使用隐私模式,拥有相同来源的网站都不应该访问其他来源的资源,除非通过跨源资源共享(CORS)的明确允许。
在这种情况下,Safari 15中的隐私模式也会受到泄漏的影响。需要注意的是,私人Safari窗口中的浏览会话被限制在一个标签上,这减少了通过泄露获得信息的程度。但是,如果用户在同一标签页中访问多个不同的网站,这些网站与之交互的所有数据库都会泄露给所有后续访问的网站。不过,在其他基于苹果WebKit的浏览器中,例如Brave或iOS上的Google Chrome,私人标签以与非私人模式相同的方式共享同一浏览器的会话。
FingerprintJS在11月28日向苹果WebKit Bug Tracker报告了泄漏,但苹果并未对此做出回应。
不幸的是,如果不采取强制措施,Safari、iPadOS和iOS用户几乎无法保护自己。其中一种方法是在默认情况下阻止所有JavaScript,并且只允许在受信任的站点上使用。不过这会使现代网络浏览变得不方便,而且也不是一个适合所有人的好方法。此外,像跨站点脚本之类的漏洞也使人们有可能被可信站点当做攻击目标,尽管这个风险很小。对于Mac上的Safari用户来说,另一种选择是暂时切换到其他浏览器。然而,这在iOS和iPadOS上却行不通,因为其上所有浏览器都受到影响,所以这些用户只能等待苹果WebKit开发团队在最新版本中修复这个漏洞。
所以FingerintJS在此强调,唯一真正有效的保护措施是一旦苹果解决了这个问题,就立刻更新浏览器或操作系统。同时,FingerprintJS希望这篇文章能提高人们对这个bug的认识。但是截止目前,苹果官方还未就此事做出回应。
参考链接:
1.Exploiting IndexedDB API information leaks in Safari 15
2.Safari 15 bug can leak your recent browsing activity and personal identifiers - The Verge