JavascriptのMath.random()でユーザートラッキングができるという話
表題の件について。
地味な話ですが、javascript(というかECMAの仕様)にあるMath.random()には、乱数のシードを与える方法が無いようです。
そんなわけで、われわれ一般市民は各ブラウザが独自に実装している、謎のシードで初期化された謎のアルゴリズムで作られた乱数を通常使うわけですが。
曰く、Math.random()のシードによる初期化は、ブラウジングセッションごとに1度しか行われないと。
で、シードはまあ、かぶる率そんなに高くなさそうなので、そのシードをUSERの(擬似的な)ID代わりにしてしまえば、ユーザーのトラッキングができるよーん、とのこと。
はじめ読んだとき、「おおー、かっけー!」と思ったんですが、ちょっと待て。
シードって外から取れんのか。
というわけで、色々調べたところ、各ブラウザは(多分IEも)線形合同法による擬似乱数を使っていると。
線形合同法ってのは、あれです。cmath.hのrandって言えば大体分かりますか。普通の早くて安い乱数です。
で、こいつはジェネレータが何ステップ目の状態かをリバース簡単に出来る→乱数シードをリバースさせることができるよん、とのこと。
これは驚き。言われてみればそりゃそうなんだけど、そうか、シードをリバースエンジニアリングするなんてこと、考えたことも無かった。
ちなみに、後半のソースはこれ。
Firefoxだけじゃなくて、他のブラウザにも言及して、ソースコードまである。すげえ。
ちなみに、すでにIE9についても同型の問題を確認しているようです。
某visit historyみたいなことにならないといいですねえ…。
Firefoxは、少なくとも冒頭のものについてはパッチが当たっているみたいですが、他はどうなんでしょ。