Чому перевірка неправильного пароля повинна зайняти більше часу, ніж перевірка правильного?


83

Це питання мене завжди турбувало.

У Linux на запит пароля, якщо ви ввели правильний вхід, він перевіряється відразу, майже без затримок. Але, з іншого боку, якщо ви вводите неправильний пароль, перевірка займає більше часу. Чому так?

Я спостерігав це у всіх дистрибутивах Linux, які я коли-небудь пробував.


Ви виявите, що це справедливо і для Windows. Крім того, зміна заголовка на щось на зразок: "Чому неправильні паролі займають більше часу, ніж правильні". Зробить це більш пов'язаним з програмуванням.
he_the_great

Я просто увійшов у свою систему Ubuntu, ввів неправильний пароль і задав собі те саме питання. :-)
johngreen

Відповіді:


106

Це насправді для запобігання атакам грубої сили від випробування мільйонів паролів в секунду. Ідея полягає в тому, щоб обмежити швидкість перевірки паролів, і існує ряд правил, яких слід дотримуватися.

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

Цей останній особливо важливий. Це означає відсутність корисних повідомлень, таких як:

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

або:

Sorry, password wasn't long enough

Навіть не різниця у часі у відповіді між причинами помилки "недійсний користувач та пароль" та "дійсний користувач, але недійсний пароль".

Кожна помилка повинна подавати точно однакову інформацію, текстову та іншу.

Деякі системи роблять це ще далі, збільшуючи затримку з кожним відмовою, або допускаючи лише три відмови, а потім мають значну затримку перед тим, як дозволити повторну спробу.


1
Як це запобігає застосуванню програми до розгалуження, випробування пароля, і якщо це не поверне успіху через деякий час, вбийте -9 дитини і знову вилку. Так, це працює лише в тому випадку, якщо ви можете ввійти як якийсь користувач, але коли це когось зупинило?
BCS

2
Це нікого не зупиняє, але вам все одно доведеться затриматися на той «деякий час». Навіть крихітна затримка робить перевірку мільйонів паролів марною, і ви будете виявлені, якщо будете робити це під час входу в систему - чи вважаєте ви, що нічого не реєструється для невдалих входів?
paxdiablo

5
BCS: якщо у вас вже є дійсний логін з достатньою кількістю привілеїв для виконання того, що ви пропонуєте, швидше за все, вам більше не потрібні атаки грубої сили (оскільки для вас доступні інші вектори атак). Затримка є найбільш корисною для зовнішніх зловмисників.
Еріх Кіцмюллер


12

Я не впевнений, але досить часто інтегрування затримки після введення неправильного пароля робить атаки важчими. Це робить атаку практично неможливою, оскільки перевірка лише кількох паролів займе багато часу.

Навіть спробувати кілька паролів - дати народження, ім’я кота та подібні речі - не стає цікавим.


І часто тайм-аут для другого збою довший, ніж тайм-аут для першого - що теж добре.
Джонатан Леффлер,

Ви бачили повідомлення про найімовірніші паролі? 123456 дуже популярний!
Спенс

@Spence, я насправді бачив ці предмети, але, на пам'ять, це не так погано, як це робили люди, вони (як це зазвичай роблять ЗМІ) роздували його пропорційно. Паролі були взяті зі списків скомпрометованих облікових записів, знайдених в режимі он-лайн, що означає, що вони набагато частіше небезпечні (оскільки вони були скомпрометовані). 123456може також становити 30% (наприклад) скомпрометованих рахунків , але навряд чи де - небудь поруч , що значні по всім рахункам.
paxdiablo

Ні, ці списки взяті з хак бази даних паролів, і більшість із них представляють зразки наборів у мільйони. Результати цих хакерів були підтверджені в багатьох онлайнових наборах даних і є дуже репрезентативними для "середнього" споживача. Єдиний спосіб отримати кращі паролі - це застосувати їх при створенні, а ще краще використовувати двофакторну автентифікацію, яка в будь-якому випадку є набагато кориснішою.
Спенс

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 */

Як правило, програма вимагає автентифікації користувача за допомогою Linux-PAM за допомогою виклику pam_authenticate () або pam_chauthtok (). Ці функції викликають кожен з накопичених модулів автентифікації, перелічених у відповідному конфігураційному файлі Linux-PAM. За вказівкою цього файлу, один із більше модулів може вийти з ладу, через що виклик pam _... () поверне помилку. Бажано, щоб перед продовженням програми також була зроблена пауза. Основною причиною такої затримки є безпека: затримка головним чином стримує атаки на словники грубої сили, але також допомагає перешкоджати тимчасовим (прихованим каналам) атакам.


8

Це дуже простий, практично невимушений спосіб значно підвищити безпеку. Розглянемо:

  1. Система Aне має затримок. У зловмисника є програма, яка створює комбінації імені користувача / пароля. При швидкості тисяч спроб на хвилину потрібно лише кілька годин, щоб спробувати кожну комбінацію та записати всі успішні логіни.

  2. Система Bгенерує 5-секундну затримку після кожного неправильного відгадування. Ефективність зловмисника знижена до 12 спроб на хвилину, що ефективно скалічує атаку грубої сили. Замість годин, знаходження дійсного логіну може зайняти місяці. Якби хакери були таким пацієнтом, вони були б законними. :-)


4

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

Можливо, вам також буде цікаво знати, що залежно від того, що ви використовуєте як оболонку для входу, зазвичай існує спосіб налаштування цієї затримки.

У GDM затримка встановлюється у файлі gdm.conf (зазвичай у /etc/gdm/gdm.conf). вам потрібно встановити RetryDelay = x, де x - значення в секундах.

Більшість дистрибутивів Linux сьогодні також підтримують встановлення FAIL_DELAY у /etc/login.defs, що дозволяє встановити час очікування після невдалої спроби входу.

Нарешті, PAM також дозволяє встановити атрибут nodelay на вашому рядку auth, щоб обійти затримку відмови. ( Ось стаття про PAM та Linux )


1

Я не бачу, що це може бути так просто, як пропонують відповіді.

Якщо відповідь на правильний пароль є (деяким значенням) негайною, чи не потрібно лише почекати, поки довше цього значення, щоб дізнатися, що пароль неправильний? (принаймні, знайте імовірнісно, ​​що добре для цілей розтріскування) І в будь-якому випадку ви б запускали цю атаку паралельно ... це все одна велика привітальна килимка DoS?


це не те, що вони мали на увазі. існує очевидна різниця між помилковим або неправильним введенням пароля. вони мали на увазі те, що не повинно бути різниці між неправильним ім’ям користувача та неправильним паролем. і ви маєте на увазі паралельно виконувати цю атаку? як можна запустити паралельно?
mpen

@Mark, паралельний запуск, ймовірно, призведе до відкриття декількох з'єднань та спроби входу в систему. Все-таки трудомісткий і не дуже практичний.
he_the_great

Якщо ви можете запустити мільйон перевірок в секунду на не сповільненому підключенні, а підключення додає затримку в 1 секунду за невдалі спроби, вам знадобиться мільйон клієнтів-атак, щоб отримати той самий ефект. Я сумніваюся, що сервер дозволить створювати багато сеансів telnet.
paxdiablo

справа в тому, що вам не доведеться чекати затримки перед тим, як спробувати наступний пароль, то яка користь?

@Greg, вам доведеться повторно підключитися до хосту, і, якщо потрібно, наступним кроком буде перевірка IP-адрес, щоб схопити і це.
paxdiablo

1

Те, що я спробував раніше, здавалося результативним, але насправді ні; якщо вам все одно, ви повинні переглянути історію редагування wiki ...

Що робить роботу (для мене) в тому, щоб як знизити значення затримки pam_faildelay.so = Х в файлі /etc/pam.d/login (я опустив його на 500000, половина другого), а також додати NODELAY (а передує пробіл) до кінця рядка у загальній автентифікації , як описано Габріелем у його відповіді

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

Принаймні для мене (debian sid) лише внесення однієї з цих змін не скоротить затримку помітно нижче 3 секунд за замовчуванням, хоча подовжити затримку можна, лише змінивши значення в /etc/pam.d/login.

Цього лайна досить, щоб змусити дорослого чоловіка заплакати!


0

На Ubuntu 9.10, і я думаю, що і нові версії, знаходиться файл, який ви шукаєте

/etc/pam.d/login

редагувати рядок:

auth необов’язковий pam_faildelay.so затримка = 3000000

змінивши номер 3 на інший, який вам може знадобитися.

Зверніть увагу, що для автентифікації "nodelay" я ДУМАЮ, що вам слід відредагувати файл

/etc/pam.d/common-auth

теж. На лінії:

auth [успіх = 1 за замовчуванням = ігнорувати] pam_unix.so nullok_secure

додати 'nodelay' до фіналу (без лапок). Але це останнє пояснення щодо "nodelay" - це те, що я думаю.


0

Я хотів би додати примітку з точки зору розробників. Хоча це не буде очевидним неозброєним оком, розумний розробник вирветься із запиту на збіг, коли збіг буде знайдено. На свідоцтво, успішний матч завершиться швидше, ніж невдалий. Оскільки, функція зіставлення порівнює облікові дані з усіма відомими обліковими записами, поки не знайде правильну відповідність. Іншими словами, припустимо, що існує 1000000 облікових записів користувачів за порядком за ідентифікаторами; 001, 002, 003 тощо. Ваш ідентифікатор - 43 001. Отже, коли ви вводите правильне ім’я користувача та пароль, сканування зупиняється на 43 001 і входить у систему. Якщо ваші облікові дані неправильні, він сканує всі 1 000 000 записів. Різниця в часі обробки на двоядерному сервері може складати мілісекунди. У Windows Vista з 5 обліковими записами користувачів це було б за наносекунди.


Я думаю, ви знайдете 99% плакатів тут - розробники того чи іншого рівня. Перестань звучати так помпезно.

Я використовую Ubuntu, і є лише один користувач. Однак, коли я подаю неправильний пароль, мені потрібно 3 секунди, щоб отримати відповідь. Отже, ви помиляєтесь :)
Халіл Білгін

0

Я згоден. Це довільне рішення програмування. Додавання затримки до однієї секунди замість трьох насправді не шкодить розбірливості пароля, але робить його більш зручним для користувача.


0

Технічно ця свідома затримка полягає у запобіганні атакам, таким як "атака лінеаризації" (існують також інші атаки та причини) .

Щоб проілюструвати атаку, розглянемо програму (без цієї навмисної затримки), яка перевіряє введений серіал, щоб перевірити, чи відповідає він правильному серіалу, який у цьому випадку виявляється " xyba " . Для ефективності програміст вирішив перевіряти по одному символу і виходити, як тільки виявляється неправильний символ, перед початком перевіряються також довжини.

Обробка правильної серійної довжини триватиме довше, ніж неправильна серійна довжина. Ще краще (для зловмисника) серійний номер, що має правильний перший символ, займе більше часу, ніж той, що має неправильний перший символ. Послідовні кроки часу очікування полягають у тому, що кожного разу, коли є ще один цикл, порівняння, яке потрібно пройти на правильному введенні.

  • Отже, зловмисник може вибрати чотиризначний рядок, і рядок, що починається з x, займає найбільше часу. (за здогадкою)
  • Потім зловмисник може зафіксувати символ як x та змінити другий символ, і в цьому випадку вони виявлять, що y займає найбільше часу.
  • Потім зловмисник може зафіксувати перші два символи як xy та змінити третій символ, і в цьому випадку вони виявлять, що b займає найбільше часу.
  • Потім зловмисник може виправити перші три символи як xyb і змінити четвертий символ, і в цьому випадку вони виявлять, що a займає найбільше часу.

Отже, зловмисники можуть відновити серійний по одному персонажу за раз.

Лінеаризація.java.

Linearization.docx, зразок виводу

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

Значна частина письмових воєнних дій адаптована до цього (взято з Марка Стеймпа в "Інформаційна безпека: принципи та практика"). Крім того, розрахунки, наведені вище, не враховують обсяг здогадок, необхідних для з'ясування правильної серійної довжини.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.