Почему проверка неправильного пароля занимает больше времени, чем проверка правильного?

Этот вопрос всегда меня беспокоил.

В Linux при запросе пароля, если ваш ввод правильный, он проверяет сразу, без каких-либо задержек. Но, с другой стороны, если вы вводите неверный пароль, для проверки требуется больше времени. Почему это?

Я наблюдал это во всех дистрибутивах Linux, о которых я когда-либо пробовал.

Ответ 1

На самом деле это предотвращает атаки грубой силы от попыток миллионов паролей в секунду. Идея состоит в том, чтобы ограничить скорость проверки паролей и соблюдать ряд правил.

  • Успешная пара пользователей/паролей должна быть успешной.
  • Не должно быть различимого различия в причинах сбоя, которые могут быть обнаружены.

Это последнее особенно важно. Это означает отсутствие полезных сообщений, например:

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

или

Sorry, password wasn't long enough

Отсутствие разницы во времени между ошибками "неверный пользователь и пароль" и "допустимый пользователь, но недействительный пароль".

Каждый отказ должен предоставлять точно такую ​​же информацию, текстовую и другую.

Некоторые системы принимают это еще больше, увеличивая задержку при каждом сбое или разрешая только три отказа, но с большой задержкой, прежде чем разрешить повтор.

Ответ 2

Это позволяет угадать пароли дольше.

Ответ 3

Я не уверен, но довольно часто интегрировать задержку после ввода неправильного пароля, чтобы сделать атаки сложнее. Это делает атаку практически неосуществимой, потому что вам потребуется много времени, чтобы проверить только несколько паролей.

Даже пробовать несколько паролей - даты рождения, имя кошки и тому подобное - превращается в невесело.

Ответ 4

В основном, чтобы смягчить атаки грубой силы и словаря.

От Руководство для разработчиков приложений 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 */

Как правило, запрос приложения что пользователь аутентифицирован Linux-PAM посредством вызова pam_authenticate() или pam_chauthtok(). Эти функции вызывают каждый из многоуровневые модули аутентификации в соответствующем Linux-PAM Файл конфигурации. В соответствии с этот файл, один из следующих модулей может привести к сбою вызова pam _...() вернуть ошибку. Желательно там также должна быть пауза до приложение продолжается. Главный причиной такой задержки является безопасность: a задержка действует, чтобы препятствовать грубой силе прежде всего, помогает ограничить время (скрытый канал) атаки.

Ответ 5

Это очень простой, практически простой способ значительно повысить безопасность. Рассмотрим:

  • Система A не имеет задержки. У злоумышленника есть программа, которая создает комбинации имени пользователя и пароля. При скорости тысячи попыток в минуту требуется всего несколько часов, чтобы попробовать каждую комбинацию и записать все успешные логины.

  • Система B генерирует 5-секундную задержку после каждого неправильного предположения. Эффективность злоумышленника была уменьшена до 12 попыток в минуту, что фактически повредило атаке грубой силы. Вместо часов может потребоваться несколько месяцев, чтобы найти действительный логин. Если бы хакеры были этим пациентом, они стали бы законными.: -)

Ответ 6

Не удалось выполнить задержки аутентификации, чтобы уменьшить скорость попытки входа в систему. Идея, что если кто-то пытается использовать словарь или грубую силу, атакует одну или несколько учетных записей пользователей, для которых атакующему потребуется ждать задержки провала и, таким образом, вынуждает его уделять больше времени и давать больше шансов обнаружить его.

Вам также может быть интересно узнать, что в зависимости от того, что вы используете в качестве оболочки для входа, обычно есть способ настроить эту задержку.

В GDM задержка устанавливается в файле gdm.conf(обычно в /etc/gdm/gdm.conf). вам нужно установить RetryDelay = x, где x - значение в секундах.

В настоящее время большинство дистрибутивов Linux также поддерживают FAIL_DELAY, определенные в файле /etc/login.defs, что позволяет установить время ожидания после неудачной попытки входа в систему.

Наконец, PAM также позволяет вам установить атрибут nodelay на вашей строке auth, чтобы обойти задержку сбоя. (Здесь статья о PAM и Linux)

Ответ 7

Я не вижу, чтобы это было так просто, как подсказывают ответы.

Если ответ на правильный пароль (некоторое значение) немедленный, вам не нужно ждать дольше, чем это значение, чтобы знать, что пароль неверен? (по крайней мере, знаю вероятностно, что отлично подходит для взлома) И в любом случае вы будете использовать эту атаку параллельно... это все один большой приветственный коврик DoS?

Ответ 8

То, что я пробовал раньше, казалось, работало, но на самом деле этого не делал; если вам интересно, вы должны просмотреть историю изменений wiki...

Что работает (для меня), до оба опускают значение pam_faildelay.so delay = X в /etc/pam.d/login (я опустил его до 500000, полсекунды), , а также добавить nodelay (которому предшествует пробел) до конца строки в common-auth, как описано Габриэлем в его ответе.

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

По крайней мере, для меня (debian sid), только одно из этих изменений не уменьшит задержку значительно ниже значения по умолчанию 3 секунды, хотя можно удлинить задержку, только изменив значение в/etc/pam.d/Логин.

Этого вида дерьма достаточно, чтобы заставить взрослого человека плакать!

Ответ 9

В 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' в финал (без кавычек). Но это окончательное объяснение "nodelay" - это то, что я думаю.

Ответ 10

Я хотел бы добавить примечание с точки зрения разработчиков. Хотя это не было бы очевидно для невооруженного глаза, умный разработчик вырвался бы из запроса соответствия, когда совпадение найдено. Свидетель, успешный матч завершится быстрее, чем неудачный матч. Поскольку функция сопоставления будет сравнивать учетные данные со всеми известными учетными записями, пока не найдет правильное совпадение. Другими словами, допустим, что по идентификаторам насчитывается 1 000 000 учетных записей пользователей; 001, 002, 003 и т.д. Ваш идентификатор - 43 001. Таким образом, когда вы вводите правильное имя пользователя и пароль, сканирование останавливается на 43 001 и регистрирует вас. Если ваши учетные данные неверны, он сканирует все 1 000 000 записей. Разница во времени обработки на двухъядерном сервере может быть в миллисекундах. В Windows Vista с 5 учетными записями пользователей это будет в наносекундах.

Ответ 11

Я согласен. Это произвольное решение для программирования. Установка задержки на одну секунду вместо трех не очень вредит взлому пароля, но делает его более удобным для пользователя.

Ответ 12

Технически эта преднамеренная задержка заключается в предотвращении атак типа атаки "Линеаризация" (есть и другие атаки и причины).

Чтобы проиллюстрировать атаку, рассмотрите программу (без этого преднамеренная задержка), которая проверяет введенный серийный номер, чтобы увидеть, соответствует правильному серийному номеру, который в этом случае "Xyba" . Для эффективности программист решил проверить один за один раз и выходить, как только неправильный символ найдено, перед началом также проверяются длины.

Для правильной последовательной длины потребуется больше времени, чем неправильная последовательная длина. Еще лучше (для злоумышленника), серийный номер который имеет первый правильный символ, займет больше времени, чем любой имеет неправильный первый символ. Последовательные шаги в ожидании потому что каждый раз там еще один цикл, сравнение на правильном входе.

  • Таким образом, злоумышленник может выбрать четырехсимвольную строку и что строка, начинающаяся с x, занимает больше всего времени. (по завершении работы)
  • Затем атакующий может установить символ как x и изменить второй символ, и в этом случае они найдут, что y занимает самое длинное.
  • Затем атакующий может исправить первые два символа как xy и изменить третьего символа, и в этом случае они найдут, что b берет длинный.
  • Затем атакующий может исправить первые три символа как xyb и изменить четвертый символ, и в этом случае они обнаружат, что a принимает длинный.

Следовательно, злоумышленники могут восстанавливать последовательный один символ за раз.

Linearization.java.

Linearization.docx, образец вывода

Серийный номер состоит из четырех символов, каждый из которых имеет 128 символов возможные значения. Тогда существует 128 4= 2 28 = 268 435 456 возможных серий. Если злоумышленник должен случайно догадаться полные серийные номера, она угадала бы серийный номер примерно 2 27= 134 217 728 попыток, что представляет собой огромный объем работы. С другой стороны, используя атаку линеаризации выше, для каждой буквы требуется всего лишь 128/2 = 64 догадки, для общая ожидаемая работа около 4 * 64 = 2 8= 256 догадокчто представляет собой тривиальный объем работы.

Большая часть написанного боевого искусства адаптирована из this (взято из Mark Stamp "Информационная безопасность: принципы и практика" ). Кроме того, приведенные выше расчеты не учитывают количество догадок, необходимых для определения правильной последовательной длины.