Інструменти й процес security-тестування
Зміст
Попередні глави розділу відповідали на питання «що ламається». Ця — на питання «чим і в якому порядку це шукають»: , класи сканерів, , місце безпеки в , вразливий стенд і процедура, якою знахідку віддають назовні.
Для QA це щоденна робота, а не екзотика пентестера: прочитати звіт сканера й відділити підтверджену знахідку від здогаду, знати, чого не можна вмикати без дозволу власника цілі, і мати відповідь на питання «ви знайшли вразливість у чужому сервісі — ваші дії?». Глава — канонічний виклад теми на сайті: інші глави посилаються сюди по інструменти й процес.
Каркас: хто дає критерій, а хто процедуру
(Web Security Testing Guide) сам про себе каже, що він повний каркас тестування, а не простий чекліст: нові вразливості зʼявляються постійно, тож вичерпного переліку «що перевіряти» не буде ні в кого. Означення тестування в ньому коротке — порівняння стану системи з набором критеріїв. Звідси вада фрази «пройшли по WSTG» як : гайд дає процедуру, а критерії має дати щось інше.
Це «щось інше» — (Application Security Verification Standard), і ролі розподіляє сам стандарт: питання розробника «як це реалізувати» закриває Cheat Sheet Series, питання верифікатора «як це протестувати» — WSTG. Тобто ASVS дає критерій, WSTG — процедуру. Форма вимоги ASVS збігається з тим, як QA працює з : вимога перевірна, а перевірка закінчується вердиктом pass або fail; стандарт містить лише вимоги (must) і не містить рекомендацій (should), тож «частково виконали» станом вимоги не є. Рівнів три — L1, L2, L3, — і рівень призначає не стандарт, а організація зі свого профілю . Ідентифікатори в обох документах пишуть із версією (WSTG-<version>-<category>-<number>, v<version>-<chapter>.<section>.<requirement>): між редакціями вони змінюються. І окремо, бо це часом продають: OWASP нікого не сертифікує.
Обʼєкт перевірки ширший за код: тестують людей, процес і технологію, а активності розкладені по фазах життєвого циклу — причому дизайн гайд називає одним із найощадніших місць для знахідки. Технік чотири (ручні й рев'ю, моделювання , рев'ю коду, пентест), і жодна не самодостатня: саме по собі не є доброю мірою захищеності, бо способів зламати застосунок нескінченно багато.
Процесну рамку з іншого боку дає ISTQB: тестування безпеки — діяльність життєвого циклу, процес узгоджують із процесом розробки, він не обовʼязково послідовний, а завершеність міряють проти критеріїв виходу й приймання. Пентест канон означує як динамічне тестування безпеки без заподіяння шкоди, з імітацією — запамʼятайте формулювання: це означення виду, і далі поруч із ним стане операційне застереження про активне сканування конкретним інструментом (глава 1).
Перехоплювальний проксі: чому починають з нього
Перший інструмент — не сканер, а перехоплювальний проксі: він показує справжні запити й відповіді, тоді як сканер дає лише перший прохід по очевидному.
(Zed Attack Proxy) — безкоштовний інструмент пентесту з відкритим кодом. У своїй основі це «manipulator-in-the-middle proxy»: стоїть між браузером тестувальника й застосунком, перехоплює й інспектує повідомлення, за потреби змінює вміст і пересилає далі. WSTG називає адресата прямо: інструмент ідеальний для розробників і функціональних тестувальників, які тільки починають із пентестом.
Головний розріз усередині — два режими, і різниця не технічна, а правова:
- перевіряє те, що крізь проксі вже пройшло; воно жодним чином не змінює відповіді й вважається безпечним. Технічно це окремий додаток, який сканує повідомлення (HTTP, WebSocket), пропущені крізь ZAP або надіслані ним.
- Активне сканування застосовує відомі проти обраних цілей. Це справжня атака, яка може наражати цілі на ризик, тож до цілей без дозволу її не застосовують.
Базовий режим роботи — пройти застосунок браузером крізь проксі: ZAP будує дерево сторінок, записує запити й відповіді й піднімає alert-и. Чому автоматичного проходу мало, сказано прямо: сторінки за формою входу пасивним скануванням не виявляються, поки не налаштовано автентифікацію. Дока має власну мапу функціональності ZAP на (редакції 2021) і результати прогонів проти відомих вразливих застосунків — інструмента перевірне, а не декларативне. Другий режим — план, що виконується без інтерфейсу й віддає код виходу; що з ним роблять у пайплайні — глава 15.
Означення й застереження — про різне, і плутати їх не треба. Канон означує пентест як перевірку «без заподіяння шкоди», і це формулювання лишається чинним. Дока ZAP говорить не про метод, а про окрему процедуру свого інструмента: активне сканування поводиться як справжня атака, і функціональності сайту, даним тощо може бути завдано реальної шкоди. Тобто попередження описує ризик конкретного прогону, а не властивість пентесту як виду. Наслідок для роботи, а не для означення: активний скан вмикають лише там, де на це є дозвіл власника цілі.
Burp Suite: воркфлоу навколо одного запиту
— набір під ручне й автоматизоване тестування, а не сканер. Правило, яке в його доці стоїть до опису функцій: інструмент містить функціональність, яка може пошкодити цільові системи, бо перевірка на дефекти безпеки за жанром означає взаємодію з ціллю нестандартними способами. Умов чотири: прочитати документацію, зробити резервну копію цілі, мати авторизацію власника системи і прийнятий вами й власником ризик пошкодження; сам проксі до продакшну не підпускають, доки інструмент не вивчено. Це та сама рамка, що й у ZAP: не заперечення означення «без заподіяння шкоди», а умови запуску конкретної процедури. Разом виходить одне правило: пасивний прохід завжди, активна атака — тільки на своєму стенді, тільки з авторизацією власника, з резервною копією цілі й із прийнятим обома сторонами ризиком.
- Proxy — вебпроксі між браузером і застосунком: перехоплює, інспектує й змінює трафік в обидва боки, зокрема HTTPS. Вхідна точка, з якої запити передають в інші інструменти набору.
- Repeater — «змінити й надіслати той самий запит ще раз»: різні значення параметра, послідовність запитів у багатокроковому процесі й ручна перевірка того, що повідомив сканер. Правки лишаються в історії вкладки.
- Intruder — та сама механіка автоматично: той самий запит багато разів із підстановкою різних пейлоадів у заздалегідь визначені позиції.
- Site map — накопичувач того, що зібрано, поки ви ходили застосунком. Дві дрібниці вирішують: сірий підпис означає, що адресу знайдено, але не запитано (це не покриття), а запити показані разом із методом, тож той самий із
GETі зPUT— два різні рядки. Саме там і живуть діри в контролі доступу (глава 3).
Найкорисніше для — дві незалежні шкали знахідки: серйозність (high, medium, low, informational) і впевненість (certain, firm, tentative). Ненадійна за побудовою техніка виявлення — наприклад, для сліпої — знижує саме впевненість, а не серйозність. Оцінки дока називає індикативними й вимагає переглядати їх зі знанням функціональності та бізнес-контексту; штатний спосіб перевірити — надіслати запит у Repeater.
(fuzzing) — та сама механіка як самостійна техніка: автоматична подача несподіваного, спотвореного або напівспотвореного вводу. Фазер має дві частини — генератор даних і засоби налагодження, — тож половина роботи це спостереження за наслідком. Вектори будують або списками «відомо небезпечних значень» під тип (нуль, відʼємні й дуже великі числа; екрановані послідовності для рядків), або зі специфікації — заборонені й зарезервовані значення, звʼязані параметри, розміри полів. У вебі фазять URL, форми, контент від користувача й RPC-запити; межі названі там же — фазери тяжіють до простих дефектів, і чим краще фазер знає протокол, тим менше дивних помилок знайде.
SAST, DAST і сусіди: це класи перевірок, а не класи продуктів
Найважливіше застереження стоїть на обох профільних сторінках OWASP однаково: інструмент потрапляє в перелік, якщо він має відповідні можливості, а один продукт може підтримувати кілька типів перевірок. Питання «це SAST- чи DAST-інструмент» поставлене неправильно: клас описує перевірку, а не продукт.
(Static Application Security Testing) означений через ототожнення: інструменти аналізу вихідного коду, вони ж SAST-інструменти, аналізують вихідний або зібраний код. Їх додають в IDE, клас добре масштабується (нічні збірки, безперервна інтеграція) і дає адресний вивід — файл, рядок, іноді фрагмент коду. Межі, названі тим самим джерелом, для QA цінніші за переваги: автентифікація, контроль доступу й криптографія автоматизуються погано; інструменти виявляють лише відносно малий відсоток дефектів; багато хибнопозитивних; конфігураційних проблем вони не бачать, бо тих немає в коді; довести, що знахідка є реальною , важко.
(Dynamic Application Security Testing) — сканери вразливостей вебзастосунків: автоматичні інструменти, що сканують застосунок зазвичай ззовні, шукаючи XSS, SQL-, , і небезпечну конфігурацію сервера. Понад це джерело каже лише, що інструментів багато й у кожного свої сильні та слабкі сторони, — без розшифровки, і додумувати її ми не будемо. IAST фігурує лише як назва ще одного класу в переліку кроків пайплайна: означення йому канон не дає, тож і ми не даємо. (Software Composition Analysis) — про склад залежностей, тема глави 13. Самі переліки OWASP подані за абеткою, жодного вендора OWASP не рекомендує, а чужі порівняльні проєкти від себе відмежовує.
Далі — межі класу як такого, яких не знімає жоден вибір інструмента:
- Інструменти не роблять софт захищеним — вони допомагають масштабувати процес і дотримувати політику.
- Софт оцінювання безпеки корисний як перший прохід по очевидному і загалом незрілий для глибокого оцінювання: безпека є процесом, а не продуктом.
- Звіти двох інструментів не взаємозамінні: тести не стандартизовані — різні дані, різні реалізації, різні тлумачення, тож розбіжність двох сканерів не є дефектом жодного з них.
- Частина дефектів без доступу до коду не знаходиться взагалі — це сказано про path traversal і сильніше за звичне «сканер бачить лише очевидне».
- Оцінка ризиків тестом не є: це аналіз сприйнятої критичності, а не перевірка.
І межа, що відділяє безпечну частину роботи від небезпечної: оцінювання (assessment) — виявлення вразливостей без спроби їх проексплуатувати, тестування — виявлення зі спробою експлуатації. Універсальної термінології тут немає — джерело каже це саме, — але наслідок однозначний: усе, що пробує експлуатувати, потребує дозволу на ціль.
Моделювання загроз: чотири питання і STRIDE
Моделювання загроз (threat modeling) — структурований, повторюваний процес: модель системи з погляду безпеки, ідентифікація застосовних загроз і визначення відповідей на них. Погляд тут чужий — систему аналізують з позиції супротивника; WSTG називає це оцінкою ризиків для застосунків.
Каркас — чотири питання з Threat Modeling Manifesto: над чим ми працюємо? що може піти не так? що ми з цим зробимо? чи достатньо добре ми це зробили? Шпаргалка OWASP розкладає їх у кроки — декомпозиція, ідентифікація й ранжування загроз, помʼякшення, рев'ю й валідація — і одразу знімає ілюзію єдиного припису: галузевого стандарту процесу не існує.
На першому кроці найпоширеніший підхід — діаграми потоків даних (DFD); модель має ясно показувати межі довіри, потоки даних, сховища даних, процеси й зовнішні сутності, бо саме вони й представляють можливі точки атаки. На другому працює — мнемоніка, первісно розроблена працівниками Microsoft, і її призначення автори формулюють буквально: згрупувати загрози в категорії, щоб ставити точні питання.
| Категорія | Питання до фічі | Властивість, яку вона порушує |
|---|---|---|
| Spoofing identity | чи можна видати себе за іншого користувача | автентифікація |
| Tampering with data | чи можна змінити збережені дані або дані в дорозі | цілісність |
| Repudiation | чи можна зробити дію так, щоб її не можна було довести | облік дій / незаперечність |
| Information disclosure | чи можна прочитати те, до чого немає доступу | конфіденційність |
| Denial of service | чи можна позбавити сервісу валідних користувачів | доступність |
| Elevation of privilege | чи може непривілейований користувач дістати привілеї | авторизація |
Третій рядок навмисно подвійний: дві сторінки OWASP зіставляють Repudiation із різними речами — шпаргалка Threat Modeling з обліком дій (Accounting), процесний виклад із (Non-Repudiation). Обидва канонічні, і зводити їх в одне ми не будемо.
STRIDE не обовʼязковий: відповідь на «що може піти не так» буває як простим брейнштормом, так і структурованою — STRIDE, kill chains (для операційного моделювання називають MITRE ATT&CK) або дерева атак. Відповідей на загрозу чотири: помʼякшити, усунути, перенести, прийняти, — і вимога до формулювання зроблена під перевірку: помʼякшення мають бути придатними до дії, а не гіпотетичними. Звідти ж означення, варте уваги: вразливості — це ті загрози, що не мають контрзаходів.
Останній крок — місце QA, і воно записане формально: модель рецензують усі стейкхолдери, а перевірочні питання сформульовані як тестові — чи можна протестувати узгоджені помʼякшення? чи можна виміряти успіх або невдачу вимог із моделі? Перезапускають модель за подіями: моделювання найкраще застосовувати безперервно, тригери — нова фіча, інцидент безпеки, зміни архітектури чи інфраструктури.
Ще одна розбіжність, яку глава подає як вибір. Шпаргалка каже, що в теорії ранжування має спиратися на добуток імовірності загрози та її впливу. Процесний виклад того самого OWASP радить протилежне — якісні значення замість числових, щоб оцінка не ставала надто субʼєктивною. Обидва — OWASP; яку рамку брати, вирішує команда. І застереження про саме джерело: найдетальніший опис кроків OWASP позначає історичним — сторінка має заголовок «Threat Modeling Process (Historical)». Текст повний, але читати його треба як історичний виклад.
Поверхня атаки: мапа того, що взагалі треба перевіряти
(attack surface) — усі точки, якими атакувальник міг би потрапити в систему і якими міг би винести дані назовні; ширше означення включає й самі цінні дані — секрети й ключі, критичні бізнес-дані, персональні дані. Сенс аналізу практичний: зрозуміти, які частини системи треба переглянути й протестувати, і помітити, коли поверхня змінилася.
Перелік, за яким її мапують, готовий: форми й поля UI, HTTP-заголовки й cookie, API, файли, бази даних, інші локальні сховища, пошта й інші повідомлення, аргументи запуску. Поверх моделі накладають ролі, а фокус тримають на двох крайностях — анонім і високопривілейований адміністратор; пріоритет мають віддалені точки входу. Точки виходу — не симетрична дрібниця: разом зі входами вони задають межу довіри, і саме вихід потрібен, щоб атака завершилася — і XSS, і розкриття інформації його вимагають.
Поверхня росте сама й від дрібниць: кілька розгорнутих версій, залишені фічі, старі резервні копії й невикористовуваний код; бекапи джерело окремо називає важливою, але часто ігнорованою частиною. Тригер рев'ю названо прямо: зміни в керуванні сесіями, автентифікації та керуванні паролями — тобто реліз, який «лише додає фічу», може змінити перевірок. Окремо про пайплайн: CI/CD збільшує поверхню атаки організації, і вектором названо не саму технологію — люди, процеси й технологія потрібні для пайплайна, і всі троє можуть стати шляхом атаки.
DevSecOps: безпека як кроки наявного пайплайна
Гайдлайн OWASP описує не як окремий процес поруч із розробкою, а як додані кроки до наявного пайплайна. Мета сформульована як швидкість — виявити проблеми безпеки якомога швидше, — і категорію названо двома половинами: дефект дизайну і вразливість застосунку. Той самий документ прямо називає своєю метою культуру shift-left (глава 1).
Дві речі тут важать для QA. Перша: моделювання загроз стоїть нульовим кроком, до коду. Друга: перший технічний крок базового пайплайна — сканування git-репозиторіїв на витік креденшелів, тобто теж до збірки (гігієна секретів у CI — розділ про Git і CI). Вибір інструментів і місце для них гайдлайн лишає команді, а про що радить не забути — центральне місце, де знахідки зводяться в одну картину.
Другий бік теми той самий документ не покриває: кроки безпеки в пайплайні не роблять пайплайн безпечним. Окрема шпаргалка ставить це руба — пайплайни посідають важливе місце в сучасному циклі розробки й саме тому є привабливою ціллю, а ціна компрометації висока за побудовою: кроки часто виконуються високопривілейованими ідентичностями, тож атака має високий потенціал шкоди (названо Codecov і SolarWinds). Наслідки, які видно тестувальнику: дефолти вендора безпечними не є, перед продакшн- потрібні ручний апрув і рев'ю, а алерти ніколи не будуть точними на 100 %.
Зрілість процесу гайдлайн виносить в окремий документ: «які кроки додати» і «наскільки зрілий наш процес» — різні питання. (Software Assurance Maturity Model) — відкритий фреймворк, що допомагає організації сформулювати й реалізувати стратегію безпеки ПЗ під її конкретні ризики; місія — дати дієвий і вимірний спосіб покращувати цикл безпечної розробки. Модель не залежить від технології й процесу, вона ризик-орієнтована, і єдиного рецепта для всіх у ній немає; програму будують чіткими ітераціями, а покращення треба вміти показати. Чинна версія на дату забору джерела (2026-08-02) — 2.0.3 (2022). Практичний висновок: заява «ми впровадили SAMM» сама по собі не означає нічого.
Вразливі стенди: Juice Shop і DVWA
Активна атака дозволена лише проти цілі, на тестування якої є дозвіл, — і саме цю роль виконує навмисно вразливий стенд, піднятий у себе.
для непідозрілого користувача виглядає як невеликий онлайн-магазин соків. Усередині — завдання різної складності, де треба проексплуатувати закладені вразливості; станом на 2026-08-02 сторінка проєкту називає 113 завдань і сама ж каже, що перелік зростає. Вразливості закладені навмисно, але в спосіб, який справді трапляється в реальній веброзробці, а прогрес рахує сам застосунок — аж до Score Board, знайти який і є одним із найлегших завдань.
Дві властивості визначають спосіб роботи. Один інстанс — один користувач: це технічно необхідно, щоб працювало самовідновлення й щоб прогрес кількох атакувальників не перемішався. Самовідновлення стирає стан: під атакою автоматизованого інструмента сервер може впасти, і тому застосунок стирає всю базу даних і теку, яку могли змінити під час зламу, — на старті сервера. Наслідок практичний: , запити й HAR збирають одразу. І окремий заявлений сценарій: сканери й інструменти пентесту запрошують використовувати Juice Shop як піддослідного — читати це варто разом із попереднім реченням, бо агресивний прогін кладе стенд штатно, і це не знахідка. Завдання розкладені за класами з чинних каталогів (OWASP Top 10, ASVS, та інших), і сама мапа вичерпності не заявляє.
(Damn Vulnerable Web Application) — вебзастосунок на PHP/MariaDB, який «damn vulnerable» за задумом. Мета потрійна: дати фахівцям із безпеки перевіряти навички й інструменти в легальному середовищі, допомогти розробникам зрозуміти процеси захисту застосунків і навчати в контрольованому середовищі. Тренують найпоширеніші вебвразливості з різними рівнями складності; рівень задають конфігурацією ще на старті, причому більшість налаштувань — змінними оточення.
Правило запуску тут найсуворіше з усіх: не завантажуйте його в публічну теку хостинг-провайдера чи на сервери, доступні з інтернету, — їх скомпрометують; рекомендований спосіб — віртуальна машина в режимі NAT, і підтримується лише остання збірка з офіційного репозиторію. Частину вразливостей навмисно не задокументовано — знайти їх самому і є вправою, тож знайдене в стенді його дефектом не є. Є й окремий режим під інструменти: опція вимкнути перевірку автентифікації, бо частина сканерів із логіном не працює; admin / password автор коментує сам — їх легко перебрати. SQL-інʼєкції ганяють або проти MariaDB/MySQL, або проти 3: завдання ті самі, змінюється лише бекенд (глава 5).
Випадок, вартий згадки, README фіксує сам: у 2023 році хтось попросив на одну з вразливостей DVWA — і отримав CVE-2023-39848. Наявність номера не означає, що знахідка є дефектом у своєму контексті: тут вразливість була змістом навчального стенда.
Прогін інструмента як перевірка на виявлення
A09:2025 Security Logging and Alerting Failures дає найпряміший тест у розділі: прогін DAST-інструмента (Burp, ZAP) або пентест не породжує жодних сповіщень — це і є дефект категорії. Ваш власний скан заодно перевіряє, чи система взагалі бачить атаку.
Ознаки перевіряються парою кейсів: події, що підлягають аудиту, не логуються або логуються непослідовно (класика — успішні входи пишуться, невдалі ні); цілісність логів не захищена від підміни; у лог пишуться персональні дані; некоректно закодовані дані в лозі відкривають інʼєкцію в самі системи логування. Категорію OWASP називає неймовірно важкою для тестування з мінімальним представленням у даних CVE — чекати тут на сканер марно. Лог і сам є ціллю саме тому, що він засіб захисту: атаки на нього поділено на конфіденційність, доступність (заливання логів вичерпує диск) і підзвітність (запис хибної ідентичності приховує відповідального). Помʼякшення інʼєкції перевірне: дані події санітизують перед записом — зокрема CR, LF і символи-розділювачі. Розкриття даних як тема — глава 10.
Відповідальне розкриття, bug bounty і security.txt
Розкриття вразливості — двосторонній процес, і шпаргалка OWASP пише його одразу для дослідників і для організацій: співпраця тут критично важлива, але часто закінчується конфліктом.
Обовʼязки того, хто знайшов: переконатися, що тестування легальне й дозволене; докласти розумних зусиль, щоб звʼязатися з командою безпеки; дати достатньо деталей, щоб вразливість можна було перевірити й відтворити; не вимагати оплати чи винагород поза наявною програмою. Обовʼязки організації: дати зрозумілий спосіб безпечно повідомити; чітко визначити scope і правила програми; відповідати в розумний строк; не погрожувати судом; запитувати CVE, коли доречно; публікувати зрозумілі advisory й changelog.
Моделей розкриття три. Приватна — звіт іде приватно, а рішення про публікацію належить організації, не досліднику; більшість програм винагород вимагають саме її. Повна — деталі (іноді разом з експлойтом) публікуються одразу, часто до появи патча; це крайній засіб. Відповідальна (координована) — початковий звіт приватний, повні деталі виходять після появи патча. Рухає її дедлайн: якщо його не дотримано, дослідник може перейти до ; приклад із фіксованим строком — Project Zero публікує деталі через 90 днів незалежно від наявності патча.
Юридична межа вужча, ніж здається: діє лише в межах scope і правил програми, а вихід за них може бути кримінальним злочином. Вимога оплати як умови надання інформації або як плати за непублікацію може становити вимагання.
— програма, що мотивує дослідників знаходити й повідомляти вразливості винагородами; зазвичай є стороння платформа. Порядок обовʼязковий: її варто запускати лише організаціям, які вже мають зрілий процес розкриття, бо ціна це не лише виплати — потрібні люди, здатні кваліфіковано тріажити звіти, і готовність до великої кількості сміття й хибних спрацювань. Найважливіший крок, за джерелом, узагалі не програма, а сам канал звʼязку. Мінімальний склад advisory теж заданий: резюме з впливом, перелік вразливих версій, перелік версій із патчем і CVE.
Машинний бік каналу — (RFC 9116): текстовий файл у відомому місці, що машинно розбирається й описує практики розкриття. Нормативні вимоги перевіряються за пʼять хвилин:
- файл MUST лежати під
/.well-known/; копія в корені допускається лише для сумісності, і за наявності обох виграє/.well-known/; - доступ MUST бути по схемі
https, тип вмісту —text/plainізcharset=utf-8; - поле
ContactMUST бути присутнім завжди, а значення SHOULD стояти в порядку переваги; - поле
ExpiresMUST бути й MUST NOT повторюватися; RECOMMENDED, щоб дата була менше ніж на рік уперед; - область дії — рівно домен або IP з URI, за яким файл узято, без піддоменів і батьківських доменів.
import { test, expect } from '@playwright/test';
test('security.txt віддається за контрактом RFC 9116', async ({ request }) => {
const res = await request.get(`${process.env.BASE_URL}/.well-known/security.txt`);
expect(res.status()).toBe(200);
expect(res.headers()['content-type']).toContain('text/plain');
const body = await res.text();
expect(body).toMatch(/^Contact:/m);
const expires = body.match(/^Expires:\s*(.+)$/m)?.[1] ?? '';
expect(new Date(expires).getTime()).toBeGreaterThan(Date.now());
});
Трьох речей файл не робить. Він не дає дозволу на тестування: з наявності або відсутності security.txt не можна виснувати ані дозвіл, ані заборону. Він не рятує від захопленого сайту: атакувальник, який зламав сайт, здатен підмінити й цей файл або поставити редирект на себе. І протухлий файл гірший за відсутній — RFC формулює це буквально.
Типові помилки
- Виглядає як «сканер зелений — застосунок чистий», а насправді інструменти виявляють лише малий відсоток дефектів, а автентифікація, контроль доступу й криптографія автоматизуються погано.
- Виглядає як «пентест шкоди не завдає — так у визначенні, отже вмикаю активний скан», а насправді означення описує вид робіт, а не конкретну процедуру: ZAP і Burp попереджають, що їхнє активне сканування є справжньою атакою й реальна шкода можлива, тому потрібні авторизація власника, резервна копія й прийнятий ризик.
- Виглядає як «знахідка з низькою впевненістю — дрібниця», а насправді впевненість і серйозність — дві незалежні шкали: низька впевненість означає ненадійну техніку виявлення, а не низьку критичність.
- Виглядає як «пройшли весь WSTG — можна релізити», а насправді гайд сам відмовляється бути чеклістом, а критерії дає стандарт вимог.
- Виглядає як «мапа сайту заповнена — покриття є», а насправді сірий підпис означає, що адресу лише знайдено, а той самий шлях з іншим методом — окремий рядок.
- Виглядає як «два сканери показують різне — один бреше», а насправді тести не стандартизовані: різні дані, різні реалізації, різні тлумачення.
- Виглядає як «стенд упав під сканером — знайшли DoS», а насправді у Juice Shop це штатна властивість, і самовідновлення стирає базу на старті разом із вашими доказами.
- Виглядає як «є
security.txt— тестувати можна», а насправді дозвіл дає політика розкриття, а не наявність файла. - Виглядає як «прогін нічого не зламав — і добре», а насправді відсутність будь-якого сповіщення на ваш прогін і є дефектом категорії A09.
Підсумок
- ASVS дає критерій, WSTG — процедуру. Перевірка без критерію не має проти чого виносити вердикт, а «пройшли по гайду» критерієм виходу не є.
- Проксі перед сканером. Пасивний прохід безпечний завжди; активна атака — лише на ціль із дозволом, і за каноном ISTQB, і за прямою вимогою доки ZAP та Burp.
- Клас перевірки — не клас продукту. SAST, DAST і сусіди описують типи перевірок; зелений прогін не закриває автентифікацію, контроль доступу й конфігурацію.
- Моделювання загроз — це чотири питання, а STRIDE — шість готових питань до фічі. Місце QA записане формально: помʼякшення мусить бути перевірним, а модель рецензують усі стейкхолдери.
- Безпека в пайплайні — це кроки, а не окремий процес, і нульовий крок стоїть до коду. Сам пайплайн при цьому є ціллю: високі привілеї роблять його компрометацію дорогою.
- Знахідка в чужій системі — процес, а не тікет: легальність, канал звʼязку, відтворюваний звіт, дедлайн і scope, за межами якого safe harbor не діє.
Можливі питання
- Чим ZAP і Burp відрізняються від сканера вразливостей? Перевіряють розуміння класу: це перехоплювальний проксі, який показує справжній трафік, а сканування — лише один із його режимів. Сильна відповідь розводить пасивний і активний прохід за ризиком і потребою дозволу.
- Що таке SAST і DAST і чи можна обійтися одним? Чекають механізм, а не абревіатури: аналіз коду проти сканування запущеного застосунку ззовні — плюс межі SAST (контроль доступу, автентифікація, конфігурація).
- Розкажіть про STRIDE. Дивляться, чи назве кандидат шість категорій і чи перетворить їх на питання до конкретної фічі. Бонус — знання, що мнемоніка ризик не міряє.
- Що таке поверхня атаки й коли вона змінюється? Очікують перелік точок входу й виходу і вміння назвати тригери: нові інтерфейси, зміни в автентифікації та сесіях, залишені фічі й бекапи.
- Ви знайшли вразливість у чужому сервісі. Ваші дії? Найпоказовіше питання глави: приватний звіт із відтворенням, пошук каналу (зокрема
/.well-known/security.txt), відсутність вимог оплати й розуміння, що scope програми — межа законності. - Чому «сканер нічого не знайшов» не є критерієм готовності до релізу? Дивляться, чи назве кандидат три речі: малий відсоток покриття, хибнопозитивні й хибнонегативні результати та класи дефектів, які взагалі не автоматизуються.
Джерела
Каркас: хто дає критерій, а хто процедуру
- OWASP Web Security Testing Guide v4.2 (PDF, 465 стор.) — каркас, а не чекліст; тестування як порівняння з критеріями; люди, процес і технологія; фази й найдешевша знахідка на дизайні; ідентифікатор із версією.
- OWASP ASVS 5.0.0 — What is the ASVS? — вердикт pass/fail, лише must, три рівні й хто їх призначає, розподіл ролей із WSTG.
- OWASP ASVS 5.0.0 — Assessment and Certification — OWASP нікого не сертифікує.
- ISTQB Glossary — тестування безпеки й пентест «без заподіяння шкоди».
- ISTQB® Certified Tester Foundation Level Syllabus v4.0.1 — безпека як , а не окремий тип тестування.
- ISTQB Certified Tester Advanced Level Syllabus — Security Tester v1.0 (2016) — життєвий цикл, узгодження з процесом розробки, критерій завершеності.
Перехоплювальний проксі: чому починають з нього
- ZAP – Getting Started — ZAP як manipulator-in-the-middle proxy, пасивне проти активного, дозвіл на ціль і попередження про реальну шкоду, сліпа зона за формою входу.
- OWASP Web Security Testing Guide v4.2 (PDF, 465 стор.) — ZAP як інструмент для тих, хто починає з пентесту.
- OWASP ZAP — Passive Scan — пасивна перевірка як окремий додаток; матеріал — HTTP і WebSocket крізь ZAP.
- OWASP ZAP — Documentation — мапа на OWASP Top 10 і прогони проти вразливих застосунків.
- OWASP ZAP — Automation Framework — план без інтерфейсу й коди виходу.
Burp Suite: воркфлоу навколо одного запиту
- Burp Suite — documentation: desktop editions — набір під ручне й автоматизоване тестування; попередження про шкоду цілям і вимоги авторизації, бекапу та прийнятого ризику.
- Burp Suite — Burp Proxy — означення проксі, роль вхідної точки, заборона на продакшн до вивчення інструмента.
- Burp Suite — Burp Repeater — три сценарії повторного надсилання, зокрема ручна перевірка знахідки сканера.
- Burp Suite — Burp Intruder — підстановка пейлоадів у визначені позиції запиту.
- Burp Suite — Target / Site map — , запитане проти лише виявленого, метод поруч із запитом, дві шкали знахідки.
- OWASP www-community — Fuzzing — означення фазингу, будова фазера, два способи будувати вхід, межі техніки.
SAST, DAST і сусіди: це класи перевірок, а не класи продуктів
- OWASP www-community — Source Code Analysis Tools — означення SAST, запуск в IDE, сильні сторони й межі, перекриття класів, перелік не є рекомендацією.
- OWASP www-community — Vulnerability Scanning Tools — означення сканера вебзастосунків і його ототожнення з DAST, відмежування від чужих порівнянь.
- OWASP DevSecOps Guideline — розкриття абревіатур класів перевірок пайплайна.
- OWASP DevSecOps Guideline — latest — IAST як окремий підрозділ стадії сканування поруч із SAST, DAST і SCA.
- ISTQB Certified Tester Advanced Level Syllabus — Security Tester v1.0 (2016) — дві задачі інструментів і незіставність звітів через нестандартизовані тести.
- OWASP Web Security Testing Guide v4.2 (PDF, 465 стор.) — «інструменти не роблять софт захищеним»; сканер як перший прохід по очевидному.
- ZAP – Getting Started — межа «оцінювання проти тестування» й оцінка ризиків як не-тест.
- OWASP WSTG — 4.5.1 Testing Directory Traversal File Include (WSTG-ATHZ-01) — частина дефектів класу без доступу до коду не знаходиться взагалі.
- Burp Suite — Target / Site map — дві шкали знахідки й вимога переглядати оцінки під контекст застосунку.
- Burp Suite — documentation: desktop editions — здатен пошкодити цільові системи.
Моделювання загроз: чотири питання і STRIDE
- OWASP Cheat Sheet — Threat Modeling — означення процесу, чотири питання й кроки, DFD і межі довіри, мапа STRIDE з обліком дій, ранжування як добуток імовірності на вплив, чотири відповіді на загрозу, рев'ю всіма стейкхолдерами.
- OWASP www-community — Threat Modeling Process (Historical) — статус історичного викладу, категоризація як критичний елемент, вразливість як загроза без контрзаходу, якісні значення замість числових, мапа STRIDE з незаперечністю.
- OWASP www-community — Threat Modeling — безперервність процесу й тригери перегляду; брейншторм проти STRIDE, kill chains і дерев атак.
- Microsoft — The STRIDE Threat Model — призначення мнемоніки й опис шести категорій.
- OWASP Web Security Testing Guide v4.2 (PDF, 465 стор.) — моделювання загроз як оцінка ризиків і вимога створювати модель якомога раніше.
- OWASP Cheat Sheet — Attack Surface Analysis — рекурсія: зміни поверхні запускають моделювання, а моделювання допомагає зрозуміти поверхню.
Поверхня атаки: мапа того, що взагалі треба перевіряти
- OWASP Cheat Sheet — Attack Surface Analysis — означення поверхні й цінних даних, мета аналізу, перелік точок, дві крайні ролі, зростання від залишків і бекапів, тригери перегляду.
- OWASP www-community — Threat Modeling Process (Historical) — точки входу як атаки й точки виходу для XSS і розкриття інформації.
- OWASP Cheat Sheet — Threat Modeling — межі довіри, потоки, сховища й зовнішні сутності як можливі точки атаки.
- OWASP Cheat Sheet — CI/CD Security — пайплайн як приріст поверхні; люди, процеси й технологія як вектори.
DevSecOps: безпека як кроки наявного пайплайна
- OWASP DevSecOps Guideline — предмет гайдлайну й культура shift-left, мета «виявити якомога швидше», сканування репозиторіїв на витік креденшелів, винесення зрілості в SAMM.
- OWASP DevSecOps Guideline — latest — надбудова над наявним пайплайном, порядок стадій, шість підрозділів стадії сканування, свобода вибору інструментів, центральне зведення знахідок.
- OWASP Cheat Sheet — CI/CD Security — пайплайн як ціль, високі привілеї й потенціал шкоди, Codecov і SolarWinds, дефолти вендора, ручний апрув, неточність алертів.
- OWASP SAMM — означення моделі, місія про вимірність, ризик-орієнтованість, ітеративність, чинна версія на дату забору.
Вразливі стенди: Juice Shop і DVWA
- Pwning OWASP Juice Shop — Running OWASP Juice Shop — один інстанс на одного користувача, самовідновлення зі стиранням бази на старті, падіння під агресивним прогоном.
- Pwning OWASP Juice Shop — Why OWASP Juice Shop exists — маскування під магазин, кількість завдань на дату забору, навмисні але реалістичні вразливості,
Score Board, запрошення для сканерів. - Pwning OWASP Juice Shop — Vulnerability categories — завдання за класами з чинних каталогів; мапа без заяви про вичерпність.
- digininja/DVWA — README — означення й потрійна мета, рівні складності та змінні оточення, заборона публічного розгортання й віртуалка в NAT, лише офіційна збірка, незадокументовані вразливості, режим без автентифікації, дефолтні креденшели, MariaDB проти SQLite3, випадок із CVE.
- ZAP – Getting Started — активна атака лише проти цілі, на тестування якої є дозвіл.
Прогін інструмента як перевірка на виявлення
- OWASP Top 10:2025 — A09 Security Logging and Alerting Failures — прогін DAST або пентест без сповіщень як дефект категорії, ознаки вразливості, важкість тестування й мінімальне представлення в CVE.
- OWASP Cheat Sheet — Logging — лог як ціль атаки, три атаки на нього, санітизація даних події перед записом.
Відповідальне розкриття, bug bounty і security.txt
- OWASP — Vulnerability Disclosure Cheat Sheet — двосторонність процесу, обовʼязки сторін, три моделі й дедлайн із прикладом Project Zero, safe harbor і межа вимагання, склад звіту й advisory, означення bug bounty, ціна програми, канал звʼязку як найважливіший крок.
- RFC 9116 — A File Format to Aid in Security Vulnerability Disclosure (security.txt) — призначення формату, розташування, вимоги до схеми й типу вмісту, поля
ContactіExpires, область дії, відсутність дозволу на тестування, ризик підміни, «протухлий гірший за відсутній».
Чим перехоплювальний проксі відрізняється від сканера вразливостей і чому починають саме з нього?
показує справжній трафік, сканер — лише власну здогадку про нього. Перехоплювальний проксі (intercepting proxy) стає між браузером тестувальника й застосунком: усе, що йде в обидва боки, можна прочитати, затримати, підправити й відпустити далі — саме так описує свою основу, «manipulator-in-the-middle proxy». Сканування в такому інструменті — не окремий продукт, а один із режимів, і його результат є першим зрізом по очевидному, а не картою застосунку. Практичний наслідок: перш ніж вмикати автоматику, варто просто походити продуктом крізь проксі — тоді видно реальні , заголовки й параметри, зокрема ті, яких у документації API немає. Цей же прохід дає матеріал для всього подальшого: конкретний запит з історії їде в повторне надсилання, у підстановку пейлоадів і в баг-репорт.
Пасивне і активне сканування — у чому різниця і чому вона важлива не лише технічно?
Пасивний режим лише читає, активний — б'є. Пасивна перевірка розбирає повідомлення, які крізь проксі вже пройшли, нічого у відповідях не змінює й тому вважається безпечною; технічно це окремий додаток, що обробляє HTTP- і WebSocket-повідомлення, пропущені або надіслані інструментом. Активна перевірка навпаки застосовує до обраних цілей відомі — це не «перевірка», а справжня атака, і дока ZAP прямо попереджає, що функціональності сайту й даним можлива реальна шкода. Звідси і правовий бік: пасивний прохід можна робити будь-де, куди вам дали доступ, а активний — лише проти цілі, на тестування якої є дозвіл. Ця ж лінія проходить і термінологічно: оцінювання (assessment) виявляє вразливості, не намагаючись їх задіяти, а тестування — виявляє зі спробою експлуатації, тож дозволу потребує саме друге. На співбесіді цінують саме цю межу: кандидат, який каже «я просто прогнав ZAP по стейджу клієнта», щойно розповів, що запускає атаку без мандату.
Що таке SAST і DAST, і чи вистачить у проєкті чогось одного?
(Static Application Security Testing) читає вихідний або зібраний код, (Dynamic Application Security Testing) стукає в запущений застосунок, зазвичай ззовні, як це робив би сторонній. Перший клас зручний тим, що вбудовується в IDE, добре масштабується на нічні збірки й CI і показує адресу дефекту — файл, рядок, іноді сам фрагмент. Другий шукає те, що видно по відповідях: міжсайтовий скриптинг, , , недбалу конфігурацію сервера. Обійтися одним не вийде, бо в них різний вхід: не бачить конфігураційних проблем, бо в коді їх немає, а динамічний скан працює ззовні й без доступу до коду — тоді як частину дефектів (той самий path traversal) без доступу до коду не знаходять узагалі. Сильна відповідь додає третє: обидва класи разом усе одно не закривають перевірку — вони знаходять типове й дешеве, а дороге лишається людині. Поруч у переліку кроків стоїть ще IAST, але означення йому канон не дає, тож вигадувати його не варто; — вже про склад залежностей, а не про власний код.
Чому питання «це SAST-інструмент чи DAST-інструмент» вважають поставленим неправильно?
Тому що SAST і DAST — назви типів перевірки, а не ярлики на коробках. OWASP у своїх переліках прямо каже, що інструмент туди потрапляє за наявністю відповідних можливостей, і один продукт може вміти кілька типів перевірок одразу. Тобто правильне питання звучить інакше: «яку перевірку ми зараз проганяємо і що подаємо їй на вхід — репозиторій чи піднятий застосунок». Для QA це не термінологічна педантика: коли в релізному чеклисті написано «прогнали інструмент X», незрозуміло, що саме перевірено; коли написано «статичний аналіз коду плюс динамічний скан стейджа» — зрозуміло. І деталь для контексту: у своїх переліках інструментів OWASP тримає абетковий порядок замість рейтингу, нікого з вендорів не радить і публічно відхрещується від чужих порівнянь — тобто «є в списку OWASP» рекомендацією не є.
Які межі має інструментальна перевірка і чому «зелений сканер» не є критерієм готовності релізу?
Межі названі тими самими джерелами, що й переваги, і для тестувальника вони цінніші. У статичного аналізу: автентифікація, контроль доступу й криптографія автоматизуються погано (це логіка, а не патерн у коді); інструменти виявляють відносно малий відсоток дефектів; хибнопозитивних спрацювань багато; конфігураційних проблем не видно в принципі, бо їх немає в коді; довести, що конкретна знахідка є реальною , часто важко. Понад це є межа самого класу: інструмент не робить софт захищеним — він допомагає масштабувати процес і дотримувати політику, а прогін корисний насамперед як перший прохід по очевидному. Окремий пункт, який дивує: два сканери законно дають різні звіти, бо тести в них не стандартизовані — різні дані, різні реалізації однієї перевірки, різні тлумачення; розбіжність не є дефектом жодного з них, тому й порівнювати треба прогін із прогоном того самого інструмента тієї самої версії. Звідси відповідь про реліз: зелений прогін означає «типових патернів не знайдено», а не «застосунок захищений», і бути не може.
Для чого в Burp Suite потрібні Proxy, Repeater та Intruder?
Це три ланки одного навколо одного запиту. Proxy — вхідна точка: вебпроксі між браузером і застосунком, який перехоплює, показує й дозволяє змінювати трафік в обидва боки, зокрема HTTPS; саме звідти запит передають далі. Repeater — «змінити й надіслати ще раз»: підставити інше значення параметра, пройти багатокроковий процес по кроках, вручну перевірити те, що повідомив сканер; правки лишаються в історії вкладки, тож видно, яка саме зміна дала іншу відповідь. Intruder — та сама механіка, але автоматично: один запит повторюється багато разів, а в заздалегідь позначені позиції підставляються різні пейлоади. Для QA це впізнавана логіка: Repeater — це ручний негативний кейс, Intruder — його параметризований прогін.
Мапа сайту в Burp заповнена. Чи можна вважати це покриттям?
Ні, і плутанина тут коштує дорого. — накопичувач того, що інструмент зібрав, поки ви ходили застосунком, і в ній є два різні стани: адреса, яку справді запитали, і адреса, яку лише знайшли в посиланні чи скрипті — друга підписана сірим. Сіре в мапі означає «ми знаємо, що воно існує», а не «ми це перевірили». Друга деталь так само важлива: запити показані разом із методом, тож той самий шлях, викликаний GET і PUT, — це два окремі рядки, а не один. Саме в цій різниці зазвичай і живуть дірки в контролі доступу: читання закрили, а запис на той самий ресурс забули. Тому «мапа велика» — не метрика; метрика — перелік ендпоінтів, які реально стукали, у розрізі методу й ролі.
У звіті сканера знахідка «high severity, tentative confidence». Як її читати?
Це дві незалежні осі, і плутати їх — класична помилка . Серйозність (high, medium, low, informational) каже, наскільки боляче буде, якщо це правда. Впевненість (certain, firm, tentative) каже, наскільки надійною була техніка виявлення: наприклад, для сліпої висновок робиться за непрямими ознаками, і саме тому інструмент знижує впевненість, а не серйозність. Тобто «high + tentative» читається як «якщо підтвердиться — терміново, але спершу підтвердь». Дока Burp узагалі називає свої оцінки індикативними й вимагає переглядати їх зі знанням функціональності й бізнес-контексту, бо інструмент не знає, що ваш «тестовий» ендпоінт відкритий у проді. Штатна процедура підтвердження проста: узяти той самий запит і повторити його вручну в Repeater, зафіксувавши різницю у відповідях.
Що таке фазинг і де його межа?
(fuzzing) — автоматична подача застосунку несподіваного, спотвореного або напівспотвореного вводу заради неочікуваної поведінки. Фазер складається з двох частин: генератора даних і засобів спостереження — і друга половина не менш важлива, бо знайти падіння мало, треба ще побачити й зафіксувати наслідок. Вхід будують двома способами. Перший — готові списки значень, які для конкретного уже відомі як небезпечні: для чисел це нуль, мінус і величезні значення, для рядків — екрановані послідовності. Другий спосіб бере ті самі кандидати зі специфікації: що вона забороняє, що резервує, які поля повʼязані між собою й де в них ліміти довжини. Мішені у вебі теж перелічені — адреси, форми, будь-який контент від користувача та виклики RPC. Межі названі там же і звучать парадоксально: фазери тяжіють до простих дефектів, і що краще фазер знає протокол, то менше дивних помилок він знайде, бо перестає генерувати те, що протоколом «не буває».
Що таке моделювання загроз і які чотири питання його утворюють?
(threat modeling) — структурований і повторюваний процес: побудувати модель системи з погляду безпеки, визначити застосовні до неї й вирішити, що з кожною робити. Дивляться на систему очима супротивника, а не автора. Каркас тримається на чотирьох питаннях: над чим працюємо; що тут здатне піти не так; що ми з цим робимо; і чи вийшло достатньо добре. Перше питання зазвичай закривають діаграмою потоків даних, де мають бути видні межі довіри, потоки, сховища, процеси й зовнішні сутності — саме вони і є кандидатами в точки атаки. На друге відповідають брейнштормом або структурованою технікою (, дерева атак, kill chains), а відповідей на саму загрозу є рівно чотири: помʼякшити, усунути, перенести, прийняти. Варто памʼятати, що єдиного галузевого стандарту процесу тут немає, тож «неправильної» реалізації в сенсі відхилення від припису не існує.
Розкажіть про STRIDE.
STRIDE — мнемоніка з шести категорій загроз, придумана в Microsoft, і її призначення суто прикладне: розкласти загрози по коробках, щоб питання до фічі виходили точними. Spoofing питає, чи вдасться комусь прикинутися чужим акаунтом, і б'є по автентифікації. Tampering — чи є спосіб підмінити дані, які лежать у сховищі або їдуть каналом; страждає цілісність. Repudiation перевіряє, чи можна діяти безслідно, тобто потім відхреститися від власної дії (тут канон роздвоюється: одна шпаргалка OWASP ставить у пару облік дій, інша — ). Information disclosure шукає спосіб дотягтися до чужих даних без права на них, тобто б'є по конфіденційності. Denial of service питає, чи легко відрізати нормальним користувачам доступ до сервісу. Elevation of privilege — чи здатен звичайний акаунт дорости до прав, які йому не належать; це вже про авторизацію. Ключове доповнення, яке відрізняє сильну відповідь: STRIDE не міряє , вона лише каталогізує загрози — пріоритизація йде окремим кроком.
Де в моделюванні загроз місце QA і що з нього виносять у тести?
На останньому кроці, і він описаний цілком формально: готову модель мають переглянути всі стейкхолдери, а до неї звучать по-тестувальницьки — чи піддаються перевірці узгоджені помʼякшення і чи є чим виміряти, виконано вимогу з моделі чи ні. Тобто QA приходить не «послухати архітектуру», а перевірити формулювання на придатність до перевірки: вимога «покращити валідацію» тестом не стає, вимога «сервер відхиляє запит із чужим accountId кодом 403» — стає. Саме тому канон вимагає, щоб помʼякшення були придатними до дії, а не гіпотетичними; звідти ж корисне означення — вразливості це ті загрози, які лишилися без контрзаходу. Друга частина ролі — тригери перезапуску: модель не малюють один раз, її переглядають при новій фічі, інциденті безпеки, змінах архітектури чи інфраструктури. І третя, найпрактичніша: із категорій STRIDE прямо ростуть негативні кейси, тож моделювання для тестувальника є ще й джерелом тест-дизайну.
Що таке поверхня атаки й що змушує її переглянути?
(attack surface) — усі точки, якими зловмисник міг би зайти в систему, і всі, якими міг би винести дані назовні; ширше означення додає сюди й самі цінні дані — секрети та ключі, критичні бізнес-дані, персональні дані. Мапують її за готовим переліком: форми й поля інтерфейсу, HTTP-заголовки й cookie, API, файли, бази, інші локальні сховища, пошта й повідомлення, аргументи запуску. Поверх накладають ролі, тримаючи фокус на двох крайностях — анонім і привілейований адміністратор, — а пріоритет віддають віддаленим точкам входу. Точки виходу не менш важливі: без них атака не завершується, бо і міжсайтовий скриптинг, і розкриття інформації потребують каналу назовні. Переглядати поверхню треба, коли міняється керування сесіями, автентифікація чи паролі, а росте вона непомітно: кілька розгорнутих версій, забуті фічі, старі бекапи, невикористовуваний код. Для QA це прямий вплив на : реліз, який «лише додає фічу», може змінити перелік того, що взагалі треба перевіряти.
Як влаштований пайплайн DevSecOps і що в ньому стоїть найпершим?
У гайдлайні OWASP це не паралельний процес біля розробки, а набір кроків, дописаних до пайплайна, який у команди вже є; мету формулюють через швидкість — побачити проблему якомога раніше, — а саму проблему розкладають на дві половини: дефект дизайну і вразливість застосунку. Порядок такий: нульовим кроком іде моделювання загроз, далі pre-commit (керування секретами, лінт коду), далі стадія сканування (SAST, DAST, IAST, SCA, інфраструктура, ) і аудит відповідності. Дві деталі важать для тестувальника. Перша: нульовий крок стоїть до коду, тобто найдешевша знахідка робиться на дизайні, а не в прогоні. Друга: перший технічний крок — це сканування репозиторію на витік креденшелів, теж до збірки. Вибір інструментів гайдлайн лишає команді, але радить мати одне місце, де всі знахідки зводяться в спільну картину, інакше кожен інструмент живе своїм життям.
Кроки безпеки в пайплайні є. Чи означає це, що пайплайн безпечний, і як міряють зрілість процесу?
Ні, і це три різні питання. Наявність кроків нічого не каже про сам пайплайн: він є привабливою ціллю саме тому, що посідає центральне місце в циклі розробки, а його кроки часто виконуються високопривілейованими ідентичностями — звідси високий потенціал шкоди при компрометації; як приклади наводять випадки Codecov і SolarWinds. Для тестувальника з цього випливають три конкретні речі: дефолтні налаштування вендора безпечними вважати не можна, у прод не пускають без людського апруву й рев'ю, а стовідсоткової точності від алертів чекати не варто, тож розбір шуму треба закласти в процес окремо. Варто памʼятати й системний бік: CI/CD збільшує поверхню атаки організації, і вектором тут є не сама технологія — пайплайн тримається на людях, процесах і технології, і кожна з трьох ланок може стати шляхом атаки. Питання зрілості виносять окремо, у : це відкритий фреймворк, який допомагає організації сформулювати стратегію безпеки під власні ризики, він не привʼязаний до технології й процесу, будується чіткими ітераціями, а покращення в ньому треба вміти показати — тож фраза «у нас є SAMM» без показаних вимірів не варта нічого.
У чому різниця між ASVS і WSTG? Чи можна написати в критеріях виходу «пройшли по WSTG»?
Це документи з різними ролями: дає процедуру перевірки, — перевірні вимоги, проти яких виноситься вердикт. Сам WSTG називає себе повним каркасом тестування, а не простим чеклистом, і пояснює причину: перелік вразливостей поповнюється безперервно, тому вичерпного списку перевірок не складе ніхто. Означення тестування в ньому теж показове — це порівняння стану системи з набором критеріїв, а критерії гайд не видає. Видає їх ASVS, причому у формі, звичній для QA: вимога перевірна, результат — pass або fail, у стандарті є лише обовʼязкові вимоги, тож «зробили частково» станом не є. Рівнів три (L1, L2, L3), і призначає їх не стандарт, а сама організація зі свого профілю ризику. Тому «пройшли по WSTG» критерієм виходу бути не може: це опис виконаної процедури, а не вердикт проти вимог. Дрібниця з того самого ряду: ідентифікатори в обох документах пишуть із версією, бо між редакціями вони змінюються, а OWASP при цьому нікого не сертифікує.
Навіщо піднімати Juice Shop чи DVWA, якщо є стейдж?
Бо активну атаку можна вести тільки проти цілі, на тестування якої є дозвіл, а навчатися треба на чомусь. прикидається невеликим магазином соків, а всередині має завдання різної складності на закладені вразливості; закладали їх свідомо, але відтворювали такими, якими вони бувають у живих проєктах, і прогрес застосунок рахує сам. Дві його властивості визначають спосіб роботи: один інстанс розрахований на одного користувача, а самовідновлення на старті сервера стирає базу й теку, яку могли змінити під час зламу, — тож докази (, запити, HAR) збирають одразу, інакше після падіння їх не буде. Падіння під агресивним прогоном там штатне і знахідкою не рахується. — навмисно вразливий застосунок на PHP і MariaDB з рівнями складності, які задають конфігурацією; головне правило запуску найсуворіше з усіх: його не можна класти в публічну теку хостингу чи на сервер, доступний з інтернету, — рекомендують віртуальну машину в режимі NAT. Корисна деталь для тих, хто ганяє сканери: у DVWA є опція вимкнути перевірку автентифікації, бо частина інструментів із логіном не працює.
Ви прогнали DAST по стейджу, і в моніторингу тиша. Що це означає?
Що ви щойно знайшли дефект, тільки не той, який шукали. Категорія A09:2025 про збої логування й сповіщень формулює це як прямий тест: якщо прогін DAST-інструмента або пентест не породжує жодного сповіщення, це і є дефект. Тобто прогін працює у два боки: шукає вразливості й одночасно зʼясовує, чи помічає система напад на себе. Поруч перевіряють суміжні ознаки: чи логуються всі події, які підлягають аудиту (класика — успішні входи пишуться, невдалі ні), чи захищена цілісність логів від підміни, чи не течуть у лог персональні дані, чи екрануються дані події перед записом — інакше в саму систему логування можна впорснути свій рядок через CR і LF. Розраховувати тут на сканер не варто: категорію називають надзвичайно важкою для тестування, і в даних вона представлена мінімально, тож перевіряють її руками й домовленістю з тими, хто дивиться на алерти.
Ви знайшли вразливість у чужому сервісі. Ваші дії?
Спочатку зупинитися й перевірити, чи саме тестування було легальним і дозволеним, — це перший обовʼязок того, хто знайшов. Далі — знайти канал: докласти розумних зусиль, щоб звʼязатися з командою безпеки, зокрема подивитися /.well-known/security.txt, де організація могла описати спосіб звʼязку. У звіті має бути стільки конкретики, щоб чужа команда відтворила знахідку без вашої участі й переконалася в ній сама, — інакше це не звіт, а натяк. Чого робити не можна: вимагати оплату чи винагороду поза наявною програмою — це може бути кваліфіковано як вимагання, як і плата за непублікацію. Далі працює модель розкриття: типово приватна, коли рішення про публікацію належить організації; відповідальна (координована), коли повні деталі виходять після патча і процес рухає дедлайн; повна — крайній засіб. І юридична межа, про яку забувають: прикриває дослідника рівно доти, доки той не вийшов за scope і правила програми; крок за цю межу вже може тягнути на кримінальну відповідальність.
Що таке security.txt і чи дає він дозвіл на тестування?
Це описаний RFC 9116 текстовий файл, який машинно розбирається й каже, як організація приймає повідомлення про вразливості. Нормативний мінімум перевіряється за кілька хвилин: файл лежить під /.well-known/ (копію в корені лишили тільки заради сумісності, і за наявності обох чинною є та, що під /.well-known/), віддається по https з типом text/plain і charset=utf-8, обовʼязково має поле Contact (значення бажано в порядку переваги) і рівно одне поле Expires, дату в якому рекомендують ставити менше ніж на рік уперед. Область дії — рівно той домен або IP, з URI якого файл узято: ні піддомени, ні батьківський домен він не покриває. Дозволу на тестування файл не дає: ані з його наявності, ані з його відсутності не можна виснувати ані дозвіл, ані заборону — дозвіл дає політика розкриття. Крім того, він не рятує від захопленого сайту (зламавши сайт, підмінить і цей файл або поставить редирект на себе), а протухлий файл RFC прямо називає гіршим за відсутній.
Три ситуації, у яких теорія цієї глави перетворюється на роботу: розбір звіту сканера за двома шкалами й перетворення підтвердженої знахідки на регресійний тест, сорокахвилинна -сесія над однією фічею з таблицею «питання → перевірка», і домовленість перед прогоном — окремо для своєї цілі й окремо для чужої.
Кейс 1. Звіт сканера на 47 алертів: із чого починати тріаж
Нічний прогін сканера по стейджу приніс 47 записів. Читати їх зверху вниз — найгірша стратегія: у звіті дві незалежні шкали, і саме їхня пара каже, що робити першим.
| Знахідка | Що це означає насправді | Перший крок |
|---|---|---|
| high + certain | Техніка виявлення надійна, наслідок дорогий | Відтворити вручну, завести дефект того ж дня |
| high + tentative | Висновок зроблено за непрямими ознаками (типово для сліпих інʼєкцій) | Спершу підтвердити повторним запитом; без підтвердження це ще не дефект |
| low + certain | Факт є, але ціна низька | У беклог з описом, чому саме низька; окремо перевірити контекст |
| informational | Спостереження, а не претензія | Прочитати як підказку про поверхню атаки, не як баг |
Дві поправки, без яких таблиця бреше. Перша: оцінки інструмента індикативні — він не знає, що «тестовий» у вашому продукті відкритий у проді, а «критичний» звіт віддає порожню сторінку. Друга: низька впевненість не означає низької критичності — вона говорить лише про надійність техніки виявлення.
Штатний спосіб підтвердити знахідку — узяти той самий запит із історії й повторити його вручну, змінюючи по одному параметру:
POST /api/reports/export HTTP/1.1
Host: staging.example.com
Content-Type: application/json
Cookie: sid=...
{"reportId": 8123, "format": "pdf"}
Повторюємо з "reportId": 8124 (чужий звіт), потім з "format": "../../etc/passwd", потім тим самим тілом, але методом PUT. Останнє — не формальність: у GET /api/reports/export і PUT /api/reports/export є двома різними рядками, і контроль доступу на них теж різний.
Що йде в тікет, а що ні:
| Погано | Добре |
|---|---|
| «Сканер каже, що тут SQL-інʼєкція» | Запит, відповідь, різниця між двома відповідями, крок відтворення |
| «High severity за звітом ZAP» | Наслідок у термінах продукту: «користувач A завантажує звіт користувача B» |
| «47 алертів, треба поправити» | Перелік підтверджених, окремо — перелік відкинутих із причиною |
Підтверджену знахідку закріплюють тестом, інакше вона повернеться наступним релізом:
import { test, expect } from '@playwright/test';
// Регресія на підтверджену знахідку: помилка не має віддавати внутрішні деталі
test('кривий payload дає 400 без стек-трейсу', async ({ request }) => {
const res = await request.post(`${process.env.BASE_URL}/api/reports/export`, {
headers: { 'content-type': 'application/json' },
data: '{"reportId": "не-число"',
});
expect(res.status()).toBe(400);
const body = (await res.text()).toLowerCase();
expect(body).not.toContain('sqlstate');
expect(body).not.toContain('stack');
expect(body).not.toMatch(/\/(usr|home|var)\//);
});
Що дивитися і чому:
- на код і на тіло окремо. Правильний
400із повним у тілі — це все ще знахідка: категорія розкриття даних живе саме в тілах помилок. - Порожній звіт неоднозначний. «Сканер нічого не знайшов» і «сканер не достукався до застосунку» виглядають однаково, тому в описі прогону фіксують інструмент, версію, ціль і кількість запитів.
- Прогін наступним інструментом дасть інші числа — і це нормально. Тести в сканерах не стандартизовані, тож порівнювати можна лише прогін із прогоном того самого інструмента.
Кейс 2. STRIDE над однією фічею за сорок хвилин
Фіча в розробці: «поділитися звітом за посиланням» — власник генерує URL із токеном, будь-хто з посиланням відкриває звіт без логіну, посилання можна відкликати. Замість абстрактного «а чи безпечно це» ставимо шість готових питань.
| Категорія | Питання до цієї фічі | Що з цього стає перевіркою |
|---|---|---|
| Spoofing | Чи можна видати себе за власника звіту, маючи лише посилання? | Дії, доступні з публічного посилання, обмежені читанням: POST/PUT на той самий ресурс дають 403 |
| Tampering | Чи можна підправити токен у посиланні й дістати інший звіт? | Перебір сусідніх значень токена й підпису; відповідь не залежить від того, чи звіт існує |
| Repudiation | Чи видно потім, хто саме створив і хто відкликав посилання? | У журналі подій є запис зі створенням, відкликанням і часом; запис не редагується з інтерфейсу |
| Information disclosure | Чи витікає щось поза сам звіт — імена, суми, внутрішні ID? | Порівняння відповіді для власника й для анонімного відвідувача поле за полем |
| Denial of service | Чи можна нагенерувати посилань стільки, щоб покласти сервіс? | Ліміт на створення посилань і 429 після його перевищення |
| Elevation of privilege | Чи дає посилання щось, чого немає в анонімного користувача? | Із сесією за посиланням стукаємо в сусідні ендпоінти: усі мають відповісти 401/403 |
Далі — крок, на якому фіча або отримує перевірні вимоги, або лишається побажанням. На кожну відповідей чотири: помʼякшити, усунути, перенести, прийняти. Прийняти теж можна, але це рішення власника й воно записується — «прийняли ризик» не означає «забули».
| Формулювання після брейншторму | Формулювання, придатне до перевірки |
|---|---|
| «Посилення валідації токена» | Токен непередбачуваний і не виводиться з reportId, а відповідь на невалідний токен не відрізняється від відповіді на неіснуючий звіт |
| «Обмежити час життя» | Посилання перестає працювати через 7 днів; після відкликання перший же запит дає 410 |
| «Логувати важливе» | Створення, відкриття й відкликання пишуться з ідентифікатором актора й часом; персональних даних у записі немає |
Що дивитися і чому:
- STRIDE не міряє . Вона лише розкладає загрози по категоріях, щоб питання були точними; пріоритизація йде окремим кроком, і тут канон OWASP сам собі суперечить — один документ радить добуток імовірності на вплив, інший навпаки радить якісні оцінки, щоб не плодити псевдоточність.
- Місце QA — на кроці валідації. Перевірочні питання сформульовані по-тестувальницьки: чи можна протестувати узгоджені помʼякшення і чи можна виміряти успіх або невдачу вимоги. Ліва колонка таблиці на це «ні», права — «так».
- Модель не малюють один раз. Тригери перезапуску названі: нова фіча, інцидент, зміни архітектури чи інфраструктури. перезапускає ще й вужчий набір — зміни в автентифікації, сесіях і керуванні паролями.
Кейс 3. Перед прогоном: чия це ціль
Найдорожча помилка в цій темі коштує не , а роботи. Питання «чия ціль» ставлять до того, як натиснути кнопку.
Своя ціль (стейдж вашого продукту). Пасивний прохід крізь проксі можна робити одразу — він нічого не змінює. Для активного скану домовляються заздалегідь:
- письмовий дозвіл власника системи, а не «ну ми ж усі свої в одному чаті»;
- вікно прогону й попередження всім, хто побачить сплеск: SRE, хостинг, CDN;
- свіжий бекап цілі — активна перевірка справді може зіпсувати дані;
- зафіксовані інструмент, версія, перелік цілей і час старту й кінця;
- моніторинг не вимикають — це друга половина перевірки.
Остання умова і є найцікавішою. Прогін дає два результати, а не один:
| Результат прогону | Що з ним робити |
|---|---|
| Сканер знайшов вразливості | Тріаж за кейсом 1: підтвердити, описати, закріпити тестом |
| Моніторинг відреагував алертом | Норма: система бачить, що її атакують |
| Моніторинг промовчав узагалі | Це окремий дефект категорії A09 — заводимо його так само, як інші |
Тиша в моніторингу після годинного активного скану означає рівно те, що жодна ззовні теж не буде помічена. Поруч перевіряють суміжне: чи пишуться невдалі спроби входу, а не лише успішні; чи захищена цілісність логів; чи не течуть у записи персональні дані; чи екрануються дані події перед записом — інакше в лог можна впорснути власний рядок через CR і LF. Сканером тут не обійтися: категорію називають надзвичайно важкою для тестування, і в даних вона представлена мінімально.
Окремо про навчальні стенди. Юридично вони існують саме для того, щоб було де бити на повну, але поводяться специфічно: агресивний прогін кладе штатно, а самовідновлення на старті сервера стирає базу й теку, яку могли змінити під час зламу. Тому докази збирають одразу — , HAR, збережений запит, — інакше після перезапуску доводити буде нічим. Падіння стенда під сканером знахідкою не рахується. має жорсткіше правило: його не кладуть у публічну теку хостингу й не виставляють у мережу, рекомендований спосіб — віртуальна машина в режимі NAT.
Чужа ціль. Тут стоп: активний прогін без дозволу є атакою незалежно від намірів. Якщо знайшлася випадково — скажімо, у сервісі партнера під час звичайної інтеграційної перевірки, — послідовність інша. Спершу шукаємо канал:
# канонічне місце за RFC 9116 (копія в корені допускається лише для сумісності)
curl -sSI https://partner.example.com/.well-known/security.txt
# сам вміст: Contact і Expires читаємо очима
curl -sS https://partner.example.com/.well-known/security.txt
Що саме дивитися у відповіді:
| Перевірка | Норма за RFC 9116 |
|---|---|
| Розташування | Під /.well-known/; якщо є ще й копія в корені, чинною є та, що під /.well-known/ |
| Схема й тип | https, text/plain із charset=utf-8 |
Contact | Присутнє завжди; кілька значень — у порядку переваги |
Expires | Рівно одне поле; дату рекомендують ставити менше ніж на рік уперед |
| Область дії | Рівно той домен або IP, з якого файл узято — піддомени він не покриває |
Далі працює процедура, а не тікет. Звіт іде приватно й несе стільки конкретики, щоб чужа команда відтворила знахідку сама й переконалася в ній без вашої участі. Оплати чи винагороди поза наявною програмою не вимагають — і за інформацію, і за непублікацію вимога грошей може бути кваліфікована як вимагання. Публікувати деталі можна після патча, і саме дедлайн рухає координовану модель; без патча лишається крайнім засобом.
Що дивитися і чому:
- Наявність файла дозволу не дає. Ані з присутності, ані з відсутності
security.txtне випливає ні дозвіл, ні заборона: тестування легалізує політика розкриття, а діє лише всередині scope і правил програми. - Протухлий файл гірший за відсутній — так це сформульовано в самому RFC. Дата в
Expiresу минулому означає, що адреса вContactмогла давно померти разом із командою, яка її читала. - Зламаний сайт підмінить і цей файл. , який дістав контроль, може поставити свою адресу або редирект на себе, тож канал із
security.txt— зручність, а не гарантія.
Каркас: критерій проти процедури
- Знаю різницю між і : перший дає процедуру перевірки й сам відмовляється бути чеклистом, другий дає перевірні вимоги з вердиктом pass або fail — тому «пройшли по WSTG» описує виконану роботу, а не є.
- Памʼятаю дрібниці ASVS: у стандарті лише обовʼязкові вимоги (тож «частково виконали» станом не є), рівні L1–L3 призначає організація зі свого профілю , ідентифікатори пишуть із версією, а OWASP при цьому нікого не сертифікує.
- Розумію, що обʼєктом перевірки є люди, процес і технологія, найощадніше місце знахідки — дизайн, а жодна окрема техніка (, , рев'ю коду, пентест) не самодостатня; сам процес узгоджують із процесом розробки й міряють проти критеріїв виходу.
Проксі й тріаж знахідки
- Можу пояснити, чому починають із перехоплювального , а не зі сканера, і памʼятаю сліпу зону пасивного проходу: сторінки за формою входу не виявляються, доки не налаштована автентифікація.
- Знаю різницю між пасивним і активним скануванням і те, що межа тут не технічна, а про мандат; сюди ж лягає пара «оцінювання проти тестування» — дозволу потребує саме спроба експлуатації, а оцінка ризиків тестом не є взагалі. Умови активного прогону теж можу назвати: вивчений інструмент, резервна копія цілі, авторизація власника, прийнятий обома сторонами ризик пошкодження.
- Розрізняю ролі в наборі (Proxy як вхідна точка, Repeater як повторне надсилання зміненого запиту, Intruder як підстановка пейлоадів у позначені позиції) і не читаю як : сірий підпис означає «знайдено, але не запитано», а той самий шлях із
GETі зPUT— два окремі рядки. - Розрізняю серйозність і впевненість як дві незалежні шкали знахідки, памʼятаю, що ненадійна техніка виявлення знижує саме впевненість, і підтверджую знахідку повторним ручним запитом, бо оцінки інструмента індикативні.
Класи перевірок і їхні межі
- Знаю різницю vs за входом перевірки (вихідний або зібраний код проти запущеного застосунку ззовні) і розумію, чому клас описує перевірку, а не продукт: один інструмент може вміти кілька типів.
- Можу перелічити межі : погана автоматизація автентифікації, контролю доступу й криптографії, малий відсоток виявлених дефектів, багато хибнопозитивних, невидима конфігурація й складність довести реальність знахідки.
- Розумію межу класу як такого: інструмент не робить софт захищеним, а прогін корисний насамперед як перший прохід по очевидному; тому й звіти двох сканерів не взаємозамінні — тести не стандартизовані, і розбіжність не є дефектом жодного з них.
- Можу пояснити як техніку: подача несподіваного або спотвореного вводу, дві частини фазера (генератор даних і засоби спостереження), два способи будувати вектори (списки небезпечних значень під тип або сама специфікація) і межа — тяжіння до простих дефектів.
Моделювання загроз і поверхня атаки
- Знаю чотири питання каркаса (над чим працюємо, що може піти не так, що зробимо, чи достатньо добре) і чотири відповіді на : помʼякшити, усунути, перенести, прийняти.
- Можу розгорнути у шість питань до конкретної фічі, назвати властивість, яку порушує кожна категорія, і памʼятаю, що сама мнемоніка ризик не міряє.
- Розумію роль QA на кроці валідації: помʼякшення має бути придатним до дії й перевірним, модель рецензують усі стейкхолдери, а перезапускають її за подіями — нова фіча, інцидент, зміни архітектури чи інфраструктури.
- Можу перелічити точки (форми й поля, заголовки й cookie, API, файли, бази, локальні сховища, повідомлення, аргументи запуску), пояснити, навіщо окремо рахують точки виходу, і назвати тригер перегляду — зміни в автентифікації, сесіях і керуванні паролями.
Пайплайн, зрілість і стенди
- Знаю порядок кроків (моделювання загроз нульовим, до коду → пошук креденшелів у репозиторії й лінт → сканування → аудит відповідності) і розумію, що ці кроки не роблять безпечним сам : він є привабливою ціллю через високопривілейовані ідентичності, тож потрібні ручний апрув перед продом і недовіра до дефолтів вендора, а зрілість процесу — уже окреме питання ().
- Знаю, навіщо піднімають вразливий стенд, і головні правила: не виставляти в інтернет (віртуальна машина в режимі NAT), а в памʼятати про один інстанс на користувача, самовідновлення зі стиранням бази на старті й штатне падіння під агресивним прогоном.
Виявлення й розкриття
- Знаю, що прогін DAST або пентест, який не породив жодного сповіщення, сам є дефектом категорії A09, і що цю категорію називають надзвичайно важкою для тестування, а в даних вона представлена мінімально.
- Можу назвати обовʼязки обох сторін розкриття, розрізняю приватну, повну й відповідальну моделі, памʼятаю про дедлайн як рушій третьої та про межу : він діє лише в межах scope і правил, а вимога оплати за інформацію чи за непублікацію може становити вимагання.
- Можу за пʼять хвилин перевірити
security.txtна відповідність RFC 9116 (розташування під/.well-known/, схемаhttps, типtext/plain, обовʼязковийContactі рівно одинExpires, область дії рівно того домену, звідки файл узято) і назвати три речі, яких він не робить: не дає дозволу на тестування, не рятує від підміни на захопленому сайті, а протухлим стає гіршим за відсутній.
Квіз
Перед стартом
- Питань: 17
- Поріг «зараховано»: ≥70% правильних відповідей.
- Результат впливає на прогрес; завалені питання підуть у чергу повторення.
- Квіз впливає на компліт теми: тема стає «пройдено», лише коли прочитано теорію І квіз складено на ≥70%.
Питання
Хто призначає застосунку рівень ASVS — L1, L2 чи L3?