アンチディテクトブラウザの仕組み:技術的な完全解説

フィンガープリントの対象面、整合性のあるアイデンティティの生成、ディスク上のストレージ分離、プロファイルごとのルーティング、そしてこのアプローチの正直な限界を解説します。
アンチディテクトブラウザは四つの仕事をします。各プロファイルの閲覧データを別々に保存すること、各プロファイルが報告するデバイスのアイデンティティを制御すること、各プロファイルの通信を独立してルーティングすること、そしてその三つを時間が経っても整合させ続けることです。この記事では、それぞれの仕事がどう行われているかを仕組みのレベルで順に見ていき、最後にこのアプローチにできないことを述べます。
フィンガープリントの対象面
まず、ページが何を読み取れるかから始めます。それ以外はすべてその対策だからです。どのウェブサイト上のスクリプトも、ブラウザに質問でき、その答えがマシンを描き出します。対象面は自然にいくつかに分類できます。
| 対象面 | ページが読み取るもの |
|---|---|
| Navigator | ブラウザ名とバージョン、プラットフォーム、言語リスト、報告されるプロセッサ数とメモリ、タッチ対応 |
| 画面 | 幅、高さ、利用可能な作業領域、色深度、デバイスピクセル比 |
| Canvas | 画面外でテキストや図形を描画して得られる正確なピクセルを、安定した値にハッシュ化したもの |
| WebGL | グラフィックスのベンダー文字列とレンダラー文字列、および描画したシーンのハッシュ |
| オーディオ | オシレーターの出力をオーディオ処理グラフに通した結果。スタックによって異なります |
| フォント | どの書体がインストールされているか。テキストの計測から推測されます |
| タイムゾーンと時計 | 報告されたゾーンとオフセット。通信の到着元と照合されます |
| ネットワーク | アドレスそのもの、WebRTCから見える接続候補、TLSハンドシェイクの形 |
どの行も単独ではマシンを特定しません。特定するのは組み合わせであり、嘘が見破られるのもまた組み合わせです。一つの本物のマシンにはあり得ない値の組は、どの単独の値よりも大きな信号になります。
収集は安価で、静かに行われます。表のすべての値は、許可のプロンプトなしに、文書化されたAPIを通じて任意のページから取得でき、そのほとんどは訪問の最初の1秒で届きます。この慣行にどんな立場を取るにせよ、現代のウェブにおける動かしがたい事実であり、アンチディテクトブラウザが対抗するために設計される基準線です。
整合性のあるアイデンティティはどう生成されるか
素朴な方法は、各質問を横取りして答えをランダム化することです。これは構造的な理由で失敗します。答えは一つのマシンを描いているため相互に相関しており、独立したランダムな答えはその相関を壊してしまいます。Windowsのユーザーエージェントなのに、macOSにしか付属しないフォントが並んでいること、どのノートPCにも搭載されたことのない画面サイズ、主張するプラットフォームと共存したことのないグラフィックス文字列。いずれも、チェックする側が安価に検証できる矛盾です。
そのため、実用的なアンチディテクトブラウザはアイデンティティを一式として生成します。実在する一般的なマシンの種類から出発し、すべての値をその選択から導きます。プラットフォームが、もっともらしいフォントリスト、グラフィックス文字列、タッチ対応を決めます。画面は、その種類のマシンが実際に出荷されるサイズから選ばれます。言語とタイムゾーンは、プロファイルが想定する地域から決まります。値同士が整合するのは、一つのマシンの一つの記述から、まとめて選ばれたからです。
二つ目の性質も同じくらい重要です。その一式が保存されることです。プロファイルの作成時にプロファイルへ書き込まれ、すべてのセッションが同じ値を報告します。訪問のたびに変わるデバイスは、誰も所有していないハードウェアを描写しているからです。安定性は、もっともらしさのほとんどを占めています。
ディスク上のストレージ分離
ストレージの仕事は最も地味で、最も妥協のないものです。各プロファイルは自分のディレクトリを所有し、ブラウザが永続化するすべてがその中に置かれます。クッキーデータベース、Local Storage、IndexedDB、HTTPキャッシュ、Service Workerの登録情報、拡張機能の状態、履歴、保存された認証情報などです。二つのプロファイルは互いに素な二つのディレクトリであり、実行中の各ブラウザはそれぞれ自分のディレクトリを指しています。
確認すべきは完全に互いに素であることです。部分的な分離は静かに失敗するからです。クッキーを分けるのは簡単です。キャッシュは、保持したリソースを通じて再訪ブラウザを識別できます。Service Workerは識別子を保持し、訪問の合間にも動き続けられます。IndexedDBは、現代のアプリケーションが本当に信頼するレコードを置く場所です。有名なストアだけを分離して他のストアを共有していれば、問題の目に見える部分だけを分離したにすぎません。
永続性はもう一方の半分です。セッションには価値が蓄積されます。完了したセキュリティチェック、確立されたログイン履歴、再訪者としての特徴。プロファイルはセッションをまたいで自分のディレクトリを保持し、それがアカウント運用を可能にしています。閉じるときの書き出しがディレクトリを永続化するため、セッションの途中でプロファイルのプロセスを強制終了すると、確立したばかりのセッションを失うことがあります。
ネットワークのルーティング
各プロファイルは自分のルートを持ち、ブラウザの起動時に適用されます。そのため通信は、システム設定にも他のプロファイルのルートにも触れずに、そのプロファイルのプロキシから出ていきます。
- プロキシはマシン単位ではなくプロファイル単位で割り当てられます。通常のブラウザはシステムのプロキシを使いますが、ここでは実行中の各プロファイルが自分のエンドポイント経由で接続します。
- 名前解決もルートを通ります。あるリクエストが一つの国から届くのに、その名前の問い合わせが別の国から届くのは、ネットワーク層の矛盾だからです。
- WebRTCはルートと一致するよう制約されます。放置すると、プロキシが一切関与していない接続候補を露出させることがあります。
- タイムゾーンと言語はルートの国に合わせます。アドレスは生成できない唯一の値であり、残りのストーリーをそれに合わせる必要があるからです。
ルートは、第三者から購入するものなので、独立して検証する価値が最も高い構成要素でもあります。割り当てる前にエンドポイントをテストし、宣伝されたアドレスではなく観測されたアドレスを読み取って確認すれば、問題がアカウントの問題になる前の、まだ設定の問題の段階で失敗を捕まえられます。
ブラウザ自体が変えるもの
ツールがページの受け取る答えを変えられる場所は二つあり、その違いはこの分野で最も技術的な分かれ道です。
| アプローチ | 仕組み | 弱点 |
|---|---|---|
| スクリプトの注入 | 拡張機能や注入されたスクリプトがページの呼び出す関数を上書きし、canvasの読み取りやnavigatorの参照が置き換えた値を返す | 上書き自体が見えてしまう。パッチされた関数はパッチされたものとして認識でき、注入側が見落とした対象面は本物の値のまま答える |
| ブラウザ自身のコード内 | ブラウザの実装が、本物の値を生み出すコード経路の中で、プロファイルに保存された値で答える | 構築と保守にはるかに多くの労力がかかる。だからこそ専用ツールと拡張機能が区別される |
注入方式はこのカテゴリの出発点であり、その限界はよく知られています。ページはネイティブ関数がまだネイティブに見えるかを確認でき、注入が覆っていない経路から同じ対象面にたどり着けます。そのため専用に作られたアンチディテクトブラウザは、ブラウザ自体の内部で変更を行い、それを読み取るあらゆる経路で、保存されたアイデンティティが実装から報告されるようにしています。
プロファイルを開くと実際に何が起きるか
- 保存されたアイデンティティが読み込まれます。デバイスの値の整合した一式で、前回と同じ一式です。
- ブラウザはプロファイル自身のディレクトリを対象に起動するため、すべての永続ストアがそのプロファイル自身のものになります。
- ルートが適用されます。プロキシ、それを通した名前解決、それに制約されたWebRTCです。
- セッションが動き、ディレクトリの中に状態が蓄積されます。
- 閉じるときに状態が書き出され、次に開くと同じデバイス、同じストレージ、同じルートで再開します。
このリストの各部分は、外部から確認できます。フィンガープリントのテストページを2回開いて値を比べる。ディスク上のプロファイルディレクトリを見る。観測されたアドレスを読み取る。このカテゴリのツールは、そうした確認を歓迎するべきです。仕組みそのものが製品だからです。
正直な限界
このアプローチには限界があり、それを知っておくことも使いこなす一部です。
- ブラウザを識別不可能にすることはできませんし、そのような主張は誰にも測定できません。現実的な目標は、普通で内部的に整合したマシンとして読め、安定しているプロファイルです。
- 自分で持ち込んだ矛盾は直せません。ルートが一つの国にあるのにタイムゾーンが別の国にあるのは設定ミスであり、ツールにできるのは正しい設定を簡単にすることだけです。
- 行動はカバーしません。タイミング、量、リズムは環境と並んで読まれ、各環境がどれほどクリーンでも、一斉に動く群れは自らを名乗ってしまいます。
- 申告されるアイデンティティもカバーしません。共有された復旧用情報、共有された支払い手段、使い回された文章は、ブラウザよりはるか上のプラットフォーム自身の記録を通じてアカウントを結び付けます。
- プラットフォームのルールは変えません。分離は正当な環境同士を分けるものです。何が許されるかはプラットフォームが決めることであり、私たちが管理できないプラットフォームでの結果は、ここでは何も約束しません。
限界は失望ではなく定義として読んでください。アンチディテクトブラウザは一貫性を保つための道具です。分離されたストレージ、安定してもっともらしいアイデンティティ、それに合うルート。それらをプロファイルごとにまとめ、開くたびに同一に繰り返します。これが仕組みのすべてであり、このカテゴリについて書かれた他のあらゆることは、その変奏にすぎません。

