ブラウザの指紋-匿名のブラウザ識別





バレンティン・ヴァシリエフ( Machinio.com



ブラウザフィンガープリントとは何ですか? またはブラウザの識別。 非常に単純な言い回しは、ブラウザに識別子を割り当てることです。 言葉遣いはシンプルですが、アイデアは非常に複雑で興味深いものです。 それは何のために使われますか? ブラウザに識別子を割り当てる必要があるのはなぜですか?











これにhttp cookieを使用しないのはなぜですか? 結局のところ、それは非常に簡単であり、誰もがそれを行う方法を知っています。 それは動作します、あなたはすべて方法を知っています。



ユーザーがサイトにアクセスし、Cookieを読み取ります。何らかの種類の識別子があれば、それを既に持っていて、彼が誰であるかがわかります。 すべての分析、追跡などを実行します。 このユーザーにリンクされています。



識別子がない場合は、ユーザーが初めて来たということです。 一意の識別子、GUI、ある種のバイナリ文字列を生成し、Cookieに書き込みます。次にユーザーが来たときに、このCookieを読み取り、このユーザーが2回目、3回目、それ以降にアクセスしたことを理解します。



Cookieには大きな欠点が1つあります-Cookieをクリーニングできます。 技術的に精通しているユーザーでさえ、Cookieをクリアする方法を知っています。 彼は「設定」をクリックし、入力してクリアします。 すべて、ユーザーはあなたのために再び匿名になります、あなたは彼が誰であるかわかりません。



Internet Explorerを含む最新のブラウザはすべて、シークレットモードを提供しているようです。 何も保存されていない場合、これはこのようなモードであり、ユーザーがこのモードでサイトにアクセスすると、彼は痕跡を残しません。 次回彼がシークレットモードに入ったとき、あなたは彼が誰であるか、または彼が以前あなたと一緒だったかどうかを再び知ることはありません。 つまり シークレットモードでは、http Cookieは機能しません。



現在、スノーデンなどのキャラクターの人気のため 多くの人々は、さまざまなプライバシーモード、インターネット上の匿名性、モード、プラグインなどを好みます。 これはすべて、インターネットでの追跡と識別を妨げます。 多くのユーザーは、理由さえ理解せずにこれを使用しています。 単にそれがファッショナブルだという理由だけで、インストールしてください。 そして彼らは再びあなたに匿名になります。 この場合、HTTP Cookieは機能しません。



プログラマーはどのようにしてこの問題を解決しようとしましたか?



クッキーに情報を保存する分野で最も成功したプロジェクトは、私の意見では、evercookieプロジェクト、または永続的なcookie-削除できないcookie、削除するのが難しいcookieです。 その本質は、evercookieはhttp cookieなどの情報を1つのストアに保存するだけでなく、最新のブラウザーのすべての利用可能なストアを使用するということです。 また、識別子などの情報を保存します。 彼はhttp cookieの使用を開始し、そこに識別子を書き込みます。その後、ブラウザでFlashが使用可能な場合、ローカル共有オブジェクトを使用していわゆる情報を記録します。 フラッシュCookie。







Cookieをクリアしても、最近までのFlash Cookieはクリアされませんでした。 通常のCookieをクリアすると、最新バージョンのGoogle ChromeのみがFlash Cookieをクリアできます。 つまり 最近まで、Flash Cookieは事実上削除できませんでした。 マクロメディアのWebサイトに特別なページがあり、「はい、Flash Cookieをクリアします」ボタンをクリックして、クリアする必要がありました。 このページなしではクリアできませんでした。







次に、evercookieはSilverlight Cookieを使用します。 それらは分離ストレージとも呼ばれます。 これは、Cookie情報が書き込まれるユーザーのコンピューターのハードドライブ上の特別に割り当てられた場所です。 正確なパスがわからない場合、この場所を見つけることはできません。 Windowsの場合は、コンピューターの腸の奥深くにある、Setting'ahのドキュメントのどこかに隠れています。 また、このデータはCookieクリアを使用して削除できません。







次。 Evercookieは、PNGクッキーなどの革新的なテクノロジーを使用しています。 一番下の行は、保存された情報(たとえば、識別子)がこの画像のバイトにエンコードされている画像をブラウザが送信することです。 この図は、キャッシングディレクティブを使用して、たとえば今後50年間、永久に提供されます。 ブラウザはこの画像をキャッシュし、次にユーザーがCanvas APIを使用してこの画像にアクセスすると、この画像のバイトが読み取られ、Cookieに保存する情報が復元されます。 T.O. ユーザーがCookieをクリアした場合でも、PNGでエンコードされたCookieを持つこの画像はブラウザーキャッシュに残り、Canvas APIは次回アクセスしたときにそれを読み取ることができます。







Evercookieは、最新のHTML 5標準、セッションストレージ、ローカルストレージ、インデックス付きDBなど、利用可能なすべてのブラウザーストレージを使用します。







ETagヘッダーも使用されます-これは非常に短いhttpヘッダーですが、一部の情報をエンコードできます。Javaがインストールされている場合は、Java Presistence APIが使用されます。







Evercookieは、データをほぼどこにでも保存できる非常にスマートなプラグインです。 これらすべてを知らない一般ユーザーにとって、これらのCookieを削除することはまったく不可能です。 ハードドライブの6〜8か所を訪れ、それらをきれいにするために一連の操作を行う必要があります。 したがって、通常のユーザーは、evercookieを使用するサイトにアクセスするとき、確かに匿名ではありません。



これらすべてにもかかわらず、evercookieはシークレットモードでは動作しません。 シークレットモードに入るとすぐに、データはディスクに保存されません。これはシークレットモードの基本であるため、匿名である必要があります。 また、evercookieはハードドライブ上のストレージを使用しますが、このモードでは機能しません。







FingerprintJSは、これらの問題を解決しようとしている、私が書いた小さなライブラリです。 彼女がそれをどのように行うのか、そして何から来たのかを説明します。



2012年に書きました。 その後、Buy-Coupon Rubyで開発者として働きました。 そして、私はそのような分析システムを作成して、ログインしたユーザーだけでなく、つまり、 システムにあるユーザーと匿名ユーザー。 具体的には、Buy-Coupon Webサイトには多くの匿名ユーザーがいました。これは、多くの人が外部から来て、クーポン、割引、オファーを見て、誰もアカウントを持っていなかったため、追跡システム、訪問したページの追跡システム、ボタン-ユーザーは匿名であるため、これはすべて機能しませんでした。



FingerprintJSは通常、Cookieを使用しません。 ブラウザーがインストールされているコンピューターのハードドライブに情報は保存されません。 原則としてハードドライブのストレージを使用しないため、シークレットモードで動作します。 依存関係はなく、jQueryがなくても機能し、サイズは1.2 Kb gzip圧縮されています。







現在、Baiduなどの企業で使用されています。これは中国のGoogle、米国大統領のサイトであるMasterCard、AddThisはウィジェットなどを配置するためのサイトです。



このライブラリはすぐに非常に人気がありました。 現在、インターネットで最も訪問されているサイトの約6〜7%で使用されています。







どのように機能するか、詳しく説明します。 その本質は、このライブラリのコードがユーザーのブラウザーをポーリングして、このブラウザーとこのシステム、コンピューターのすべての特定の固有の設定とデータをポーリングすることです。 このデータは巨大な文字列に結合され、ハッシュ関数の入力に送られます。 ハッシュ関数はこのデータを受け取り、コンパクトで美しい識別子に変換します。 それがどのように詳細に機能するか、私は伝えます。



userAgentナビゲーターが最初に読み取られます。 ここでトリミングされ、指紋の最終行に結合するとします。







ブラウザの言語が読まれます-あなたが持っている言語は何ですか-英語、ロシア語、ポルトガル語など。 指紋ラインにも取り付けられています。



タイムゾーンが読み取られます。これはUTCからの分数です。







-180。



これは-3であり、モスクワであることがわかります。







次に、画面サイズ、配列、画面の色深度が取得されます。







次に、サポートされているすべてのHTML5テクノロジー、つまり 各ブラウザには異なるサポートがあります。 FingerprintJSは、サポートされているものとサポートされていないものを判別しようとしています。各テクノロジーについて、このテクノロジーの可用性の調査結果とサポートの程度が最終印刷機能に追加されます。







SessionStorage、LocalStorage、IndexedDB、OpenDatabase、その他各種。



doNotTrack設定(doNotTrack設定が追跡のみに使用されることは非常に皮肉です)、プロセッサーのcpuClass、プラットフォーム、およびその他のデータなど、ユーザー固有およびプラットフォーム固有のデータをポーリングします。







ここで論理的な質問があるかもしれません-結局のところ、非常に多くのユーザーにとって、このデータは同じですか? ユーザーがモスクワに住んでいて、同じ言語、最後のChromeを持ち、ほぼすべてのものを持ち、この段階で受け取ったこれらの行がすべて同じであるとします。 これはユーザーを識別するのにどのように役立ちますか?



一意性を追加する方法はさらに2つあります。















ここで問題が発生します。これはどのように識別するのにも役立ちますか? 私が予期しなかったのは、私が見つけた研究です。 特にCanvas APIでのフォントのレンダリングは、プラットフォームに大きく依存していることが示唆されています。 異なるブラウザで描画された外部的に同一の同一の画像は、異なるバイト配列に変換されます。 なんで? プロセッサ、ビデオカード、ビデオカードドライバー、ダイレクトXなどのシステムライブラリ、フォントレンダリングシステム、シャドウに依存します-これらはすべてコンピューターごとに異なる可能性があるため、結果のバイト配列は、ハードウェアとソフトウェアが異なるほとんどすべてのコンピューターで異なります詰め物。 そして、Canvasをシリアル化して得られたこの長い行は、最終的な印刷物に添付され、巨大な行を取得します。







仕組みを示しています。 このすべてのデータを取得します。 次に、それらをハッシュ関数に渡します。FingerprintJSでは、nomo hash2が使用され、出力では32ビットの数値が取得されます。 これはあなたの識別子です。 したがって、ユーザーがサイトにアクセスすると、ユーザーに番号が割り当てられます。 好きなようにこの番号を読んで使用します-あなたはそれに基づいて分析などを行います



問題は、定義がどれほどユニークで正確かということです。 に基づいた研究は、Electronic Frontier Foundationによって行われ、Panopticlickプロジェクトがありました。 一意性は約94%ですが、私が持っていた実際のデータでは、一意性は約90%-91%でした。



このライブラリは多くの人々や企業によって使用されるようになり、やがて多くの欠点が明らかになりました。 つまり それは不完全であり、欠陥があります。 主な欠点は、識別精度が90%に過ぎないことですが、他にも欠点があります。







  1. UserAgent。 最新のブラウザでは、UserAgentは頻繁に変更され、2か月ごとにGoogle Chromeの新しいバージョンがリリースされます。 UserAgentで保護されているGoogle Chromeのバージョンが異なるため、UserAgentは変更されます。 これは、UserAgentが最終的な印刷に影響することを意味します。 新しいブラウザーが登場すると、FingerprintJSの観点からは新しいユーザーになるため、最終的なフィンガープリントが変更されます。



  2. IPhone、iPad、およびその他のApple製品。 実際には、それらは非常に均一であり、ハードウェア実装の面でも同じです。 すべて同じプロセッサを搭載しています。 もちろん、単一のモデル、たとえばiPhone 5Sを使用すると、すべてのiPhone 5Sに同じプロセッサ、同じグラフィックアクセラレータ、同じシステムライブラリが適用され、プラグインも同じになりますが、実際には存在しません。 つまり、Canvas Fingerprintから受信したバイト配列は、iPhone 5Sのすべてのバージョンで同じになるため、Apple製品の識別精度は低くなります。



  3. Internet Explorerと中国。 私はこの問題の存在を疑いませんでしたが、中国にはIEの古いバージョンがたくさんあることがわかりました。プラグインのリストを取得するには、事前にすべてのプラグインの名前が必要です。 プラグインがあるかどうかを確認するために、たとえばIEでnavigator.pluginsを呼び出すことは単に不可能だからです。 これは機能しません。 各プラグインを取得し、アクティブなexオブジェクトとしてインスタンス化する必要があります。 作成された場合、すべてが正常です。 エラーがスローされた場合、プラグインがIEにインストールされていないことを意味します。 IE用のプラグインのリストがありましたが、それは短く、約10個のプラグインでした。 QQ、baiduなど、中国で人気のあるプラグインの定義はありませんでした。そこでのみ使用されるプラグインはたくさんあります。 私はこれらのプラグインをチェックしませんでした。中国向けのプラグインのリストは特に少なかったです。



  4. 最初のバージョンのもう1つの欠点は、FlashおよびSilverlightとの統合の欠如であり、これらのプラグインとの統合は指紋の品質を向上させることができます。



  5. 最後に、FingerprintJSを直撃した深刻なことは、バージョン42以降、Google ChromeはNPAPIを介して機能するすべてのプラグインのアクティブ化を停止したことです。 NPAPIは非常に古いプラグインインスタンスAPIであり、Nextkeyによって開発されました。 「NextkeyプラグインAPI」と呼ばれます。 このAPIで動作し、このプロトコルに依存するすべてのプラグインはロードを停止しているため、SilverlightもJavaも、NPAPIを介して動作するこれら2つの最も人気のあるプラグインはFingerprintJSに表示されません。また、それらのメインタイプのリストも表示されません。 つまり、Chrome 42以前では、この問題によりFingerprintJSの精度が低下します。



したがって、これをすべて分析し、現在FingerprintJSも使用しているため、既存のすべての欠点を実質的に含まない新しいライブラリを開発するときが来たという結論に達しました。



私は最近それを始めました、開発はgithubにあります。







彼女は既存の問題をどのように解決しますか? 最も重要なのは、フェーズハッシュまたはlocalsensitivehash、またはファジーハッシュを使用することです。 通常のハッシュでも、着信情報の少なくとも1バイトを変更すると、出力行も基本的な方法で変更されます。 ハッシュフェーズでは、これは発生しません。着信データの特定の割合が変更される可能性がある感度しきい値があり、発信プリントに影響しません。 たとえば、UserAgentでブラウザのバージョンのみが変更された場合、これはChromeなどで頻繁に発生します。バージョンはUserAgentの合計長の3または5%であるため、結果のフィンガープリントは同じになります。







2番目-FingerprintJS 2は、システムにインストールされているすべてのフォントであるインストール済みフォントの定義を使用します。 これはどのように役立ちますか? adobe pdfなどのプログラムをインストールした場合、システムにフォントを追加します。







Microsoft Officeをインストールした場合は、システムにフォントを追加します。 独自のフォントを持つQuick officeをインストールした場合、システムに再びフォントを追加します。 したがって、まったく同一のコンピューターを2台使用できますが、Officeは一方にインストールされ、他方にはインストールされません。 これは、最初に、Officeがない場合、320個のフォントが利用可能であり、Officeがある場合、1700個のフォントがあることを意味します。 そして、このコンピューター上にあるすべてのフォントを最終印刷用に入手できることを意味します。 フォントが異なるため、2つの異なる印刷になります。



デフォルトでは、サイズが916バイトの小さなswfファイルであるFlashが使用されます。 インストールされているすべてのフォントのリストをプラットフォーム依存の順序で受け取ります。 それらはシステムで使用できるため、返されます。 Flashがインストールされていない場合、この手法が使用され、サイトシャネルテクニックと呼ばれます。 最初にlalit.orgで公開されました。 これは、javascriptのみを使用したフォント検出です。 これはどのように行われますか? ブラウザまたはシステムでデフォルトで設定されている各参照フォントについて、その幅と高さが測定され、この幅と高さの配列が保存されます。 次に、非表示のテキストに異なるフォントが適用されます(ちなみに、テキストは巨大で、たとえば72ピクセルです)。 このフォントがシステムにある場合、テキストのサイズは正しく変更され、高さと幅を変更するコードは、高さと幅を持つ新しい配列を受け取ります。 デフォルトのフォントを要求したときに受け取った参照の参照と異なる場合、このフォントがインストールされます。 異なっていなければ、このフォントは違いません。



非常に単純なアイデアですが、機能します。 現時点では、このコードはFlashを使用せずに約500個のフォントを確実に識別できます。 そして、それに応じて、Microsoft Officeがあるコンピューターとないコンピューターは、この手法によりFingerprintJS 2で異なる方法で定義されます。







3番目の違いはWebGLフィンガープリントです。 これは、Canvas Fingerprintアイデアの開発です。 その本質は、3Dの三角形が描かれているという事実にあります(スライドはあまり見えませんが、3Dです)。 エフェクト、グラデーション、異なる異方性フィルタリングなどがそれに重ねられます。 そして、それはバイト配列に変換されます。 結果のバイト配列は、Canvas Fingerprintと同様に、多くのコンピューターで異なります。 次に、WebGLで定義されているプラ​​ットフォーム依存の定数に関する情報がこのバイト配列に追加されます。 つまり WebGLには、実装する必要がある定数のセットがあります。 これは色深度、テクスチャの最大サイズです...これらの定数はたくさんあり、それらは数十個あります。 コードはこれらすべての定数をポーリングします。もちろん、Androidデバイスではこれらの定数が異なるため、色深度はWindowsやLinuxとは異なる場合があります。 , , 3D , .



: ? 3D , , , OpenGL , , — , . , .



WebGl Fingerprint ? IOS 8.1 WebGL, IOS , . WebGL Fingerprint.







?



, , , . . , , — , , , .



? WebRTC Fingerprinting.



WebRTC — peer-to-peer , . .., FireFox .



WebRTC , , , .. , , WebRTC , , .



IE. , — , .., .. . , .



. ? Flash Silverlight. Flash , , . Silverlight, Windows, Windows, bild, Windows, Silverlight.



Silverlight, sliverlight ? , Silverlight , , , Netflix, , , Silverlight. , DRM ( ), .. Netflix , Silverlight , . Silverlight , , , Mac' , Windows.



. javascript, — . Flash API, Actionscript API, . , , — . , , . ., , , , javascript.



94-95%. , , . : , ? , . — 100% , Fingerprint 100% : «, ; , , , mode, tor …». , .









» github

» Machinio.com



— - FrontendConf .



— " - ", , FrontendConf .



All Articles