web-dev-qa-db-ja.com

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

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

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

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

82
Flávio Amieiro

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

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

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

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

または:

Sorry, password wasn't long enough

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

Every失敗すると、テキストとそれ以外はまったく同じ情報が提供されます。

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

105
paxdiablo

これにより、パスワードの推測に時間がかかります。

14
RossFabricant

よくわかりませんが、間違ったパスワードを入力した後の遅延を統合して、攻撃を困難にすることはよくあることです。これにより、いくつかのパスワードのみを確​​認するのに長い時間がかかるため、攻撃は事実上実行不可能になります。

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

12

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

The Linux-PAM Application Developer's Guide から:

遅延の計画

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 _...()呼び出しでエラーが返される場合があります。アプリケーションが続行する前に一時停止することも望ましいです。このような遅延の主な理由はセキュリティです。遅延は、ブルートフォース辞書攻撃を阻止するために主に機能しますが、時限攻撃(潜伏チャネル)の妨害にも役立ちます。

12
user32542

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

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

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

8
Adam Liss

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

ログインシェルとして何を使用しているかに応じて、通常、この遅延を構成する方法があることを知りたい場合もあります。

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

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

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

4

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

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

1
Greg M

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

does work(for me)とは、both pam_faildelay.so delay = X in / etc/pam.d/loginの値を下げることです。 =(私はそれを500000、0.5秒に下げました)、そしてまた説明されているようにcommon-authの行の終わりにnodelay(スペースが前に付いています)を追加しますガブリエルの答え。

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

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

このようながらくたは、大人の男を泣かせるのに十分です!

1
user383869

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

攻撃を説明するために、プログラムを検討します(この意図的な遅延なしで)、入力されたシリアルをチェックして、それが正しいシリアル(この場合は "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 = 228 = 268,435,456の可能なシリアル。攻撃者が完全なシリアル番号をランダムに推測する必要がある場合、攻撃者は約2でシリアル番号を推測します27 = 134,217,728回の試行、これは膨大な量の作業です。一方、上記の線形化攻撃を使用すると、各文字に平均128/2 = 64の推測が必要になり、合計の予想作業量は約4 * 64 = 2になります。8 = 256の推測、これは些細な作業量です。

書かれた武道の多くは this (Mark Stampの「InformationSecurity:PrinciplesandPractice」から引用)から採用されています。また、上記の計算では、正しいシリアル長を計算するために必要な推測の量は考慮されていません。

0

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

/etc/pam.d/login

行を編集します。

authオプションのpam_faildelay.so delay = 3000000

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

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

/etc/pam.d/common-auth

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

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

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

0

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

0
Jim

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

0
user368580