なんか面白そうなリポジトリがあったので紹介してみます。
以下はEvercookieというライブラリの紹介です。
Evercookie
Evercookieは、ブラウザに究極的に永続的なCookieを生成するJavaScript APIです。
その目的は、標準的なCookie、Flash Cookieなどを削除した後でもクライアントを識別し続けることです。
これは、可能なかぎり多くのストレージにCookieデータを保存することで達成します。
いずれかのストレージからCookieが削除されたとしても、ひとつでも残っている限り、Evercookieは残ったデータからCookieデータを復旧します。
Flash LSO、SilverlightもしくはJavaが有効な場合、Evercookieはブラウザを超えて同じクライアント上の別のブラウザにCookieを伝播することすら可能です。
本リポジトリは、Samy Kamkarおよび多くのコントリビュータによって作られています。
Browser Storage Mechanisms
Evercookieを効果的に利用するために、ブラウザは以下のストレージメカニズムを可能なかぎりサポートしなければなりません。
- 通常のHTTP Cookies
- FlashのLocal Shared Objects
- SilverlightのIsolated Storage
- CSSのHistory Knocking
- HTTP ETags 要バックエンド
- Web cache 要バックエンド
- HSTS
- window.name caching
- IEのuserData storage
- HTML5のSession Storage
- HTML5のLocal Storage
- HTML5のGlobal Storage
- HTML5のDatabase Storage via SQLite
- HTML5のCanvas 要バックエンド
- HTML5のIndexedDB
- JavaのJNLP PersistenceService
- Javaの脆弱性CVE-2013-0422
さらに以下のストレージにも対応予定です。
- TLS Session Resumption
- HTTP Public Key Pinning (HPKP)
- HTTP Authenticationキャッシュ
- Google Gears
- NICから一意のキーを生成
- その他。コミットよろしく!
Javaによる永続化メカニズムは、Gabriel Baumanによってこちらで開発されています。
Backend Server
幾つかのメカニズムはバックエンドサーバが必要です。
本リポジトリには、Etag、Web cache、そしてCanvasのPHPによる実装が含まれています。
Caveats
-警告-
Evercookieは、あなたやユーザに問題を引き起こす可能性があります。
SilverlightやFlashを使用するストレージメカニズムは、一部のマシンではdisk thrashingを引き起こし、処理が非常に遅くなる可能性があります。
古いモバイルデバイスではWebサイトが表示されなくなる可能性もあります。
CSS History Knockingは、最初にCookieを設定するときに大量のHTTPリクエストを引き起こすことがあります。
一部の業界では、Evercookieの使用が忌避される可能性があります。
本番適用する前に、本当に使用して問題ないか考慮してください。
ブラウザベンダーは、Evercookie等によって悪用された多くの脆弱性を防ごうとしています。
インターネットにとってはよいことかもしれませんが、今日うまくいったことが明日はうまくいかない可能性があることをとどめてください。
Evercookieを使うか否かの最終判断は、あなたにあります。
賢い選択をしてください。
使用方法
<script type="text/javascript" src="evercookie.js"></script>
<script>
var ec = new evercookie();
// Cookieにidをセット
ec.set("id", "12345");
// Cookieからidを取得
ec.get("id", function(value) { alert("Cookie value is " + value) });
</script>
使用例
huluやspotifyが使っていた顧客分析ツールKISSmetricsがかつてEvercookieを使用しており、ユーザ情報を追跡していたようです。
NSAがTorユーザを追跡するために使っていたようです。
感想
要するに、あらゆるストレージに同じ内容を書き込むことで、できるかぎりの冗長性を確保しようというものです。
技術的には複数系統のバックアップというやつで、一般的にSuperCookieと呼ばれている技術のひとつです。
バグを利用するものは微妙ですが、基本的には正当な手段しか使っていません。
それなのに、単に正当な技術を詰め合わせただけで50万ドルの罰金とは大変ですね。
なお、FlashとかSilverlightとかいうテキストからもわかるとおり少々古い内容です。
最終更新が2017年でそれ以降はアップデートされておらず、それ以降に作られたAPIにも当然ながら対応していません。
しかし、当時の時点でも見てのとおり非常に多数のストレージが存在しており、ひとつでも消し損ねがあればそこからCookieを再生されてしまいます。
あらゆるストレージから全ての痕跡を綺麗に消し去るのは容易ではないでしょう。
なおFirefoxは先日、Firefox85でSuperCookieに対処したと発表しました。
従って、このEvercookieは既にFirefoxでは使えなくなっているかもしれません。
しかし、Evercookie本家の更新は止まってますが、Forkも大量にあり、そのうち幾つかは現在も更新されているかもしれません。
というか、何処かの地下では間違いなく、Firefoxをも突破できる強力なツールが開発されていることでしょう。