本文へスキップ

アーキテクチャ

Clearcote が Chromium の上にプライバシーとアイデンティティの制御を、透明性を保ったまま重ねる仕組みを説明します。

スタック構成

オープンビルドは薄く、監査しやすいスタックです。各レイヤーはオープンで、差し替えもできます:

text
            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 で検証されますが、公開ソースから再ビルドすることはできません。

スクリプト注入ではなく、エンジンレベルで

「ステルス」系ツールの多くは、JavaScript を注入して実行時に navigator のプロパティを上書きします。この方法は壊れやすく、自らの存在を露呈します。上書きそのものがフィンガープリントになってしまうのです(不自然なプロトタイプチェーン、getter のタイミング、ネイティブコードとして文字列化されないこと)。

Clearcote はそうではなく、C++ エンジンそのものを変更します。ページが読み取る値は Chromium が普段から使っているのと同じコードパスで生成されるため、見つけられるような注入レイヤーは存在しません。JavaScript ではそもそもきれいに横取りできない API もカバーできます。

整合性のあるアイデンティティと、サイトごとのレンダリングノイズ(farbling)

シグナルを 1 つずつ独立にランダム化すると、つじつまの合わないアイデンティティになり、それ自体が決定的な手がかりになります。Clearcote はペルソナを 1 つのシードから導出し、レンダリングノイズはそのシードとサイトの登録可能ドメインを組み合わせて導出します:

  • 内部で一貫している:プラットフォーム、GPU、画面、ハードウェアが互いに矛盾しません。タイムゾーンと言語は、指定したオプションか geoip から決まります。
  • サイトごとに安定している:同じサイトには、セッションを通じて同じアイデンティティが見えます。
  • サイトごとのレンダリングノイズ:canvas と WebGL の読み出し結果はサイトごとに異なるため、レンダリングのハッシュはドメインをまたいで一致しません。ハードウェア系の値は、実機と同じくどのサイトでも変わりません。

この eTLD+1 単位のノイズモデルは、Brave の farbling の手法に着想を得ています。ノイズはシードがあるときだけ有効で、--fingerprint シードがなければノイズは一切かかりません。

整合性のあるペルソナ:1 つのシードから、本物らしい 1 台のマシンを

Clearcote は、シグナル単位のノイズからさらに一歩進んでいます。1 つの --fingerprint シードから、提示するプラットフォームに合わせた 1 つの整合性のあるペルソナを導出します。つまり、各プロパティが互いに矛盾しない、本物らしい 1 台のマシンです。SDK はデフォルトでホスト OS(Windows または Linux)を提示します。macOS の UA と、ベストエフォートの Android ペルソナも指定すれば使えます。シードからは、ハードウェアティア(実際にその組み合わせで出荷されている CPU コア数と RAM。20 コアに 4 GB といった組み合わせにはなりません)、それに見合った画面解像度・色深度・デバイスピクセル比、整合性のある GPU、実在する Chrome のバージョンが決まります。

ハードウェア系のプロパティはセッション中は一定です。実機がサイトごとにコア数や画面サイズを変えることはないからです。一方、揺らぎを加えるレンダリング面(canvas と WebGL のピクセル)はサイトごとに farbling されたままなので、ドメイン間で相関しない状態が保たれます。Client rects とレンダリングされた音声には揺らぎを加えません。ただし、AudioContext の sampleRate、baseLatency、outputLatency は、ペルソナが有効なときは常にペルソナの値になります。このトレードオフについては farbling する項目と、あえてしない項目で説明しています。

これが重要なのは、現在の検知で最も強力なシグナルが個々の値ではなく、内部の矛盾だからです。ある OS を名乗りながら別の OS のように描画するマシンや、コア数の多い CPU に少なすぎる RAM を組み合わせたマシンがその例です。すべてのシグナルを 1 つのペルソナテーブルから導出すれば、どのシグナルもつじつまが合います。使うのはすでに渡している --fingerprint シードと同じもので、新しいフラグは必要ありません。

アイデンティティの提示方法は 3 つあります。light-stealth プリセット(いくつかのメタデータ値のみ。シードもノイズもなし)、上で説明したシード付きペルソナ、そして実機から取得したキャプチャ済みプロファイル(fingerprint_profile、またはライセンスビルドのプロファイルライブラリから選ぶ profile="auto")です。どれから始めるべきかは推奨設定を参照してください。

制御できる項目

Canvas 2DWebGL レンダラー(セッション中は一定の GPU)WebGL getParameter の上限値WebGPU アダプターフォントタイムゾーン言語(Accept-Language、navigator.languages、Intl)User-Agent + UA-CHTLS ClientHello のペルソナ(JA3/JA4)hardwareConcurrencydeviceMemory画面のジオメトリストレージクォータnavigator.webdriverヘッドレスの痕跡closed なシャドウルートWebRTC のプロキシ IPnavigator.getBatterynavigator.connectionキーボードレイアウトマップgetScreenDetails / マルチスクリーンCSS の pointer/hover メディア特性AudioContext のメタデータ(サンプルレート / レイテンシ)音声合成のボイスnavigator.shareURL のドライブレターと OS の整合性ブラウザ内蔵の AI エージェントMediaCapabilities のコーデックenumerateDevicesUA-CH の bitness/WoW64

ビルドターゲット

オープンビルドは Chromium 149 ベースで、Windows x64(Linux からのクロスコンパイル)と Linux x64(ネイティブ)を対象としています。ライセンスビルドは Chromium 153 ベースです。オープンビルドの完全なレシピと、クロスビルドの落とし穴はすべて文書化されているので、誰でも再現できます。ソースからのビルドを参照してください。