Amazon Cognito でパスワードリセット時、身に覚えのないメールアドレスに送信される原因(ユーザー存在エラーの防止の影響)

Amazon Cognito でパスワードリセット時、身に覚えのないメールアドレスに送信される原因(ユーザー存在エラーの防止の影響)

Clock Icon2024.08.28

はじめに

Amazon Cognito Hosted UIでパスワードをリセットしようとしたところ、以下のメッセージが表示されました。

We have sent a password reset code by email to t***@g***. Enter it below to reset your password.

cm-hirai-screenshot 2024-08-22 17.37.49
パスワードリセットのため、ユーザーを入力
cm-hirai-screenshot 2024-08-22 17.42.41
身に覚えがないメールアドレスへ送信

しかし、表示されたメールアドレス t***@g***に心当たりがなかったため、この現象の原因を調査しました。

結論

調査の結果、今回確認したアカウントでこの現象が発生した原因は、以下の2点でした。

  1. Cognitoのユーザープール内のユーザーのEメールステータスが「未検証」である
    cm-hirai-screenshot 2024-08-23 16.27.08
  2. アプリケーションクライアントの高度なセキュリティ設定で[ユーザー存在エラーの防止]が有効化されている
    cm-hirai-screenshot 2024-08-23 16.30.32

Eメールステータスが検証済みの場合、ユーザーが設定したメールアドレスにコードが実際に送信されます。

一方、Eメールステータスが「未検証」であり、かつ[ユーザー存在エラーの防止]が有効化されている場合、Eメールアドレスへコードが送信されたように表示されますが、実際には送信されません。

次章では、ユーザー存在エラーの防止機能について、解説します。

ユーザー存在エラーの防止機能について

ユーザー存在エラーの防止機能は、悪意のある攻撃者がシステム内の有効なユーザーアカウントを特定することを防ぎます。
パスワードリセットに関して、この機能の主な特徴は以下の通りです

  1. ユーザー列挙攻撃の防止:実際のユーザーアカウントの存在を明かさないことで、ブルートフォース攻撃などのリスクを軽減します。

    • ユーザー列挙とは、悪意のある攻撃者がブルートフォース技術を使用してシステム内の有効なユーザーを推測または確認する、ウェブアプリケーションの脆弱性を突いた攻撃手法です。
  2. シミュレートされた応答:存在しないユーザー名や無効なアカウントに対しても、システムは実在するかのように応答を返します。

  3. ランダム化されたメールアドレス:表示されるメールアドレスは実際には存在せず、ランダムに生成されたものです。このメールアドレスは一部が伏せ字になっており、完全な形では表示されません。

  4. 実際の送信は行われない:このシミュレートされたメールアドレスに対して、実際にコードは送信されません。これは未確認のメールアドレスへのスパム送信を防止するためです。

  5. 一貫した動作:有効なアカウントと無効なアカウントの両方に対して同様の応答を返すことで、アカウントの存在有無を外部から推測されにくくします。

この機能により、システムはすべてのリクエストに対して一貫した応答を提供し、アカウントの存在に関する情報を漏らすことなく、セキュリティを向上させています。

一方で、この機能にはデメリットもあります。利用ユーザーの視点からは、登録していないメールアドレスにコードが送信されているように見えるため、混乱を招く可能性があります。

ユーザー存在エラーの防止を無効化してみる

[ユーザー存在エラーの防止]機能を無効化すると、ランダムなメールアドレスへの送信シミュレーションは行われなくなります。

ここでは、実際にユーザー存在エラー防止設定を無効化する手順を説明します。

アプリケーションクライアント画面の[アプリケーションクライアントに関する情報]の[編集]します。

cm-hirai-screenshot 2024-08-23 16.30.22

[ユーザー存在エラーの防止]設定のチェックボックスを外すことで、この機能を無効化できます。
cm-hirai-screenshot 2024-08-23 16.30.32

設定変更後、Eメールステータスが「未検証」で、かつ[ユーザー存在エラーの防止]が無効化された状態で、パスワードリセットを試みます。

cm-hirai-screenshot 2024-08-22 17.37.49

この設定では、以下のようにエラーメッセージが表示されます。

cm-hirai-screenshot 2024-08-23 16.36.14

Could not reset password for the account, please contact support or try again
日本語訳:アカウントのパスワードをリセットできませんでした。サポートにお問い合わせいただくか、もう一度お試しください。

このエラーメッセージは、入力されたユーザー名に関連するアカウントが何らかの理由で無効であることを示唆しています。考えられる具体的な原因としては以下が挙げられます

  1. メールアドレスが未検証である
  2. ユーザーの確認ステータスが未確認である
  3. ユーザーアカウント自体が存在しない

ユーザー存在エラーの防止機能を有効にすることで、悪意のある攻撃者がシステム内の有効なユーザーアカウントを特定するリスクを軽減できます。この機能は、アカウントの存在有無に関わらず一貫した応答を提供することで、セキュリティを向上させます。

一方で、ユーザーに対する明確なフィードバックが制限されるため、ユーザーエクスペリエンスに影響を与える可能性があります。例えば、本事例では、ユーザーが「なぜ身に覚えのないメールアドレスに送信されるのか?」という疑問を抱く可能性があります。

以上の点を踏まえ、[ユーザー存在エラーの防止]有効化において、ユーザー体験とのトレードオフを十分に検討する必要があります。

参考

https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/cognito-user-pool-managing-errors.html#cognito-user-pool-managing-errors-password-reset

https://repost.aws/ja/knowledge-center/cognito-prevent-user-existence-errors

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.