web-dev-qa-db-ja.com

OAuth 2.0のクライアントシークレット

GoogleドライブAPIを使用するには、OAuth2.0を使用した認証で遊ぶ必要があります。そして、これについていくつか質問がありました。

  1. クライアントIDとクライアントシークレットは、アプリが何であるかを識別するために使用されます。ただし、クライアントアプリケーションの場合は、ハードコーディングする必要があります。そのため、誰でも私のアプリを逆コンパイルして、ソースコードから抽出できます。 悪いアプリは、良いアプリのクライアントIDとシークレットを使用して良いアプリのふりをすることができるということですか?そのため、ユーザーは、良いアプリに許可を与えることを求める画面を表示します悪いアプリから実際に尋ねられますか?はいの場合、どうすればよいですか?または実際に私はこれを心配するべきではありませんか?

  2. モバイルアプリケーションでは、アプリにWebビューを埋め込むことができます。また、許可を求めるアプリは実際には「ブラウザ」であるため、webviewでパスワードフィールドを抽出するのは簡単です。 つまり、OAuthモバイルアプリケーションには、クライアントアプリケーションがサービスプロバイダーのユーザー資格情報にアクセスできないという利点はありませんか?

89
Bear

私はあなたの質問へのコメントを書き始めましたが、それから言うことが多すぎることがわかったので、ここに答えの主題に関する私の見解があります。

  1. はい、これには本当の可能性があり、これに基づいたいくつかのエクスプロイトがありました。提案は、アプリ内でアプリを秘密にすることではなく、分散アプリがこのトークンを使用してはならないという仕様にも一部あります。今、あなたは尋ねるかもしれませんが、XYZは動作するためにそれを必要とします。その場合、彼らは仕様を適切に実装していないので、Aはそのサービスを使用しない(おそらくない)か、Bは難読化メソッドを使用してトークンを保護し、プロキシとしてサーバーを見つけたり使用したりするのを困難にする必要があります。

    たとえば、Facebookライブラリには、AndroidのトークンがLogsにリークされていたバグがありました。詳細については、こちらをご覧ください http://attack-secure.com/ all-your-facebook-access-tokens-are-belong-to-us そしてここ https://www.youtube.com/watch?v=twyL7Uxe6sk サードパーティのライブラリの使用には注意してください(実際には常識ですが、トークンのハイジャックが大きな懸念事項である場合は、注意をさらに追加してください)。

  2. 私はかなり長い間、ポイント2について暴言を言ってきました。同意ページを変更するためにアプリでいくつかの回避策を実行しました(たとえば、ズームとデザインをアプリに合わせて変更します)が、ユーザー名とパスワードでWebビュー内のフィールドから値を読み取ることを妨げるものは何もありませんでした。したがって、私はあなたの2番目の点に完全に同意し、それがOAuth spec。での大きな「バグ」であることに気づきます。仕様で「アプリはユーザー資格情報にアクセスできません」という点は単なる夢であり、ユーザーに誤った安心感を与えます...また、アプリがFacebook、Twitter、Dropbox、またはその他の資格情報を要求するとき、人々は通常疑いがあると思います。多くの普通の人はOAuth spec 「私は安全です」が、代わりに常識を使用し、一般的に彼らが信頼しないアプリを使用しません。

14
PSIXO

ここで質問1と同じ質問がありましたが、最近自分自身でいくつかの調査を行いました。私の結論は、「クライアントの秘密」を秘密にしないでよいという結論です。クライアントの秘密を守らないクライアントのタイプは、OAuth2仕様では「パブリッククライアント」と呼ばれます。悪意のある誰かが認証コードを取得してアクセストークンを取得する可能性は、次の事実によって防止されます。

1.クライアントは、サービスからではなく、ユーザーから直接認証コードを取得する必要があります

ユーザーがクライアントを信頼するサービスを指定した場合でも、クライアントはクライアントIDとクライアントシークレットを表示するだけでは、サービスから認証コードを取得できません。代わりに、クライアントはユーザーから直接認証コードを取得する必要があります。 (これは通常、URLリダイレクトによって行われます。これについては後で説明します。)したがって、悪意のあるクライアントにとって、ユーザーが信頼するクライアントID /シークレットを知るだけでは不十分です。何らかの方法でユーザーを関与させるか、ユーザーになりすまして認証コードを提供する必要があります。認証コードは、クライアントID /シークレットを知るよりも難しいはずです。

2.リダイレクトURLはクライアントID /シークレットで登録されます

悪意のあるクライアントがなんとかしてユーザーを巻き込み、サービスページの[このアプリを承認する]ボタンをクリックしたと仮定しましょう。これにより、サービスからユーザーのブラウザーへのURLリダイレクトレスポンスがトリガーコードと共に送信されます。次に、認証コードがユーザーのブラウザからリダイレクトURLに送信され、クライアントはリダイレクトURLでリッスンして認証コードを受け取ることになっています。 (リダイレクトURLもlocalhostである可能性があり、これは「パブリッククライアント」が認証コードを受け取る典型的な方法であると考えました。)このリダイレクトURLはクライアントID /シークレットでサービスに登録されるため、悪意のあるクライアントは認証コードの提供先を制御する方法があります。これは、クライアントID /シークレットを持つ悪意のあるクライアントが、ユーザーの認証コードを取得するための別の障害があることを意味します。

11
hideaki

2番目の質問への回答:セキュリティ上の理由でGoogle APIを使用すると、認証/サインインはアプリ内で(Webビューは許可されないなど)実行できず、ブラウザを使用してアプリの外部で実行する必要があります。 https://developers.googleblog.com/2016/08/modernizing-oauth-interactions-in-native-apps.html

0
v.j