本文介绍的是一种鲜为人知的方法来实现浏览器指纹追踪, 并且可以保持到无痕模式!

介绍

浏览器是最广泛的访问媒介,它使我们人类能够非常轻松地连接到万维网。由于互联网的不断发展,例如新标准和功能的不断制定、强大的 API 的引入以及浏览器端的进一步接口,收集和分析数据的可能性在过去几十年中也更为严重!

首先,收集数据没有任何问题。 我们所有人都会收集数据,无论是在私人日常生活中无意识地收集,还是在学校或工作中完全有意识地收集数据 - 收集数据、解释数据并得出结论实际上非常重要!

随着万维网向公众推出以及第一个在线服务的开发,数据收集也开始对各个网站提供商变得有趣,如果我拥有一个网站,我也想知道谁在浏览它 。

上述 WWW 功能的进一步发展允许将数据分配给个人配置文件,从而能够识别唯一用户并能够跟踪他们的浏览活动,甚至跨不同页面 - 即所谓的设备指纹识别。为浏览器分配唯一指纹的一些已知方法是硬件基准测试、通过 Canvas 和 WebGL 进行指纹识别或对活动浏览器扩展进行分析。

但是这些常见的指纹技术已经有很多浏览器扩展可以阻止追踪并使其不准确,下面,将要介绍一种很少有人知道却很强力的指纹技术。

背景

现代浏览器提供了广泛的功能来改善和简化用户体验。
其中一个功能就是所谓的网站图标(favicon):网站图标是一种小型(通常为 16×16 或 32×32 像素)徽标,网络浏览器使用它以可识别的方式为网站打上品牌烙印。 大多数浏览器通常会在地址栏中以及书签列表中的页面名称旁边显示网站图标。

要在其网站上提供网站图标,开发人员必须在网页标题中包含 <link rel> 属性。 如果此标记确实存在,则浏览器会从预定义源请求图标,并且如果服务器响应包含可以正确呈现的有效图标文件,则浏览器将显示此图标。 在任何其他情况下,都会显示空白的网站图标。

<link rel="icon" href="/favicon.ico" type="image/x-icon">

网站图标必须易于浏览器访问。 因此,它们被缓存在系统上一个单独的本地数据库中,称为图标缓存(F-Cache)。 F-Cache数据条目包括访问的URL(子域、域、路由、URL参数)、favicon ID和生存时间(TTL)。
虽然这使网络开发人员能够使用各种图标来描述其网站的各个部分和子域,但它也导致了可能的跟踪场景。

当用户访问网站时,浏览器通过查找所请求网页的快捷图标链接引用的来源来检查是否需要图标。
浏览器首先检查本地 F 缓存中是否有包含活动网站 URL 的条目。 如果存在图标条目,则将从缓存中加载该图标,然后显示。 但是,如果没有条目,例如因为在此特定域下从未加载过网站图标,或者缓存中的数据已过期,则浏览器会向服务器发出 GET 请求以加载网站的网站图标。

威胁模型

在本文中,解释了一种可能的威胁模型,该模型允许为每个浏览器分配唯一的标识符,以便得出有关用户的结论,并且即使在应用反指纹措施(例如使用 VPN、删除 cookie、删除浏览器缓存或操纵客户端标头信息。

Web 服务器可以得出浏览器是否已经加载图标的结论:
因此,当浏览器请求网页时,如果该 favicon 不在本地 F-cache 中,则会对该 favicon 发出另一个请求。 如果该图标已存在于 F-Cache 中,则不会发送进一步的请求。
通过组合浏览器的特定 URL 路径的已交付和未交付网站图标的状态,可以向客户端分配唯一的模式(标识号)。
当网站重新加载时,网络服务器可以利用客户端针对丢失的图标发送的网络请求来重建标识号,从而识别浏览器。

写入标识

写操作的目标是生成唯一标识符并将其存储在客户端。
第一步是在服务器上创建一个新的 N 位 ID,并将其转换为路径向量,如下所示。

const N = 4;
const ROUTES = ["/a", "/b", "/c", "/d"];
const ID = generateNewID(); // -> 1010 • (select unassigned decimal number, here ten: 10 -> 1010b in binary)
const vector = generateVectorFromID(ID); // -> ["/a", "/c"] • (because [a, b, c, d] where [1, 0, 1, 0] is 1 -> a, c)

第二步是将实际数据存储在浏览器中:
用户将沿着所有网站路径重定向,从 /a 开始,导航到 /b、/c,最后到 /d。

  • /a

  • /b

  • /c

  • /d

当用户在每次加载时被重定向时,浏览器会请求相应路线的收藏夹图标,其方式与/a/favicon.ico相同,到/b/favicon.ico,到/c/favicon.ico,最后到/d /favicon.ico。

  • /a/favicon.ico

  • /b/favicon.ico

  • /c/favicon.ico

  • /d/favicon.ico

网络服务器现在将仅处理其路径存在于先前创建的路径向量中的那些图标请求。 如果路由存在,网络服务器会使用 favicon 文件和状态 200 OK 进行应答。
如果请求的路由不在路径向量中,Web 服务器将中止请求并返回错误 404 Not Found,或者不发送任何响应。
由于浏览器(如前所述)仅将交付的网站图标存储在 F-Cache 中,因此我们现在已经存储了唯一的标识号,并且写入过程已完成。

在上面的示例中,网络服务器仅响应路径 /a/favicon.ico 和 /c/favicon.ico 下的 favicon 请求。 F-Cache 仅具有这两个路径的收藏图标条目。
示意图

读取标识

这里的目标是根据返回用户的现有 F-Cache 条目重新识别该用户。

在读取模式下,服务器始终以错误 404 未找到状态响应网站图标请求,但正常响应所有其他请求。 这在读取操作期间保留了缓存的网站图标的完整性,因为浏览器不会创建新的 F 缓存条目。
要重建访问者的标识符,浏览器必须通过所有可用的路由。 服务器记录浏览器请求哪些收藏夹(那些不存在于浏览器 F 缓存中的收藏夹)以及哪些不存在。

const visitedRoutes = [];
Webserver.onvisit = (route) => visitedRoutes.push(route);  // -> ["/b", "/d"]
Webserver.ondone = () => { const ID = getIDFromVector(visitedRoutes) }; // -> 10 • (because "/a" and "/b" are missing -> 1010b)

服务器因此可以根据丢失的网站图标请求重建标识,并且读取过程完成。

来源

gpt4分析:
用户跟踪的方法
基本思路:文章描述了一种方法,通过检查浏览器是否请求特定网站的 Favicon 来跟踪用户。
如何实现:
当用户第一次访问网站时,浏览器会尝试加载该网站的 Favicon。如果这个 Favicon 不在浏览器的本地缓存中,浏览器会向服务器发送请求来获取它。
服务器可以通过记录哪些 Favicon 被请求(或没有被请求)来识别浏览器。因为每个浏览器的 Favicon 缓存状态都可能有所不同,这就为每个浏览器创建了一个“指纹”。
写入和读取标识
写入标识:服务器根据访问特定路由的浏览器请求 Favicon 的情况,创建一个唯一的标识符,并存储在浏览器的 F-Cache 中。
读取标识:当浏览器再次访问服务器时,服务器检查浏览器请求哪些 Favicon,从而重新识别并确认浏览器的标识符。