web-dev-qa-db-ja.com

ブラウザキャッシュ情報の開示

ブラウザが画像などの外部リソースを読み込むために必要な時間を監視すると、それらのリソースが以前にアクセスされたかどうかに関する情報が明らかになる可能性があります。

説明:

たとえば、<image src="https://cdn.sstatic.net/Sites/security/img/sprites.svg?v=a1e0cd003b7d">を介してStackOverflowロゴをサードパーティのウェブサイトに埋め込み、読み込み速度を観察することで、このサードパーティは、訪問者が最近StackOverflowにアクセスしたかどうかを推測できます。

これは、ブラウザのキャッシュにまだ存在せず、インターネット経由で転送する必要のあるリソースと比較して、キャッシュされたリソースのロード時間がはるかに短いためです。

ロード時間はいくつかの方法で観察できます。その1つは、DOM onloadイベントハンドラーをアタッチし、ソースを要求してからloadイベントが発生するまでの時間を測定することです。

この方法には、考慮すべきいくつかの落とし穴があります。

  • HTTP応答ヘッダーがキャッシュを防止または制限する可能性があります
  • 最初のDNS解決にはさらに時間がかかる場合があります
  • リソースURLにはいくつかの変数トークンが含まれている可能性があります

例:

ただし、通常はかなりうまくいきます。次のChrome=のスニペットでは、ユーザーがpornhub.com [NSFW]にアクセスしたかどうか、いつアクセスしたかを確認できます。

function cached(src) {
  return new Promise((resolve, reject) => {
    const img = new Image();
    img.onload = (event) => resolve(src);
    img.onerror = (event) => reject(src);
    img.src = src;
    setTimeout(() => img.src = '', 10);
  });
}

cached('https://bi.phncdn.com/www-static/images/pornhub_logo_straight.png?cache=2018011910').then(
  src => console.log('visited between 24.01 and 28.01'),
  src => console.log('not visited')
);

さて、上記のスニペットは堅牢ではなく、完全ではありません。リソースのURLをターゲットWebサイトから要求された日付の範囲と一緒に追加することにより、かなり詳細なプロファイルを作成できます。もちろん、これは要点を得るためのかなり極端な例です。

質問:

  • ブラウザーのキャッシュを介して情報を推測することは既知の問題です。そのため、ユーザーまたはWebアプリケーション開発者が情報を防御するために利用できる対策はありますか?この問題は通常どのように対処されますか?
  • そのような情報開示の実際の悪用はありますか?
12
le_m

ブラウザのフィンガープリント

あなたが説明している問題は、 ブラウザのフィンガープリント の分野における多くの技術のうちの1つです。ブラウザのフィンガープリントには主に3つのタイプがあり、多くの場合関連しています。研究の量の順に、次のとおりです。

  • デバイスのフィンガープリントは、個々のユーザーを区別することを目的としています。 IPアドレスに基づいて識別できない場合、ブラウザで一意の識別子を見つけることに重点を置いています。これは最もよく研​​究されており、多くの 概念実証 が利用可能であり、緩和するのが最も困難です。極端な場合、これはオペレーティングシステムやブラウザに関係なく 一意のデバイスを検出 できます。

  • Supercookies、これはWebサイトがブラウザに挿入できる永続的な識別子です。これらは真のCookieではないため、Cookieがクリアされても削除されません。これは、巧妙なキャッシュフィンガープリント、HTML5 Webストレージ、 [〜#〜] hsts [〜#〜] または [〜#〜] hpkp [〜#〜] で実装できます。 =、例えば。

  • 履歴スニッフィング。これは、訪問者が別の無関係なサードパーティWebサイトも訪問したかどうかを1つのWebサイトが検出することを含みます。これはスーパークッキーに似ていますが、意図せずにサードパーティのサイト設定に依存しています。履歴スニッフィング手法を使用してスーパーCookieを実装できますが、その逆は常に当てはまるとは限りません。これはあなたが求めていることです。

TCP/IPフィンガープリントと呼ばれる種類のフィンガープリントもあり、ネットワークスタックフィンガープリントまたはOSフィンガープリントとも呼ばれます。これには、コンピュータで使用されているネットワークプロトコルの低レベルの構造(設定されているオプションとその順序、ISNとTCPシーケンス番号など)を調べることが含まれます。これを回避するには、 Torなどの「真の」プロキシ(独自のネットワークスタックを使用するため、VPNは機能しません。この手法は、収集できる情報の量に制限があります。これはブラウザに固有ではないため、詳細には触れません。動作例とその機能については、TCP p0f などのフィンガープリントユーティリティの例を参照してください。

緩和

特定のWebサイトにアクセスしたかどうかをWebサイトが検出しないようにするために、ブラウザは、Webサイトにアクセスしてから別のWebサイトがアクセスを確認しようとするまでの間、永続的な情報を保持してはなりません。多くの場合、Cookieなどの特定の識別子のみをクリアするため、プライベート/シークレットモードでは不十分です。最も効果的な解決策は、一時データディレクトリを用意することです。これは Tor Browser で使用される手法であり、ブラウザの再起動全体で最後の2つのフィンガープリント手法を回避し、最初のブラウザパッチによる制限を試みます。

多数の「プライバシープラグイン」の1つとカスタム構成を使用することは効果的な緩和策ではありません。多くの場合、実際には anonymity set を減らすことでブラウザーのフィンガープリントに追加されますが、トラッキングベクトルのすべてまたはほとんどが削除されません。完全なソリューションには、フィンガープリントのために悪用される可能性のあるさまざまな機能を削除するための重いパッチを適用した、標準バージョンを実行する標準化されたブラウザーが必要です。 Tor Browserはこれを行いますが、完璧ではなく、さまざまなレベルの影響を持つ現存するフィンガープリントベクトルには多くの オープンチケット があります。たとえば、ブラウザが実行されているオペレーティングシステムを識別するためのいくつかの異なる方法の複数のオープンチケットがあります。

一般に、ブラウザのフィンガープリントを軽減するための最も効果的な戦略は次のとおりです。

  • Torブラウザの最新の official バージョンを使用してください。
  • 「セキュリティスライダー」を高に設定すると、JavaScript(一般的な指紋ベクトル)が無効になります。
  • 構成設定を変更したり、プラグインをインストールしたりしないでください。
  • ブラウザを再起動してフィンガープリントをクリアします。これは、セッション間のIDのみを分離できるためです。

これは、履歴の盗聴のみを避け、デバイスのフィンガープリントやスーパークッキーを気にしない場合でも必要になることがあります。他のすべてのブラウザは、私の知る限り、プロファイルをリセットしたり、プライベート/シークレットモードを呼び出したりしても、特定の状態を維持します。これにより、特定のサードパーティのサイトにアクセスしたかどうかを検出できます。

実際の影響

さまざまな形式のブラウザフィンガープリントを使用して、サイト全体のユーザーとCookieをクリアした(またはプライベートモードで閲覧した)ユーザーを追跡する キャッチされた がある広告ネットワークについて議論するさまざまなニュース記事と論文があります。ブラウザキャッシュに関連する特定のインシデントについては知りませんが、それはおそらく、他に使用できる堅牢な手法があるためです。広告会社は通常 キャンバスフィンガープリント が最も一般的なベクトルの1つであるデバイスフィンガープリントを使用し、 AudioContextフィンガープリント などのより高度でステルスな手法も使用されます。

3
forest