Googleアカウントのメールアドレスは、Googleの提供する各種サービスで共通して用いるメールアドレスで利用場面は多いものです。ウェブ開発者のトム・アンソニーさんが、Googleがリダイレクト用に添付するパラメータを利用して、ページにアクセスしたユーザーのGoogleアカウント用メールアドレスを特定できる手法をブログで公開しています。

How to confirm a Google user's specific email address (Bug Bounty Submission) - Tom Anthony

http://www.tomanthony.co.uk/blog/confirm-google-users-email/

Googleのログインページでは、ログインしたあとにトップページではなく元のページが表示されるようリダイレクトするためにURLに「continue」パラメーターを渡すことがよくあります。当然、すでにGoogleアカウントにログイン済みのユーザーの場合には、continueパラメーター内の特定URLに直接リダイレクト処理されることになります。



この挙動を利用すれば、ユーザーがGoogleアカウントにログイン済みかどうかを簡単に見分けることが可能です。例えば、サイト内にログイン後に表示される画像イメージを設けておいて、JavaScriptの「onload」「onerror」機能を使って画像イメージが読み込まれたかどうかを調べれば、サイトにアクセスしたユーザーがGoogleアカウントにログインしているかどうかを検出できるというわけです。

アンソニーさんが上記アイデアを使って作成したのが以下のデモページ。Googleアカウントに登録しているメールアドレスを入力して「送信」をクリックすれば、Googleアカウントにログインしているかどうかがわかります。

Google Account Leak

http://www.tomanthony.co.uk/google_leak/



このようなログイン状態を調べること自体に大きな問題はなさそうですが、アンソニーさんは、同じように設定されているパラメータを使って、アクセスしてきたアカウントがログインに使うメールアドレスが、事前に用意したアドレスと一致しているかどうかを検出できると指摘しています。アンソニーさんがデモ用に用意したサイトでは、23秒から24秒ごとに1000個のアドレスと一致するかどうかを検出できたそうです。

アンソニーさんのブログ内のムービーでは、20個のアカウントリストからアンソニーさんのアカウントであることを特定するデモの様子を確認できます。



アクセスしてきた人のメールアドレスを事前に用意したアドレスリストから総当たり的にチェックするという手法は、ごく限られた条件下でのみ、アクセスした人のメールアドレスが特定されるという危険がありそうです。なお、アンソニーさんはGoogleに対してこの手法を示したうえでバグではないかと修復を求めましたが、Googleからは「想定されている挙動であり、バグではない」という返答があったそうです。