Інтеграція SAST (Static Application Security Testing) у CI/CD конвеєр

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

SAST у конвеєрі: чому уразливості доходять до релізу

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

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

Знаходить їх частіше не команда розробки, а сканер на периметрі або зовнішній звіт за підсумками перевірки.

Ціна знахідки — не сама правка, а супутня робота: з'ясувати, яка версія зараз в експлуатації, хто автор зміни, чи підпадає дефект під вимоги аудиту, і встигнути випустити позаплановий реліз.

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

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

Що змінюється після вбудовування перевірок у збірку

Перевірки коду (SAST) вбудовуються у дві точки: розбір змінених файлів локально до відправлення та повний прохід на кожній гілці у збірці. Критичні знахідки блокують злиття в основну гілку, решта потрапляє у звіт із прив'язкою до рядка й класу дефекту з переліку OWASP.

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

Частка дефектів, знайдених до рев'ю, зростає з чверті до 70–80%: неекрановане введення, секрет у конфігу й небезпечна десеріалізація ловляться на збірці, а не на тестуванні. На рев'ю приходить код, який уже пройшов формальний бар'єр, і обговорення зміщується до архітектури.

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

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

Єдині правила аналізу задають однаковий поріг суворості для всіх репозиторіїв — новий сервіс із першого дня перевіряється так само, як старий, і не з'являється проєкт з ослабленим набором правил.

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

Варіанти запуску SAST: збірка, зміни, розклад

SAST рідко вмикають в одній точці конвеєра: різні режими закривають різні ризики й по-різному впливають на час збірки.

Інкрементальний аналіз дає автору зміни зворотний зв'язок за хвилини, повний прогін коду ловить міжмодульні потоки даних, які не видно під час перевірки окремих файлів.

Режим Коли підходить Обмеження
Перевірка змінених файлів на кожен pull request Потрібен швидкий зворотний зв'язок до рев'ю Не бачить зв'язку з рештою кодової бази, частіше дає хибні спрацювання
Повний прогін коду у збірці Невеликі репозиторії, критичні релізи Подовжує конвеєр і навантажує агенти збірки
Нічна збірка за розкладом Великі та багатомовні проєкти Знахідки приходять із затримкою, вранці потрібен розбір
Ручний запуск на гілці релізу Підготовка до випуску, розбір інциденту Регулярність тримається на дисципліні команди

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

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

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

Впровадження за кроками: від інвентаризації до передачі

Впровадження SAST — це послідовність робіт, де кожен етап спирається на результат попереднього, а не встановлення одного аналізатора.

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

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

Конфігурації, правила та регламенти: що передаємо

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

  • Конфігурація етапу перевірки у файлі конвеєра: тригери на запити злиття та нічну збірку, поріг блокування, тайм-аути, кеш проміжних результатів.
  • Набори правил під ваш стек: базовий профіль плюс окремі профілі для критичних сервісів із прив'язкою до гілок.
  • Профілі аналізу: глибина розбору, цільові каталоги, винятки для згенерованого коду та зовнішніх бібліотек — кожен з обґрунтуванням.
  • Регламент реагування: категорії серйозності, терміни усунення, хто розбирає знахідку, коли збірка блокується і як оформлюється мотивована відмова.
  • Схема проходження знахідки: від коміту до звіту, де зберігаються результати і як вони пов'язуються із завданнями в трекері.
  • Документація з перевірок: як додати правило, як придушити хибне спрацювання, як оновлювати профілі при зміні стеку.
  • Інструкція для розробника: локальний запуск до відправлення змін, розбір звіту, типові сценарії виправлення.
  • Журнал змін правил і матриця відповідальності: хто погоджує нові винятки й хто відповідає за перегляд профілів.

Кейс: перевірки у збірці скоротили розбір дефектів утричі

Що було до перевірок у збірці

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

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

Як налаштували пороги

Розгорнули SAST прямо в конвеєрі збірки на базі SonarQube і зафіксували базову лінію за поточним станом коду: старі знахідки потрапили у звіт, але збірку не блокували — інакше команди стали б уже першого дня.

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

За три місяці частка дефектів, що доходять до релізу, скоротилася втричі, час розбору знахідок на зміну — з 40 до 12 хвилин, а частка нових правок під перевірками зросла до 90%. Звіт в описі зміни зняв окрему стадію погоджень: автор бачить причину до рев'ю й закриває її сам.

SAST чи динамічний аналіз: що вибрати на старті

SAST і динамічний аналіз відповідають на різні питання.

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

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

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

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

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

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

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

Динамічний аналіз підключають, коли є стенд зі стабільними даними та повторювані сценарії. Один налаштований інструмент із розібраною базою спрацювань корисніший за три, увімкнені формально.

Часті сумніви: хибні спрацювання та швидкість збірки

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

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

Збірка стане через хибні спрацювання?

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

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

Наскільки сповільниться перевірка?

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

У нас тисячі старих зауважень — з чого почати?

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

Єдині правила залишаються спільними для всіх команд, а відмінності оформлюються профілями й локальними політиками, а не вимкненням перевірок.

Обговоримо задачу: точки впровадження та порядок кроків

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

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

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

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

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

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