web-dev-qa-db-ja.com

可能性のある有効な電子メールアドレスの手がかりを与えるパスワードのリセット

パスワードを忘れてリセットしたい場合は、パスワードを忘れた場合のページにアクセスしてメールアドレスを入力するシステムがあります。パスワードをリセットするための一時的なリンクがメールに送信されます。

アプリを侵入テストにかけたところ、問題が見つかりました:

アプリケーションは、パスワードをリセットしようとするときに、考えられる有効な電子メールアドレスの手がかりを与えています。この機能は、考えられる電子メールアドレスを単に推測し、エラーメッセージから有効なものを見つけることによって悪用される可能性があります。

フィールドは1つしかありません。もちろん、パスワードのリセットの試行が失敗した場合、それは無効な電子メールが原因です。この侵入テストは間違っているようです。パスワードをリセットするための追加フィールド(電子メール以外)を追加する以外に、この問題を解決する解決策はありますか?

31
davshowhan449

試みが「失敗」したことを示してはいけません。ユーザー(正当なものかどうかに関係なく)がパスワードのリセットリンクを要求し、電子メールアドレスを提供します。ここで言うべきことは、

提出物を受け取りました。メールアドレスに一致するアカウントがある場合は、パスワードをリセットするためのリンクが記載されたメールが届きます。

ユーザーは引き続きリンク(成功)を取得しますが、攻撃者は提供された電子メールアドレスがアカウントに関連付けられているかどうかはわかりません。

102
yoozer8

この発見の理由は、電子メールアドレスの存在に応じて、ユーザーが異なる応答を受け取るためです。これは、アドレスが不明であること、または応答がより微妙であることを伝えるだけの簡単なものです。

この種の問題を回避する最も簡単な実装は、電子メールアドレスが存在するかどうかに関係なく、まったく同じ応答を返すです。シンプルな

パスワードをリセットするための情報が、提供されたメールアドレスに送信されました。メールが届かない場合は、正しいアドレスを入力したことを確認してください。

トリックを行います。

メールアドレスがわかっている場合は、パスワードリセット情報を送信します。存在しない場合は、何もしないでください。実際のユーザーはリンクを取得しますが、攻撃者は電子メールが送信されたかどうかを判断できません。

31
Demento

上記の回答への追加として(コメントとしては適していますが、まだそれはできません)ハッカーが実行できる別のステップは、フォームに対する応答の時間を測定することです。メールが存在しないと判断するのに10ミリ秒かかる場合がありますが、リセットリンクを生成してメールを送信するのに100ミリ秒かかる場合があります。ハッカーは、検索が成功するよりも応答が遅いかどうかを知ることができます。メールが見つからない場合はランダムスリープタイマーを使用して、両方の応答に同じ時間がかかるようにすることができます。

20
Michael P

私たちは何から保護していますか?

まず第一に、彼らが何から保護しているのかを正確に尋ねるべきです。この場合、2つの異なる脅威があります。

  • 脅威1攻撃者は、無作為にランダムなメールを送信して、登録済みの有効なメールを見つけます。これは理論的にはスパムリストを作成するために使用できますが、私が知る限り、余分なトラブルを経験するよりも電子メールを送信する方が簡単であるため、これまで行われたことはありません(自分の[一部の米国]を主張するスパムメールを受信した回数)銀行]アカウントは、米国に住んでいないにもかかわらずアクションが必要です。
  • 脅威2攻撃者は特定のユーザーまたは特定のユーザーのリストを標的としています。これは、誰かがどこかに登録されているという事実が影響を与える可能性がある場合に特に重要です。例:特定のコミュニティでは、GrindrまたはAshley Madisonにアカウントを持つという行為自体が危険な場合があります。

全体像

次に考える問題は、他の場所が同じ情報を公開し、それらを全体として考慮する可能性があることです。通常、登録フォームは、入力された電子メールがすでに登録されているかどうかをユーザーに通知しますbutもちろん、これはほとんどのB2Bソフトウェアには適用されません。 「ユーザーと共有」機能(このユーザーとオブジェクトを共有するために電子メールを入力できる入力ボックス)を超えると、この情報が公開されることもよくありますが、まれなので、この回答には含めません。

公的登録システムのソリューション

まず第一に、登録プロセス中にアカウントがすでに存在していることをユーザーに通知しないことは、UXの観点からは非常に不愉快であることを認めることは良いことです。サイレントに失敗するパスワードリセットフォームにも同じことが当てはまります1 ユーザーがタイプミスをしたり、複数のメールを受け取ったとき。これは、すべきでないことではありませんが、セキュリティのリスクと利点と比較検討する必要があります。

パブリック登録のシステムを考えると、考慮すべき重要なことは、製品のユーザーにとって脅威2の大きさです。リスクがわずかであることを考えると、名前と電子メールを入力するだけで開始するように登録フォームを変更し、「登録を続行するには、電子メールを確認してください」というメッセージを出し、電子メールがすでに登録されている場合は、ユーザーに通知する電子メールを送信するのが賢明です。彼らのこれ。同様に、その場合、パスワードリセットフォームは、電子メールが有効かどうかをユーザーに通知しません。

一方、Threat 2が最小の場合は、Threat 1に対してのみモデル化する必要があります。もちろん、前のアプローチは脅威1に対しても完全に機能しますが、UXコストを考慮すると、他のソリューションを検討する価値があります。最も明白な解決策はレート制限です2 「メールの存在チェック」と「パスワードを忘れた」チェックの両方で(技術的には、これらの呼び出しは同じAPIエンドポイントに行くこともできます)。これらは多くの場合、最初の10回程度の呼び出しにはかなり余裕があるように設計されますが、その時点から非常に速く制限されます。

重要:登録フォームに同様の制限を実装せずに、パスワード登録からエラーメッセージを削除しないでください。

公的登録なしのシステムのソリューション

これはすべて上記と同じ問題に要約されます(そして私はこれを最初に書いておくべきでした)が、登録UXへのヒットの「追加」コストがないと、安全なパスワードを忘れた形式を持っていることは比較的「安上がり」ですが、もちろんstillはユーザーにとって不愉快であり、特定の脅威モデルに対してレート制限では不十分かどうかを検討することができます。

ノート

1:静かに失敗するのではなく、少なくとも入力された電子メールに、電子メールが見つからなかったことを通知する電子メールを送信するのが賢明です。これは、1)攻撃者がシステムを大量に悪用するのをやめさせる(気づくであろう)2)ユーザーがなぜ電子メールを受信しないのか不思議に思うことを防ぐ。

2:レート制限は、大規模なネットワークまたはVPNのユーザーに悪影響を及ぼす可能性があることに注意してください。視聴者があなたにとってどれほど重要であるかを常に考慮し、それに基づいて、レート制限が最も厳しい場合でもアプリケーションが機能し続けることを保証するために十分な時間を費やしてください(たとえば、キャプチャを解決するか最大レート制限を設定してレート制限を下げることにより) 1分に1回、アプリケーションが1分間待機することを保証します(注:同じミーティングの開始時に同じサービスにサインアップするユーザーのチームがいることを考えると、それでも不快です)。

20
David Mulder

問題と解決の不便さを比較検討してください。それはしばしばトレードオフです。

私の意見では、誰かがあなたのサイトに登録されたと迫害される可能性がある場合を除いて、ユーザーエクスペリエンスのためにこのセキュリティを少し犠牲にするのが通常良いです。

私は時々、数年後にサイトにアクセスし、特定のサイトで使用したメールを探します。この情報を隠すサイトは非常に迷惑です。

8
Džuris

これは(他の回答に加えて)登録画面にも当てはまることに注意してください。既に登録されているユーザーに、彼らがすでに登録されていることをメールで送信し、Webアプリで「メールをチェックする」以外にフィードバックを提供しないという不満はありません。

これは、メール検証の前の最初のステップで最小限の入力を求める場合に最適です(これは、ユーザーが情報メールを受信し、登録を継続したことを証明できるGDPRにも役立ちます)。

実際、登録に手間がかからず、常に実行する必要があります。パスワードのリセット機能については、直接フィードバックまたは電子メールフィードバックを選択できるオプションをソフトウェアに提供しています。 (企業のシナリオでは、特にイントラネットで電子メールを推測することは実際の脅威ではありません)。

1
eckes