web-dev-qa-db-ja.com

「ユーザー名またはパスワードが無効です」-Webサイトがユーザーにどのメッセージが間違っているのかを通知するのではなく、この種のメッセージを表示するのはなぜですか?

ユーザーが一般的なサイトにログインし、ユーザー名とパスワードを入力して、入力の1つを誤って入力したとします。すべてではないにしても、ほとんどのサイトで1つの入力だけが間違っているにもかかわらず、同じメッセージ(「ユーザー名またはパスワードが無効です」というメッセージが表示される)が表示されることに気づきました。

私には、どの入力が間違っていたのかをユーザーに通知するのは簡単なようで、これがなぜサイトがそれを行わないのか疑問に思いました。では、これにはセキュリティ上の理由があるのでしょうか、それとも単なる標準となっているのでしょうか。

103
bobble14988

悪意のあるユーザーがadmin/adminなどの一般的なユーザー名/パスワードの組み合わせを推測してWebサイトを攻撃し始めた場合、攻撃者は「ユーザー名またはパスワードが無効です」ではなく「パスワードが無効です」というメッセージを返すことで、ユーザー名が有効であることを認識します。

攻撃者は、ユーザー名が有効であることを知っている場合、SQLインジェクションやブルートフォースパスワードなどの手法を使用して、その特定のアカウントに集中することができます。

128
user10211

他のユーザーが述べたように、 brute-forcedictionary attack ..

一部のWebサイトで、セキュリティ面で環境に配慮しながら失敗したWebサイトをユーザーに知らせたい場合は、 " honeypot "ユーザー名(Administrator、adminなど)を実装できます。これは、誰かが自分のWebサイトを覗き見していることをWebサイト管理者に警告します。 「ハニーポット」ユーザー名の1つでログインしようとした場合、IPアドレスを禁止するロジックを設定することもできます。私は実際にWebサイトを持っていて、ソースコードに「リチャードを忘れてしまったので、リチャード:ユーザー名:チーズパスワード:Burger123」などのHTMLコメントを、ログインしようとしたIPアドレスを監視する目的でログインボックスの近くに置いた人物を1人知っています。そのユーザー名/パスワード。あなたがウェブサイトを開発しているとき、そのような監視ロジックを追加することはとても楽しいです。

もちろん、無効なログイン試行をログに記録し、それらのIPアドレスを処理する適切なロジックを追加することもできます。同意できない人もいると思いますが、Webサイトの種類によっては、さまざまな種類の攻撃を防ぐためにセキュリティ対策を追加する限り、ユーザーに通知することはそれほど大きな問題ではないと思います。

24
ROFLwTIME

これの私のお気に入りの安全な実装は、私が使用する銀行によって行われます。ユーザー名を正しく入力すると、「ようこそJimbob!」と表示されます。セキュリティの質問に答えるように求められ(このコンピューターからこのブラウザーからログインしたことがない場合)、セキュリティの質問に正しく答えるのを待ってから、セキュリティの画像/キャプションを表示してパスワードを入力します。間違ったユーザー名を入力すると、「Welcome Bessie/Kareem/Randal!」のようなものが表示されます。表示される名前が非常に一般的ではありません。ただし、同じユーザー名の場合は常に同じ名前になります(通常、1つまたは2つのユーザー名が不明であり、間違ったものから一貫してFrensheliaと呼ばれます)。かなり一般的ではない名前の長いリストの1つのユーザー名に一意にマッピングされる、入力されたユーザー名に適用されるある種の非暗号化ハッシュとして実装されていると思います。これにより、正当なユーザーが間違ったユーザー名を入力したかどうかを知ることができます(ベッシーのような珍しい名前を持っている場合でも、ランダムに推測した間違ったユーザー名が特定の珍しい名前にマッピングされることはほとんどありません)。ユーザー名が存在しないランダムなアカウントを見つけるため。

余談ですが、私はセキュリティに関する質問/セキュリティイメージの部分は特に好きではありません。セキュリティシアターに接しているようです。中間者(MITM)攻撃を行う高度な攻撃者(たとえば、Webブラウザーに偽の証明書をインストールした後、DNS/ARPスプーフィングによりyourbank.comをIPアドレスにポイントする)は、ログを記録するまで待機する可能性があります。サイトにログインし、自動スクリプトを使用して実際のサイトにコンピューターでサインインし、セキュリティの質問を取得し、選択したセキュリティの質問を表示し、ブラウザーからサイトに回答を送信し、セキュリティを取得するのを待ちます画像、セキュリティ画像を提供し、最後からパスワードを入力するのを待ちます。その時点で、ユーザーはパスワードを使用してログインし、悪意のある行為を行います。質問と画像を付与すると、リアルタイムで実行する必要がある攻撃になり、疑わしい署名が残る可能性があるため、世界中のあらゆる種類の攻撃されたユーザー名のセキュリティ画像を収集するよりもプロセスが難しくなります。 。

18
dr jimbob

他の回答は、この動作の背後にあるセキュリティ上の理由に関する良い洞察を提供します。それらは正しいですが、少なくともいくつかのWebサイトには、何が問題だったかを知ることができないようにプログラムされた承認ルーチンがあるだけであると確信しています-ログインまたはパスワード。

サンプルクエリ:

SELECT COUNT(*) FROM users WHERE login = 'john' AND hash = '2bbfcdf3f09ae8d700402f36913515cd'

これは、ログ記録が成功すると1を返し、そのような名前のユーザーがいない場合はを返しますまたはこのユーザーのパスワードは異なります。条件のどの部分が失敗したかを知る方法はありません。したがって、エラーメッセージを表示することになると、プログラマーは正直に何かがおかしいと言って、正確には何なのかわからないのです。

私はいくつかのPHPベースのWebサイトで同様のクエリを個人的に見たので、その理由の一部は、実際には認証プロセスのコーディング方法にあると確信しています。

13
Dyppl

ただし、user enumeration attack(およびその他)を実行するために適用できる別の興味深いテクニックがあります。これはTiming attackと呼ばれます。攻撃者は、認証要求の応答時間を測定し、有効なログインと無効なログインの間の違いを測定します。

  1. ナノ秒スケールのリモートタイミング攻撃PHPアプリケーション:真剣に取り組む時間?
    http://blog.astrumfutura.com/2010/10/nanosecond-scale-remote-timing-attacks-on-php-applications-time-to-take-them-seriously/

  2. タイミング攻撃のレッスン
    http://codahale.com/a-lesson-in-timing-attacks/

  3. タイミング攻撃を防ぐためのPHPでの一定時間の文字列比較
    https://codereview.stackexchange.com/questions/13512/constant-time-string-comparision-in-php-to-prevent-timing-attacks

この種の脅威からアプリケーションを保護するには、そのようなメッセージでは不十分だというのが私の指摘です。

8

その背後にあるセキュリティ上の理由は、それ以外の場合は、有効なユーザー名を見つけることがはるかに簡単になるためです。

5
Lucas Kauffman

すでに与えられたすべての素晴らしい答えに加えて、未承認のユーザーに一方的な情報を提供してはならないという一般的なセキュリティ原則があります。つまり「認証データが無効です」と回答するか、無効な部分を説明するかを選択する場合は、常に前者を選択する必要があります。いくつかの非常に厄介な暗号化攻撃は、「役立つ」ようにしようとする実装によって提供されるごくわずかなエラー情報に基づいています-「 パディングOracle攻撃 」を参照してください。したがって、許可されていないエンティティに開示される最小限の情報を常に選択することをお勧めします。つまり、ユーザー名/パスワードの組み合わせが適切でない場合は、常に「ユーザー名/パスワードが不適切」と答え、それ以上開示しないようにします。データ。特定のケース(ユーザー名が公開されているgmailなど)が重要ではない場合でも、デフォルトで採用することをお勧めします。

5
StasM

ランダムなユーザー名と同様にランダムなパスワードを入力するとします(入力するパスワードに注意してください)。これで、nユーザー間でパスワードを共通にすることができます。だから、ウェブサイトがパスワードが正しいと言ったら...あなたは次に何をするか知っています。

4
aayush anand

あいまいな答えを提供することは ser enumeration 攻撃を防ぐのに役立ちます。

場合によっては、攻撃者はユーザーアカウントを侵害する必要はありません。ユーザーがアカウントを持つ情報は、他のアクションなしで十分です。たとえば、顧客が競争の激しいWebショップでアカウントを持っていることは、商取引のための貴重な情報です。

4
Jakub Šturc

私は上記のさまざまな回答に感謝します。最もよく言われますが、アプリケーションはユーザー名またはパスワードの誤りを認識しないこともあります。特にSSO(シングルサインオン)を実装するためのトークンベースの認証の場合。 IBM Tivoli Access Manager アプリケーションは成功したトークンを受け取るか、エラーを返します。

4
Niks

ログインがメールアドレスである場合、人がウェブサイトに登録されていることが簡単にわかります-たぶん、あなたはログインIDとしてメールIDを使用すると、登録したウェブサイトのメールアカウントの実際のパスワードを使用することがあります:)

3