Cookieを永続化して、どこまでも個人を追跡するEvercookie

なんか面白そうなリポジトリがあったので紹介してみます。
以下は[Evercookie](https://github.com/samyk/evercookie)というライブラリの紹介です。

# Evercookie

Evercookieは、ブラウザに究極的に永続的なCookieを生成するJavaScript APIです。
その目的は、標準的なCookie、Flash Cookieなどを削除した後でもクライアントを識別し続けることです。

これは、可能なかぎり多くのストレージにCookieデータを保存することで達成します。
いずれかのストレージからCookieが削除されたとしても、ひとつでも残っている限り、Evercookieは残ったデータからCookieデータを復旧します。

Flash LSO、SilverlightもしくはJavaが有効な場合、Evercookieはブラウザを超えて同じクライアント上の別のブラウザにCookieを伝播することすら可能です。

本リポジトリは、[Samy Kamkar](https://samy.pl/)および[多くのコントリビュータ](https://github.com/samyk/evercookie/graphs/contributors)によって作られています。

## Browser Storage Mechanisms

Evercookieを効果的に利用するために、ブラウザは以下のストレージメカニズムを可能なかぎりサポートしなければなりません。

- 通常の[HTTP Cookies](https://en.wikipedia.org/wiki/HTTP_cookie)
- Flashの[Local Shared Objects](https://en.wikipedia.org/wiki/Local_Shared_Object)
- Silverlightの[Isolated Storage](http://www.silverlight.net/learn/quickstarts/isolatedstorage/)
- CSSの[History Knocking](https://samy.pl/csshack/)
- [HTTP ETags](https://en.wikipedia.org/wiki/HTTP_ETag) 要バックエンド
- [Web cache](https://en.wikipedia.org/wiki/Web_cache) 要バックエンド
- [HSTS](https://sites.google.com/a/chromium.org/dev/Home/chromium-security/client-identification-mechanisms#TOC-Lower-level-protocol-identifiers)
- [window.name caching](https://en.wikipedia.org/wiki/HTTP_cookie#window.name)
- IEの[userData storage](http://msdn.microsoft.com/en-us/library/ms531424.aspx)
- HTML5の[Session Storage](http://dev.w3.org/html5/webstorage/#the-sessionstorage-attribute)
- HTML5の[Local Storage](http://dev.w3.org/html5/webstorage/#dom-localstorage)
- HTML5の[Global Storage](https://developer.mozilla.org/en/dom/storage#globalStorage)
- HTML5の[Database Storage via SQLite](http://dev.w3.org/html5/webdatabase/)
- HTML5のCanvas 要バックエンド
- HTML5の[IndexedDB](http://www.w3.org/TR/IndexedDB/)
- Javaの[JNLP PersistenceService](http://docs.oracle.com/javase/1.5.0/docs/guide/javaws/jnlp/index.html)
- Javaの脆弱性[CVE-2013-0422](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2013-0422)

さらに以下のストレージにも対応予定です。

- [TLS Session Resumption](https://www.ietf.org/rfc/rfc5077.txt)
- [HTTP Public Key Pinning (HPKP)](https://www.wikiwand.com/en/HTTP_Public_Key_Pinning)
- [HTTP Authentication](https://en.wikipedia.org/wiki/Basic_access_authentication)キャッシュ
- Google Gears
- NICから一意のキーを生成
- その他。コミットよろしく！

Javaによる永続化メカニズムは、[Gabriel Bauman](http://gabrielbauman.com/)によって[こちら](https://github.com/gabrielbauman/evercookie-applet)で開発されています。

## Backend Server

幾つかのメカニズムはバックエンドサーバが必要です。
本リポジトリには、Etag、Web cache、そしてCanvasのPHPによる実装が含まれています。

- [Node.jsによるバックエンド実装](https://github.com/truongsinh/node-evercookie)
- [Djangoによるバックエンド実装](https://github.com/gdmka/django_evercookie)

## Caveats

-警告-

Evercookieは、あなたやユーザに問題を引き起こす可能性があります。

SilverlightやFlashを使用するストレージメカニズムは、一部のマシンではdisk thrashingを引き起こし、処理が非常に遅くなる可能性があります。
古いモバイルデバイスではWebサイトが表示されなくなる可能性もあります。

CSS History Knockingは、最初にCookieを設定するときに大量のHTTPリクエストを引き起こすことがあります。

一部の業界では、Evercookieの使用が忌避される可能性があります。
本番適用する前に、本当に使用して問題ないか考慮してください。

ブラウザベンダーは、Evercookie等によって悪用された多くの脆弱性を防ごうとしています。
インターネットにとってはよいことかもしれませんが、今日うまくいったことが明日はうまくいかない可能性があることをとどめてください。

Evercookieを使うか否かの最終判断は、あなたにあります。
賢い選択をしてください。


# 使用方法

```js
<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を使用しており](https://doi.org/10.1109%2Fjproc.2016.2637878)、ユーザ情報を追跡していたようです。

NSAがTorユーザを追跡するために[使っていた](https://www.aclu.org/sites/default/files/assets/tor_stinks.pdf)ようです。


# 感想

要するに、あらゆるストレージに同じ内容を書き込むことで、できるかぎりの冗長性を確保しようというものです。
技術的には複数系統のバックアップというやつで、一般的にSuperCookieと呼ばれている技術のひとつです。
バグを利用するものは微妙ですが、基本的には正当な手段しか使っていません。
それなのに、単に正当な技術を詰め合わせただけで[50万ドルの罰金](https://journals.tulane.edu/TIP/article/view/2613)とは大変ですね。

なお、FlashとかSilverlightとかいうテキストからもわかるとおり少々古い内容です。
最終更新が2017年でそれ以降はアップデートされておらず、それ以降に作られたAPIにも当然ながら対応していません。

しかし、当時の時点でも見てのとおり非常に多数のストレージが存在しており、ひとつでも消し損ねがあればそこからCookieを再生されてしまいます。
あらゆるストレージから全ての痕跡を綺麗に消し去るのは容易ではないでしょう。

なおFirefoxは先日、[Firefox85でSuperCookieに対処した](https://blog.mozilla.org/security/2021/01/26/supercookie-protections/)と発表しました。
従って、このEvercookieは既にFirefoxでは使えなくなっているかもしれません。

しかし、Evercookie本家の更新は止まってますが、[Forkも大量にあり](https://github.com/samyk/evercookie/network/members)、そのうち幾つかは現在も更新されているかもしれません。
というか、何処かの地下では間違いなく、Firefoxをも突破できる強力なツールが開発されていることでしょう。