OWASP ZAP: DAST у CI/CD з фільтрацією хибних спрацювань

Сканер у конвеєрі тоне в хибних спрацюваннях, і команда перестає йому довіряти. Ми налаштовуємо OWASP ZAP під ключ: добираємо правила фільтрації під ваш проєкт і скорочуємо ручний розбір звітів у рази. У результаті перевірки безпеки проходять автоматично на кожній зміні та не гальмують випуск.
Часті запитання

OWASP ZAP у конвеєрі: чому сканер тоне в хибних спрацюваннях

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

Причина — у природі динамічного аналізу.

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

На один справжній дефект припадають десятки спрацювань, які розробник закриває формулюванням «не наша зона».

Далі вмикається лавина. Виняток за ідентифікатором правила гасить цілий клас перевірок, виняток за маскою адреси — цілий розділ додатка. Звіт зростає, його перестають читати, поріг падіння збірки підвищують, щоб не блокувати випуск.

Хибні спрацювання перестають бути проблемою звіту й стають проблемою процесу: перевірка безпеки перетворюється на формальність, а нове значуще спрацювання тоне серед старих.

Підсумок такого налаштування — уразливість іде в продуктив разом із релізом, при цьому звіт виглядає чистим.

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

Динамічний аналіз у конвеєрі: вимірюваний ефект

Динамічний аналіз перевіряє не вихідний код, а запущений додаток: сканер проходить за адресами й сценаріями так само, як це робив би зовнішній атакувальник, і фіксує те, що видно ззовні. Статичні перевірки такий контур не замінюють — вони працюють з іншим шаром.

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

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

Охоплення перевірок зростає не від кількості правил, а від сценарного прогону.

Автентифікований обхід під кожною роллю, прохід за формами й завантаженням файлів, окремий контур для програмних інтерфейсів — так закриваються шляхи, яких немає у вихідниках і які з’являються лише в зібраному середовищі.

Зі звітів поступово зникають цілі класи відмов: незакритий доступ між ролями, витоки даних у відповідях, відсутність обмежень на повторні запити. Сканер OWASP ZAP ставиться окремим кроком конвеєра, а правила фільтрації відсікають відомий шум — інакше команда перестає читати звіт.

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

Режими запуску динамічного сканера: коли що підходить

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

Швидка перевірка змін на кожен коміт ловить регресії в заголовках безпеки, cookie та витоках даних, але активних атак не виконує. Повний прогін знаходить ін’єкції та обходи авторизації, зате триває десятки хвилин і потребує піднятого стенда з керованими даними.

На практиці режими комбінують: дешева перевірка — на кожну зміну, дорога — за розкладом або перед викаткою. Нижче чесне порівняння, включно з випадками, де режим себе не окуповує.

Режим Коли підходить Обмеження
Перевірка змін на кожен коміт Десятки збірок на день, потрібен швидкий відгук розробнику Працює пасивно: не знаходить ін’єкції та обходи авторизації; бачить лише ті сторінки, куди дійшов обхід
Повний прогін за розкладом Нічні збірки, стабільне тестове середовище Триває десятки хвилин, залежить від даних і стану стенда, частина знахідок потребує ручної перевірки
Повний прогін перед викаткою Релізний контур, потрібен стоп-кран Знахідки з’являються пізно, коли правки вже в гілці; подовжує цикл викатки
Перевірка API за описом інтерфейсу Сервіси без інтерфейсу, обмін між сервісами Покриття дорівнює повноті опису: застарілий опис дає сліпі зони
Прогін з авторизованою сесією Закриті розділи, особистий кабінет Потрібен обліковий запис і його супровід, токен живе обмежено; зростає частка хибних спрацювань

Загальне обмеження сканера — він не розуміє бізнес-логіку: підміну ціни, обхід лімітів, гонки за паралельних запитів він не побачить. Тому OWASP ZAP у конвеєрі ставлять разом із фільтрацією знахідок і правилами зупинки збірки — інакше шум знецінює перевірки. Розбираємо, як налаштувати відсів хибних спрацювань і пороги блокування.

Налаштування перевірок у конвеєрі: від аудиту до передачі

Аудит конвеєра починається з інвентаризації: які гілки збираються, куди потрапляють артефакти, які середовища піднімаються автоматично й хто власник сервісу. Без цієї карти сканування ставлять не на ту стадію — воно або гальмує збірку, або не доходить до розгорнутого додатка. Далі проєктуємо схему й ставимо OWASP ZAP у знайдені точки.

  1. Аудит конвеєра. Дивимося стадії збірки й розгортання, час кожної та точки, де піднімається тестовий стенд; шукаємо місце для сканування без зростання часу прогону.
  2. Область сканування. Фіксуємо адреси й ролі в периметрі, що виключаємо (статика, сторонні сервіси), які облікові записи отримує сканер.
  3. Налаштування правил сканера. Підбираємо набір правил і пороги під тип додатка, вмикаємо контекст і вхід під обліковим записом — перевіряються закриті розділи, а не лише форма входу.
  4. Фільтрація хибних спрацювань. Позначаємо підтверджений шум і ведемо файл винятків з обґрунтуванням; правило повертаємо, якщо умови змінилися.
  5. Режими запуску. Швидкий набір — на кожну зміну гілки, повне сканування — за розкладом; збірка падає лише на нових знахідках високого рівня.
  6. Перевірка результату. Прогоняємо схему на стенді з навмисно внесеною уразливістю: відома проблема ловиться, виключений шум не спливає.
  7. Передача команді. Віддаємо конфігурацію, регламент оновлення правил і порядок розбору: хто дивиться звіт, у які строки закриває знахідки, як змінює пороги.

Правила фільтрації хибних спрацювань і базова конфігурація

Сканер OWASP ZAP без налаштованих винятків швидко перетворюється на генератор шуму: та сама знахідка про відсутній заголовок безпеки спливає в кожному прогоні, звіт зростає, а реальні дефекти в ньому губляться.

Тому разом зі сканером замовник отримує комплект артефактів — від файлів конфігурації до регламенту розбору звітів.

  • Конфігурація сканера: рівні правил, поріг значущості, набір активних і пасивних перевірок, окремі профілі для швидкого прогону на кожен коміт і повного — за розкладом.
  • Політики винятків і правила фільтрації хибних спрацювань: прив’язка до шляху, параметра або шаблону відповіді; придушена знахідка не зупиняє випуск, але залишається в журналі прогонів.
  • Матриця контекстів автентифікації: під якими ролями скануємо, як підтримується сесія, щоб закриті розділи не перевірялися як публічні.
  • Схема стендів: де розгортається сканер, на яких середовищах працює, як ізолюється від робочих даних.
  • Регламент розбору звітів: хто і в який строк розбирає нові знахідки, як оформлюється виняток і коли він переглядається.
  • Схема вбудовування в конвеєр постачання: на якому кроці стоїть перевірка й за яких умов вона зупиняє випуск.
  • Чек-ліст приймання: контрольний прогін на стенді із заздалегідь внесеними уразливостями — показує, що фільтри не глушать зайвого.

Винятки не залишаються статичними: правила переглядаються разом із командою, щоб придушені знахідки не накопичувалися і фільтр не перетворився на спосіб не помічати проблеми.

Кейс: як прибрали шум зі звітів сканера

Перед впровадженням OWASP ZAP запускався вручну раз на два тижні, звіт складався в спільну папку. Типовий прогін давав близько 400 знахідок, після ручного розбору залишалося 25–30 реальних — частка хибних спрацювань трималася на рівні 85%.

Інженери витрачали на розбір два дні, реліз зсувався, а до звіту звикли не дивитися: «знову той самий список».

Що налаштували

Сканування перевели на кожен запит на злиття — швидкий прохід за зміненими маршрутами, уночі повний обхід додатка.

Фільтрація тримається на трьох правилах: відсікання за кодом відповіді та сигнатурою (однакова відповідь на всі вхідні дані — не уразливість), список винятків для ендпоінтів, які навмисно віддають тестові дані, і дедуплікація знахідок за класом уразливості та параметром.

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

Результат

Частка хибних спрацювань — близько 10%, у звіті 25–35 знахідок замість 400. Розбір займає півтори-дві години замість двох днів, сканування на злитті вкладається у хвилини й не гальмує конвеєр.

Підтверджені уразливості закриваються до релізу: за квартал жодна знахідка високого рівня не дійшла до продакшену.

Чим OWASP ZAP відрізняється від аналізу вихідного коду

Це два різні об’єкти перевірки, і плутати їх не варто. Аналіз вихідного коду читає те, що написано: потоки даних від точки входу до небезпечного виклику, обробку параметрів, роботу з криптографією.

OWASP ZAP дивиться на працюючий додаток ззовні й перевіряє фактичну поведінку, а не намір розробника.

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

Зворотний бік теж є: ZAP не підказує рядок з помилкою, а статичний аналіз дає шум на шляхах, які в реальному запиті не збираються. Тому порівняння підходів — не про «що краще», а про клас дефектів, який потрібно закрити.

На практиці методи доповнюють один одного. Розбір коду ставлять на кожному коміті — він швидкий і вказує точне місце.

ZAP запускають на передпродуктовому стенді після викатки: сканування йде реальними маршрутами, зі справжньою автентифікацією та сесіями, а спрацювання фільтрують, щоб звіт не тонув у шумі.

Вибір методу перевірки диктує етап: перевірка коду — на вході в конвеєр збірки, перевірка додатка — перед випуском. Якщо потрібна відповідь на питання «чи експлуатується діра», її дає OWASP ZAP; якщо «чому вона з’явилася» — розбір вихідників.

Типові технічні сумніви перед упровадженням перевірок

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

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

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

Перевірки помітно сповільнять збірку?

Пасивний режим тримаємо на кожній зміні — він не додає відчутної затримки. Активний обхід виносимо за межі швидкої збірки: за розкладом або на нічному прогоні, де обмежуємо глибину обходу й кількість одночасних запитів. На інкрементальний прогін віддаємо лише змінені маршрути, а повний профіль запускаємо рідше.

Чи потрібен окремий стенд для перевірок?

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

Як перевіряти розділи за авторизацією?

Сканеру передаємо збережену сесію й контекст із токеном потрібної ролі, а форму входу виключаємо з обходу, щоб він не витрачав час на її перебір.

Окремо налаштовуємо оновлення сесії після закінчення строку та прогін за кожною роллю — частина уразливостей видна лише з правами конкретного користувача.

У нас уже розгорнуто сканер — що зміниться?

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

Обговоримо задачу: що надіслати для оцінки

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

Що більше вхідних даних ви надішлете на першій розмові, то точнішою буде оцінка робіт і то менше буде уточнювальних ітерацій.

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

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

Наші компетенції:

Останні роботи

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1542
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1393
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1081
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1368
  • Розробка логотипу компанії B2B Advance
    Розробка логотипу компанії B2B Advance
    815
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1139