vyvchy
    Теми розділу

    11 · Security для QA

    Автентифікація: атаки й тестування

    Зміст

    Форма входу виглядає найпростішою фічею продукту: два поля й кнопка — тому її й перевіряють найповерховіше, «правильний пароль пускає, неправильний ні». при цьому не ламає криптографію: він бере злитий на іншому сайті список пар «логін-пароль» і чекає, поки якась підійде.

    Ця глава — повний виклад теми. Права після входу — Авторизація та контроль доступу, сесії й токени — Сесії та токени, самі поняття — Автентифікація та авторизація.

    Збої автентифікації як категорія ризику

    (Authentication Failures) в редакції 2025 означені одним реченням: присутня, коли атакувальник здатен змусити систему визнати невалідного чи неправильного користувача легітимним. Ознаки читаються як чекліст: дозволені і , які не блокуються швидко; дефолтні паролі; слабке відновлення доступу; MFA немає або вона неефективна. Причина названа прямо: більшість іде через пароль як єдиний фактор, а вимоги ротації й складності підштовхують людей вживати паролі повторно й брати слабкі.

    Три атаки на пароль, які плутають

    Брутфорс (brute force attack) OWASP означує ширше за «перебір паролів»: атакувальник задає наперед визначені значення, шле запити й аналізує відповідь — без розрізнюваної відповіді перебір марний. Родина розводиться за тим, що множиться:

    АтакаЩо множитьсяЗвідки дані
    Brute forceбагато паролів проти одного акаунтасловник або клас символів
    Credential stuffingготові пари проти багатьох сайтіввитік чужого сайту
    Password sprayingодин слабкий пароль на багато акаунтівсписок логінів

    Credential stuffing працює проти звички користувача: брутфорс вгадує, а він знає готові пари. Спроб на акаунт мало, тож детектор «багато спроб на цей логін» атаку не бачить; а з даних витоку пароль ще й скидають через (security question, KBA). — брутфорс, перепроєктований під ваш поріг: один пароль на багато акаунтів, щоб лічильник не спрацював ніколи; типова — однаковий стартовий пароль для нових користувачів, тож джерело вимагає міняти його на першому вході.

    Захист спільний, головним названо MFA: за аналізом Microsoft, вона зупинила б 99,9 % компрометацій. Блокування за IP не має бути єдиним чи головним захистом — набори для credential stuffing ходять -мережами, тож обсяг на адресу низький. Для QA головне: перебору будується на тілі відповіді, а не на коді — однаковий код ще не означає однакову відповідь.

    Пароль: вимоги до нього і до його зберігання

    (password policy) — місце, де переказ розходиться з першоджерелом, тож числа й модальності тримаємо дослівно. NIST SP 800-63B-4 ставить SHALL на мінімум 15 символів для пароля як єдиного фактора; вісім легітимні лише як частина MFA, а максимум — SHOULD permit ... at least 64 characters.

    • Композиційні правила заборонені (SHALL NOT impose other composition rules). Єдина підстава відхилити пароль — (password blocklist), і порівнюють цілий пароль: той, хто обрав би password, під тиском правил бере Password1.
    • Планова зміна заборонена, вимушена обовʼязкова: SHALL NOT require subscribers to change passwords periodically, але SHALL force a change за свідчень компрометації.
    • Пароль приймається цілим: задовгий має дати помилку, а не тихо вкоротитися.

    І тут два канонічні джерела не збігаються. Тест-айтем -ATHN-07 оцінює політику за осями «довжина, складність, повторне використання, старіння» — тобто перевіряє те, на що NIST ставить SHALL NOT. Сам WSTG це визнає: NIST і NCSC радять проти примусового строку дії пароля, «хоча його можуть вимагати стандарти на кшталт PCI DSS». Відповідь залежить від застосовного режиму відповідності. Звідти ж обхід історії паролів: пʼять змін поспіль і повернення до початкового.

    (password storage) здається темою розробника, але половина висновків робиться з інтерфейсу. Стандарт вимагає форми, resistant to offline attacks, а хеш односпрямований — тож якщо застосунок уміє показати вже збережений пароль або надіслати його листом, він тримає його у вигляді, з якого пароль дістають (показ того, що користувач друкує зараз, — інша річ, і стандарт її навпаки радить). SHA-256 непридатний через швидкість, (work factor) видно у виводі хеша, а bcrypt бере щонайбільше 72 байти — тож ліміт довжини виставляють явно. Механіка алгоритмів — тема глави «Криптографія і транспорт для QA».

    Другий фактор: MFA й одноразові коди

    (multifactor authentication, MFA) — вимога подати більш ніж один тип доказу. Межа проходить по типу, а не по кількості полів: пароль плюс PIN багатофакторністю не є, і те саме канон каже про пароль плюс контрольне питання. Фактори мають бути незалежні — цю умову порушує -застосунок на тому пристрої, з якого йде вхід. Причина в одному реченні: паролі не стійкі до фішингу.

    Фактори канон ранжує: на основі FIDO2 — дуже надійна форма, стійка до фішингу; U2F стійкий, бо приватний ключ не покидає токен; SMS і коди телефонною мережею NIST SP 800-63B-4 позначає як (restricted authenticator). Найтонше місце — не сам фактор, а його скидання й зміна: перед зміною потрібна переавтентифікація наявним фактором, бо сесію могли захопити.

    (one-time password, OTP) — теж секрет автентифікації, тож із ним поводяться за паролевою гігієною: короткий строк життя, одноразовість, суворий ліміт спроб — у шестизначного коду близько мільйона варіантів. стоїть на HMAC і лічильнику подій; TOTP — той самий HOTP, де лічильник заміняє значення, похідне від точки відліку й кроку часу (у RFC 6238 крок — системний параметр, значення за замовчуванням 30 секунд). Звідси перевірки: той самий код удруге прийматися MUST NOT; на допускається щонайбільше один крок; ліміт спроб перевіряють з паралельних сесій; код — щонайменше шість цифр.

    Перелічування акаунтів: чотири виміри однакової відповіді

    (account enumeration) має власний тест-айтем WSTG-IDNT-04: зібрати набір валідних логінів через механізм автентифікації. Корінь у тому, що відповідь на валідний логін відрізняється від відповіді на невалідний — часто через хибну конфігурацію або рішення дизайну, і тоді це питання до вимог, а не дефект реалізації.

    Інваріант: застосунок відповідає однаковим повідомленням і однаковою довжиною на кожен невдалий вхід; еталон дослівно — «Login failed; Invalid user ID or password.» Але текст лише один вимір із чотирьох. Решта: код відповіді (200 проти 403 розрізняє акаунти, хоч сторінка однакова), довжина тіла й час — надсилання листа відновлення додає кілька сотень мілісекунд, і лікується асинхронним викликом або однаковою логікою замість «швидкого виходу».

    Каналів більше, ніж форма входу: , повторне надсилання підтвердження, багатокроковий вхід (перелічування перед credential stuffing робить атаку тихішою), персональні URI, форма з контрольними питаннями — їх показують лише після підтвердження володіння поштою.

    Блокування, рейт-ліміт і CAPTCHA

    (account lockout) — баланс між захистом акаунта й власному користувачеві; верифікатор SHALL обмежувати невдалі спроби. Перевіряють три параметри: (lockout threshold), (observation window) і (lockout duration), яка буває й експоненційною.

    Чисел-норм канон не дає: WSTG у Summary називає типовим порогом «3–5 спроб», а в Remediation — «5–10»; числа у шпаргалці OWASP стоять із e.g.. Значення беруть із вимог продукту. Лічильник привʼязується до акаунта, а не до IP-адреси, діє наскрізно по сесіях і збільшується й від невірної відповіді на контрольне питання. І головне: у блокування є зустрічний — атакувальник вашим же захистом закриває акаунти, знаючи лише логіни. Звідси розвʼязання: заблокованому дати ввійти через відновлення пароля, не блокувати акаунт самою формою відновлення, посилання розблокування робити одноразовим.

    (rate limiting) у безпековому каноні ширший за HTTP-код і накладається за кількома ключами, не лише за IP. Класична помилка: кошик на пару login:<ip>:<user> заводиться на пару, тож одна адреса вичерпує поріг проти необмеженої кількості логінів — рівно та атака, яку ліміт мав спинити. Відповідь на вичерпаний ліміт канон безпеки описує інакше, ніж звикли в API-тестах: загальний 429 Too Many Requests і жодних значень Retry-After, точних настільки, щоб планувати за ними повтори. Специфікації це не суперечить — заголовок там лише MAY, — але наслідок прямий: автотест, який чекає точного Retry-After від форми логіну, перевіряє поведінку, якої канон вимагає не мати.

    має три канонічні вердикти, кожен під свою модель : проти password spraying її пропонують як альтернативу блокуванню; проти автоматизованих спроб входу вона — , а не запобіжник, і блокування не заміняє; проти відмови в обслуговуванні головоломки не допомагають взагалі. Сусідні шари — й (tarpitting); для AQA це видно прямо: заповнене автоматизацією honeypot-поле ламає автотест, а тарпітинг виглядає як .

    перевищено

    у межах

    так

    ні

    успіх

    невдача

    так

    ні

    Спроба входу

    Рейт-ліміт

    Загальний 429

    Були невдачі?

    CAPTCHA

    Перевірка пароля

    Другий фактор

    Лічильник на акаунті

    Поріг досягнуто?

    Блокування

    Однакова відповідь

    перевищено

    у межах

    так

    ні

    успіх

    невдача

    так

    ні

    Спроба входу

    Рейт-ліміт

    Загальний 429

    Були невдачі?

    CAPTCHA

    Перевірка пароля

    Другий фактор

    Лічильник на акаунті

    Поріг досягнуто?

    Блокування

    Однакова відповідь

    Відновлення пароля: найтихіший вектор

    Відновлення пароля (forgot password) — альтернативний спосіб автентифікації, тож воно не має бути слабшим за звичайний вхід.

    Форма запиту: однакове повідомлення для наявного й відсутнього акаунта — і однаковий час; не міняти стан акаунта, доки не подано валідний токен; мати ліміт на акаунт або CAPTCHA, інакше скриньку жертви заливають запитами. Токен: криптостійкий, достатньо довгий, привʼязаний до користувача, інвалідований після використання; URL не будують із заголовка Host (це Host Header Injection), а сторінка скидання ставить Referrer-Policy: no-referrer, щоб токен не витікав. Після зміни: надіслати листа, не надсилаючи пароля; не логінити автоматично; і найчастіше пропущене — інвалідувати наявні сесії, інакше пароль змінено, а стара сесія атакувальника жива.

    Контрольні питання. Канон каже «ні»: за NIST SP 800-63 вони вже не є прийнятним фактором, стандарт забороняє пропонувати їх при виборі пароля (SHALL NOT), і єдиним механізмом скидання бути не можуть. Шпаргалка OWASP позначає власний статус прямо: прийнятних застосувань у безпечному ПЗ немає, поради дано для легасі — відповіді зберігають як паролі, а питання з банку не міняють, поки користувач не відповість правильно.

    Відновлення доступу до MFA — той самий клас ризику: механізм потрібен, але не має ставати способом обійти MFA. А «запамʼятати мене» цю главу переростає: це Сесії та токени.

    Типові помилки

    • «Блокування після N невдач працює — перебір закрито» → виглядає як покритий ризик, а насправді password spraying дає одну спробу на акаунт, а credential stuffing не вгадує.
    • «Пароль мусить мати велику літеру, цифру й символ» → виглядає як безпекова вимога, а насправді NIST ставить тут SHALL NOT: вирішує режим відповідності.
    • «Пароль плюс контрольне питання — це 2FA» → виглядає як MFA, а фактори однотипні.
    • «Повідомлення однакове — перелічування немає» → виглядає як закрита перевірка, а насправді збігтися мусять і код, і довжина, і час.
    • «Пароль скинуто — акаунт у безпеці» → виглядає як завершений інцидент, а насправді старі сесії могли лишитися живими.

    Підсумок

    • Три атаки різняться тим, що множиться — детектор однієї не бачить інших.
    • Пароль перевіряють як вимоги з модальностями, а не як «складність»; де канони розходяться, вирішує режим відповідності.
    • MFA — про тип фактора, а не про кількість полів; найтонше місце — скидання й зміна фактора.
    • Однакова відповідь має чотири виміри: текст, код, довжина, час.
    • У кожного контролю є зустрічний ризик: блокування стає відмовою в обслуговуванні, а ліміт із хибним ключем пропускає ту саму атаку.

    Можливі питання

    • «Чим credential stuffing відрізняється від брутфорсу?» — брутфорс вгадує, а credential stuffing знає готові пари, тому спроб на акаунт мало й поріг блокування не спрацьовує.
    • «Скільки невдалих спроб до блокування?» — пастка на число: норми немає, є три параметри й вимоги продукту.
    • «Як перевірити перелічування акаунтів?» — пара «неіснуючий проти наявного» і чотири виміри порівняння.
    • «Що не так із вимогою міняти пароль щокварталу?» — обидві половини вимоги NIST плюс застереження про режими відповідності.
    • «Ми додали CAPTCHA. Достатньо?» — альтернатива блокуванню, глибина захисту, непридатність проти DoS.

    Джерела

    Збої автентифікації як категорія ризику

    Три атаки на пароль, які плутають

    Пароль: вимоги до нього і до його зберігання

    Другий фактор: MFA й одноразові коди

    Перелічування акаунтів: чотири виміри однакової відповіді

    Блокування, рейт-ліміт і CAPTCHA

    Відновлення пароля: найтихіший вектор

    Пояснення

    «Поясни» працює з власним API-ключем Anthropic: запит іде з вашого браузера прямо до Anthropic.

    Свій API-ключ (BYOK)

    Вставте власний ключ Anthropic — пояснення працюватиме на реальній моделі. Ключ зберігається лише у вашому браузері (localStorage), нікуди не надсилається, крім api.anthropic.com, і не логується.