架构
Clearcote 如何在 Chromium 之上叠加隐私与身份控制——全程透明。
技术栈
开源版构建是一个轻薄、可审计的技术栈,每一层都是开放、可替换的:
Chromium (Google, BSD-3)
|
ungoogled-chromium -> removes Google services, telemetry, integration
|
Clearcote patches -> engine-level identity & privacy controls
|
reproducible build -> checksummed, GPG-signed, rebuildable by anyone (open build)
|
Clearcote Browser + SDK (Playwright objects) / CDP endpoint授权版构建(GitHub 免费版和 Pro)在这一技术栈之上加入了未公开的补丁。下载时会校验它的 SHA-256,但它无法从公开源码重新构建。
引擎层面修改,而非脚本注入
大多数“stealth”工具通过注入 JavaScript 在运行时覆盖 navigator 属性。这种做法既脆弱又会暴露自己——覆盖行为本身就会变成指纹(原型链不对、getter 时序异常、字符串化时缺少原生代码标记)。
Clearcote 的做法是直接修改 C++ 引擎。页面读到的值由 Chromium 一直在用的同一套代码路径产生,因此不存在可被检测的注入层。这也覆盖了那些 JavaScript 根本无法干净拦截的 API。
身份一致,渲染噪声按站点区分(farbling)
对每个信号各自随机化,拼出来的身份会前后对不上——一眼就会露馅。Clearcote 从一个种子(seed)派生出身份画像(persona),再用这个种子加上站点的可注册域名来派生渲染噪声:
- 内部一致——平台、GPU、屏幕和硬件彼此吻合;时区和语言来自你的选项或
geoip。 - 按站点稳定——同一站点在一次会话中看到的始终是同一个身份。
- 按站点区分的渲染噪声——canvas 和 WebGL 的读回结果因站点而异,因此渲染哈希无法跨域名匹配。硬件类的值在所有站点都保持不变,和真实机器一样。
这种按 eTLD+1 区分的噪声模型借鉴了 Brave 的 farbling 方案。噪声由种子控制:没有 --fingerprint 种子,就没有噪声。
一致的身份画像——一个种子,一台可信的机器
Clearcote 比逐个信号加噪更进一步。一个 --fingerprint 种子会为你所呈现的平台派生出一个一致的身份画像——一台各项属性彼此吻合、令人信服的机器。SDK 默认呈现你的宿主操作系统(Windows 或 Linux);如有需要,也可以使用 macOS UA,以及尽力而为的 Android 身份画像。它会根据种子抽取一个硬件档位(真实机器上确实会搭配出现的 CPU 核心数和内存——绝不会出现 20 核配 4 GB 的组合),以及与之匹配的屏幕分辨率、色深和设备像素比、一致的 GPU,还有一个真实存在的 Chrome 版本。
硬件类属性在整个会话中保持不变——真实机器不会在访问不同站点时改变核心数或屏幕尺寸——而受扰动的渲染面(canvas 和 WebGL 像素)仍按站点施加扰动,因此你在不同域名之间仍然互不关联。Client rects 和渲染出的音频不做扰动——不过只要启用了身份画像,AudioContext 的 sampleRate、baseLatency 和 outputLatency 就会取自身份画像;哪些内容会被扰动、哪些刻意不扰动一节解释了其中的取舍。
为什么这很重要:现代检测中最强的信号并不是某个单一的值,而是内部矛盾——一台机器声称是某个操作系统,渲染结果却像另一个;或者高核心数的 CPU 配着过少的内存。从同一张身份画像表派生出所有信号,能让它们口径一致。它使用的正是你已经在传的 --fingerprint 种子(无需新增参数)。
呈现身份有三种方式:light-stealth 预设(只改少量元数据值,没有种子,也没有噪声)、上文的种子身份画像,或者从真实机器采集的配置文件(fingerprint_profile,或从授权版配置文件库中取用的 profile="auto")。该从哪一种入手,请参阅推荐设置。
可控制的内容
构建目标
开源版构建面向 Windows x64(在 Linux 上交叉编译)和 Linux x64(原生编译),基于 Chromium 149;授权版构建基于 Chromium 153。开源版构建的完整构建方法——以及交叉编译中的每一个坑——都有文档记录,任何人都能复现。请参阅从源码构建。