ソース:https://medium.com/@iknowhatodo/what-about-refreshtoken-19914d3f2e46
脆弱性:ATO
これは面白い記事だった。
理解するのに時間が掛かりましたが。。
訳:
RefreshToken が時限爆弾である理由
この記事では、RefreshToken を使用してアカウントを引き継ぐ方法を共有し。
Google OAuth を介してプログラムにユーザー登録を行う場合、これはいくつかの手順で行われ。
- ユーザーはサードパーティ (Google) で認証を行い、認証が成功すると、トークン (AccessToken および IdToken) が返され。
- この場合、ユーザー アカウントは非アクティブになるか未検証になるため、Web サイトはターゲット アカウントをサードパーティ アカウント (Google) にリンクする役割を担うエンドポイント [/v1/user/connect] へのリクエストを作成し。
- このエンドポイント [/v1/user/connect] は、次のようないくつかのパラメータを取りまして。
1. ユーザー名: Static Unique Number の略で、Google アカウントに属し。
2. 電子メールを送信し。
3. また、Authorization ヘッダーも受け取ります [Authorization header == IdToken]
このエンドポイントに関するメモ:
- 電子メールは IdToken の電子メール アドレスと同一である必要があり、Google ID も有効であり、別のアカウントに関連付けられていない必要があります。
登録プロセスに関する注意事項:
- このエンドポイントに直接接続するユーザー名として Google アカウントの userId がアカウントに含まれていることが Web サイトで検出された場合: [/v1/user/connect]
変更メール機能に関する注意事項:
- ユーザーは誰でも自分のメールアドレスをウェブサイトに登録した別のメールアドレスに変更することができますが、この場合、確認コードによるアクティベーションプロセスが完了するまでアカウントのステータスは未確認になり。
攻撃シナリオ:
- いくつかのテストの後、登録プロセス中にユーザー名の値の代わりに userId(GoogleID) を挿入できることがわかり。AccessToken、IdToken、および RefreshToken を取得した後、AccessToken を使用して現在の電子メールを被害者の電子メールに変更し。
- 上で述べたように、アカウントに、このエンドポイント [/v1/user/connect] に直接接続するユーザー名として Google アカウントの userId が含まれていることが Web サイトで検出された場合。
- したがって、最初の登録プロセスで取得した RefreshToken を使用して新しいトークンを取得し、まだ検証されていない被害者の電子メールと GoogleID を含む IdToken を取得でき。
Exploitation:
- Google OAuth 経由でサインアップして、Google userId を取得し。そして登録手続きを完了し、その後アカウントを削除しまし。
- ここで、電子メールとパスワードを介してサインアップして、ユーザー名の値の代わりに Google userId を挿入し。登録プロセスが完了すると、AccessToken、IdToken、および RefreshToken を取得でき。
- AccessToken を使用して現在の電子メールを被害者の電子メールに変更して。この場合、確認するまで私のアカウントは停止され。
- RefreshToken を使用して新しいトークンを注文し。
IdToken を翻訳 (デコード) した後、被害者の電子メールはすでに存在していましたが、検証されていないことがわかり、GoogleID も存在していて。
5. このエンドポイント [/v1/user/connect] を使用して、登録プロセス (ステップ 1) で取得した Google アカウントの userId を被害者の電子メールに関連付けました。
6. ここで、以前に被害者のアカウントに挿入したユーザー ID に関連付けられているのと同じ電子メールを使用して、Google OAuth を使用して targetApp にログインまたは新しいアカウントを登録しようとすると、{Google userId を被害者の電子メールにリンクする} ことで、被害者の口座に直接送られる。
ほなほな。