間違ったパスワードをチェックするのに、正しいパスワードをチェックするよりも時間がかかるのはなぜですか?


83

この質問はいつも私を悩ませてきました。

Linuxでは、パスワードの入力を求められたときに、入力が正しい場合は、ほとんど遅延なくすぐにチェックされます。ただし、その一方で、間違ったパスワードを入力すると、確認に時間がかかります。何故ですか?

これは、これまでに試したすべてのLinuxディストリビューションで観察されました。


これはWindowsにも当てはまります。また、タイトルを「間違ったパスワードは正しいパスワードよりも時間がかかるのはなぜですか」のように変更します。それをよりプログラミング関連にするだろう。
he_the_great 2009

Ubuntuシステムにログインし、間違ったパスワードを入力して、同じ質問をしました。:-)
ジョングリーン2014年

回答:


106

実際には、ブルートフォース攻撃が1秒間に数百万のパスワードを試行するのを防ぐためです。アイデアは、パスワードをチェックできる速度を制限することであり、従う必要のあるルールがいくつかあります。

  • 成功したユーザー/パスワードのペアはすぐに成功するはずです。
  • 検出できる障害の理由に識別可能な違いがあってはなりません

最後のものは特に重要です。これは、次のような役立つメッセージがないことを意味します。

Your user name is correct but your password is wrong, please try again

または:

Sorry, password wasn't long enough

「無効なユーザーとパスワード」と「有効なユーザーだが無効なパスワード」の失敗理由の応答に時間差さえありません。

すべての失敗は、テキストやその他の点でまったく同じ情報を提供する必要があります。

一部のシステムでは、さらに進んで、障害ごとに遅延を増やしたり、3回の障害のみを許可してから、再試行を許可する前に大幅な遅延を発生させたりします。


1
これにより、アプリがフォークしたり、パスワードを試したりするのをどのように防ぐことができますか。一定時間内に成功が返されない場合は、子を-9キルして、もう一度フォークします。はい、それはあなたが誰かのユーザーとしてログインできる場合にのみ機能しますが、それはいつ誰かを止めましたか?
BCS

2
それは誰も止めませんが、それでもあなたはその「ある程度の時間」の間遅れなければなりません。でも、小さな遅延が役に立たないパスワードの数百万人を確認します、とあなたはします、あなたがそれをやっている場合にログインしているときに検出されること-あなたは何をして失敗したログインのためにログに記録されていないと思いますか?
paxdiablo 2009

5
BCS:提案したことを実行するのに十分な特権を持つ有効なログインをすでに持っている場合、ブルートフォース攻撃が不要になる可能性があります(他の攻撃ベクトルが利用できるため)。遅延は、外部の攻撃者に対して最も役立ちます。
Erich Kitzmueller 2009年


12

よくわかりませんが、間違ったパスワードを入力した後の遅延を統合して、攻撃を困難にすることはよくあることです。これにより、少数のパスワードのみをチェックするのに長い時間がかかるため、攻撃は実質的に実行不可能になります。

いくつかのパスワード(生年月日、猫の名前など)を試しても、面白くありません。


また、多くの場合、2回目の失敗のタイムアウトは最初の失敗のタイムアウトよりも長くなります。これも良いことです。
Jonathan Leffler

最も可能性の高いパスワードに関するニュース投稿を見ましたか?123456はとても人気があります!
スペンス2010年

@スペンス、私は実際にそれらのアイテムを見ましたが、記憶から、それは人々が作ったほど悪くはありません、彼らは(メディアがそうするつもりはないので)それを不釣り合いに吹き飛ばしていました。パスワードは、オンラインで見つかった侵害されアカウントのリストから取得されました。つまり、パスワードは(侵害されたために)安全でない可能性がはるかに高くなります。侵害されたアカウントの30%(たとえば)を占める123456可能性は十分にありますが、すべてのアカウントでその重要性に近いとは考えられません。
paxdiablo 2018年

いいえ、これらのリストはパスワードデータベースのハッキングからのものであり、それらのほとんどは数百万のサンプルセットを表しています。これらのハッキングの結果は、複数のオンラインデータセットで確認されており、「平均的な」消費者を非常によく表しています。より良いパスワードを取得する唯一の方法は、作成時にパスワードを適用するか、とにかくはるかに便利な2要素認証を使用することです。
スペンス

12

基本的に、ブルートフォース攻撃や辞書攻撃を軽減します。

以下からのLinux-PAMアプリケーション開発者ガイド

遅延の計画

extern int pam_fail_delay(pam_handle_t *pamh, unsigned int micro_sec);

この関数はLinux-PAMによって提供され、pam_authenticate()の呼び出しが失敗した後、制御がアプリケーションに返されるまでの時間遅延を促進します。この関数を使用する場合、アプリケーションプログラマは、で使用できるかどうかを確認する必要があります。

#ifdef PAM_FAIL_DELAY
    ....
#endif /* PAM_FAIL_DELAY */

通常、アプリケーションは、pam_authenticate()またはpam_chauthtok()の呼び出しを通じて、ユーザーがLinux-PAMによって認証されることを要求します。これらの関数は、関連するLinux-PAM構成ファイルにリストされているスタック認証モジュールのそれぞれを呼び出します。このファイルの指示に従って、1つ以上のモジュールが失敗し、pam _...()呼び出しがエラーを返す場合があります。アプリケーションを続行する前に一時停止することも望ましいです。このような遅延の主な理由はセキュリティです。遅延は、主にブルートフォース辞書攻撃を阻止するように機能しますが、時限(秘密チャネル)攻撃を妨げるのにも役立ちます。


8

これは、セキュリティを大幅に向上させるための非常にシンプルで実質的に簡単な方法です。考えてみましょう:

  1. システムAに遅延はありません。攻撃者は、ユーザー名とパスワードの組み合わせを作成するプログラムを持っています。1分あたり数千回の試行の割合で、すべての組み合わせを試行し、成功したすべてのログインを記録するのに数時間しかかかりません。

  2. システムBは、誤った推測が行われるたびに5秒の遅延を生成します。攻撃者の効率は1分あたり12回に減少し、ブルートフォース攻撃を効果的に無効にします。有効なログインを見つけるには、数時間ではなく数か月かかる場合があります。ハッカーがその忍耐強いなら、彼らは合法になるでしょう。:-)


4

ログイン試行の速度を下げるために、失敗した認証の遅延があります。誰かが辞書やブルートフォース攻撃を試みている場合、またはユーザーアカウントを使用している場合、攻撃者は失敗の遅延を待つ必要があり、その結果、攻撃者はより多くの時間を費やし、それを検出する機会が増えるという考え。

ログインシェルとして使用しているものによっては、通常、この遅延を構成する方法があることを知りたいと思うかもしれません。

GDMでは、遅延はgdm.confファイル(通常は/etc/gdm/gdm.conf)で設定されます。RetryDelay = xを設定する必要があります。ここで、xは秒単位の値です。

最近のほとんどのLinuxディストリビューションは、/ etc / login.defsでFAIL_DELAYを定義することもサポートしており、ログイン試行が失敗した後の待機時間を設定できます。

最後に、PAMでは、認証行にnodelay属性を設定して、失敗の遅延を回避することもできます。(これはPAMとLinuxに関する記事です


1

回答が示唆するほど単純なことはないと思います。

正しいパスワードへの応答が(ある値の)即時である場合、パスワードが間違っていることを知るために、その値より長くなるまで待つ必要があるだけではありませんか?(少なくとも確率的には、クラッキングの目的には問題ありません)そして、とにかく、この攻撃を並行して実行することになります...これはすべて1つの大きなDoSウェルカムマットですか?


それは彼らが意味したことではありません。パスワードを間違えるか正しいかには明らかな違いがあります。彼らが意味したのは、間違ったユーザー名と間違ったパスワードの間に違いがあってはならないということでした。この攻撃を並行して実行するという意味ですか?どうすれば並行して実行できますか?
mpen 2009

@Markを並行して実行すると、おそらく複数の接続を開いてログインを試みる必要があります。それでも時間がかかり、あまり実用的ではありません。
he_the_great 2009

低速でない接続で1秒あたり100万回のチェックを実行でき、失敗した試行に対して接続に1秒の遅延が追加された場合、同じ効果を得るには100万回の攻撃クライアントが必要になります。サーバーがその数のtelnetセッションの作成を許可するとは思えません。
paxdiablo 2009

重要なのは、次のパスワードを試す前に遅延を待つ必要がないということです。では、どのような用途がありますか?

@Greg、ホストに再接続する必要があります。必要に応じて、次のステップはIPアドレスをチェックしてこれもキャッチすることです。
paxdiablo 2009

1

以前に試したことは機能しているように見えましたが、実際には機能しませんでした。気になる場合は、wikiの編集履歴を確認する必要があります...

何をに、(私のために)仕事をされて、両方= Xでpam_faildelay.so遅延の低い値/etc/pam.d/login(私は、500000に0.5秒、それを低下させ)、そしてまたNODELAYを追加(Aが先行スペース)共通認証の行の終わりまで、Gabrielが彼の回答で説明しているように。

auth [success=1 default=ignore] pam_unix.so nullok_secure nodelay

少なくとも私(debian sid)にとっては、これらの変更の1つを行うだけでは、遅延がデフォルトの3秒よりも大幅に短くなることはありませんが、/ etc / pam.d / loginの値を変更するだけで遅延を長くすることはできます。

この種のがらくたは、成長した男を泣かせるのに十分です!


0

Ubuntu 9.10では、新しいバージョンもあると思いますが、探しているファイルは次の場所にあります。

/etc/pam.d/login

行を編集します。

authオプションのpam_faildelay.sodelay = 3000000

あなたが望むかもしれない別のもので番号3を変更します。

'nodelay'認証を取得するには、ファイルを編集する必要があると思います。

/etc/pam.d/common-auth

あまりにも。オンライン:

auth [success = 1 default = ignore] pam_unix.so nullok_secure

'nodelay'を最後に追加します(引用符なし)。しかし、「ノードレイ」についてのこの最後の説明は私が思うことです。


0

開発者の観点からメモを追加したいと思います。これは肉眼では明らかではありませんが、賢い開発者は一致が見つかったときに一致クエリから抜け出します。目撃者では、成功した試合は失敗した試合よりも早く完了します。なぜなら、マッチング関数は、正しい一致が見つかるまで、資格情報をすべての既知のアカウントと比較するからです。つまり、ID順に1,000,000のユーザーアカウントがあるとします。001、002、003など。あなたのIDは43,001です。したがって、正しいユーザー名とパスワードを入力すると、スキャンは43,001で停止し、ログインします。資格情報が正しくない場合は、1,000,000レコードすべてがスキャンされます。デュアルコアサーバーでの処理時間の違いは、ミリ秒単位である可能性があります。5つのユーザーアカウントを持つWindowsVistaでは、ナノ秒単位になります。


ここのポスターの99%は、あるレベルまたは別のレベルの開発者であることがわかると思います。そんなに派手に聞こえるのをやめなさい。

私はUbuntuを使用していますが、ユーザーは1人だけです。ただし、間違ったパスワードを送信すると、応答が得られるまでに3秒かかります。だから、あなたは間違っています:)
Halil Bilgin 2014

0

同意する。これは任意のプログラミング決定です。遅延を3秒ではなく1秒に設定しても、パスワードの解読性はそれほど損なわれませんが、よりユーザーフレンドリーになります。


0

技術的には、この意図的な遅延は、「線形化攻撃」の ような攻撃を防ぐためのものです(他の攻撃や理由もあります)

攻撃を説明するために、入力されたシリアルをチェックして、正しいシリアル(この場合は「xyba」)と一致するかどうかを確認するプログラム(この意図的な遅延なしについて考えてみます。ます。効率を上げるために、プログラマーは一度に1文字をチェックし、間違った文字が見つかったらすぐに終了してから、長さもチェックすることにしました。

正しいシリアル長は、誤ったシリアル長よりも処理に時間がかかります。さらに良いことに(攻撃者にとって)、最初の文字が正しいシリアル番号は、最初の文字が正しくないシリアル番号よりも時間がかかります。待機時間の連続するステップは、ループがもう1つあるたびに、正しい入力で比較が行われるためです。

  • したがって、攻撃者は 4文字の文字列 xで始まる文字列に最も時間がかかります。(推測による)
  • 次に、攻撃者は文字をxとして修正し、2番目の文字を変更できます。その場合、yが最も長くかかることがわかります。
  • その後、攻撃者は最初の2文字を次のように修正できます。 xy、3番目の文字を変更できます。この場合、bに最も時間がかかることがわかります。
  • 攻撃者は最初の3文字をxybとして修正できます、4番目の文字を変更できます。その場合、aに最も時間がかかることがわかります。

したがって、攻撃者は一度に1文字ずつシリアルを回復できます。

Linearization.java。

Linearization.docx、サンプル出力

シリアル番号は4文字の長さで、各文字には128の可能な値があります。次に、128 4 = 2 28 = 268,435,456の可能なシリアルがあります。攻撃者が完全なシリアル番号をランダムに推測する必要がある場合、彼女は約2 27 = 134,217,728回の試行でシリアル番号を推測し ます。これは、膨大な量の作業です。一方、上記の線形化攻撃を使用すると、各文字に必要な推測は平均128/2 = 64であり、予想される合計作業量は約4 * 64 = 2 8 = 256推測です。 ありこれはな量です。仕事の。

書かれた武道の多くはこれから適応されています(マークスタンプの「情報セキュリティ:原則と実践」から引用)。また、上記の計算では、正しいシリアル長を計算するために必要な当て推量の量は考慮されていません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.