Canvasフィンガープリンティングの解説:同一のブラウザなのに描画されるピクセルが違う理由

Canvasフィンガープリンティングは、多くの人が耳にしたことがあるのに、説明できる人が最も少ない手法です。考え方は単純で、ブラウザに何かを描画させ、ピクセルを読み戻してハッシュ化します。興味深いのは、そもそもなぜマシンによってピクセルが異なるのかという点です。
描画
フィンガープリント用のスクリプトは、オフスクリーンの<canvas>を作成して2Dコンテキストを取得し、短い一連の描画を行います。塗りつぶした長方形、指定したフォントのテキスト、場合によってはグラデーション、曲線、絵文字などです。その後toDataURL()またはgetImageData()を呼び出して結果を読み取り、そのバイト列をハッシュにかけます。出力は71ae464eのような短い文字列で、この文字列が「Canvasハッシュ」です。
描画に秘密はなく、ページが説明できないものがGPUに送られるわけでもありません。情報は命令ではなく、レンダリングの中にあります。
ピクセルが異なる理由
変動の主な原因はテキストです。グリフを描画するには、実際に選ばれたフォントファイル(フォールバックはオペレーティングシステムごとに異なります)、ヒンティングとアンチエイリアスの方式(グレースケールかサブピクセルか、サブピクセルの並び順はどちらか)、ラスタライザー(FreeType、DirectWrite、CoreText、あるいはブラウザ独自のもの)、そして合成をGPUとCPUのどちらが行ったか、が関わります。これらのそれぞれが、エッジのピクセルにわずかな違いを生みます。「e」の縁にある薄いグレーのピクセルが1つ違うだけで、ハッシュはまったく変わってしまいます。
グラデーションや曲線がさらに違いを加えます。グラフィックスドライバやアンチエイリアスの経路が異なれば、中間値の丸め方も異なるからです。その結果、ブラウザのバージョンが同じでもGPU、ドライバ、オペレーティングシステムが異なる2台のマシンは通常異なるハッシュを生成し、同じマシンは毎回同じハッシュを生成します。安定していて多様。トラッカーが望むのは、まさにそれです。
ハッシュからサイトが分かること
ハッシュ単体では、あなたが誰かについては何も分かりません。このブラウザがこの描画をこのように処理する、ということが分かるだけで、それはあるマシンの集団に当てはまります。重要なのはその集団の大きさです。内蔵グラフィックスとデフォルトのフォントを持つ一般的なノートパソコンは、多くの他のマシンとハッシュを共有します。珍しい構成なら、ほぼ唯一のものになることもあります。画面サイズ、言語リスト、レンダラーの文字列と組み合わされると、ありふれたハッシュでさえ、稀な組み合わせの一部になります。
ブラウザの対策
Firefoxは、resist-fingerprintingを有効にすると空白またはランダム化されたCanvasを返し、Canvasへのアクセスについて確認を求めることがあります。Braveは、Canvasの読み取りに小さなランダムな摂動を加えるので、ハッシュはサイトやセッションごとに変わります。Safariは見えるフォントを制限し、一部の読み戻しに制約をかけます。Chromium自体はCanvasをランダム化しません。それを土台にしてフィンガープリントの制御を目指すブラウザは、独自のパッチで実現しており、そのパッチの質はまちまちです。
ノイズは無料ではありません。訪問のたびに変わるCanvasハッシュは、それ自体がシグナルになります。本物のブラウザはそのような挙動をしないからです。分離されたブラウザプロファイルにとってより良い戦略は、もっともらしく、しかも一貫したハッシュです。そうすれば、1時間ごとに別のマシンになるのではなく、1台の普通のマシンに見えます。
診断で分かること
PowerScanは自前の小さな画像を描画し、そのハッシュを表示します。アップロードされることはなく、値はお使いのタブの中にしか存在しません。再読み込みしてもハッシュは同一のはずです。そうでなければ、ブラウザの何かがノイズを注入しているということで、そのプロファイルに頼る前に知っておく価値があります。


