SAST Checkmarx: налаштування інтеграції, тюнінг і усунення шуму

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

Чому налаштування Checkmarx не прибирає шум і гальмує збірку

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

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

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

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

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

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

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

Що змінюється після грамотної інтеграції: шум, швидкість, покриття

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

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

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

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

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

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

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

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

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

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

Режим Коли підходить Обмеження
Повне сканування Первинний прогін, великий реліз, зміна набору правил Довго на великих репозиторіях, надмірно для правки в один файл
Інкрементальний аналіз Щоденна робота, перевірка змін у гілці Бачить лише задіяний код — давні дефекти до звіту не потраплять
Перевірка за розкладом Нічний прогін повного профілю, релізні гілки Результат надходить із затримкою й не блокує терміновий коміт
Локальний контур Перевірка до надсилання в репозиторій, відсів грубих помилок Урізаний набір правил, середовище відрізняється від складального
Хмарна перевірка у збірці Блокуючий крок конвеєра, єдиний профіль для всіх гілок Залежить від доступності сервісу та черги завдань

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

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

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

Як відбувається налаштування Checkmarx: етапи робіт

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

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

  1. Аудит поточних правил. Дивимося, які профілі ввімкнено, які знахідки реально закривалися, а які мовчки ігнорувалися, і де сканування взагалі не запускається.
  2. Пілотний проєкт. Беремо один сервіс або репозиторій, проганяємо повний профіль і фіксуємо тривалість сканування, обсяг звіту та частку спрацювань, які команда визнає значущими.
  3. Інтеграція в конвеєр збірки. Розносимо режими: короткий набір правил на запит злиття, повний — на нічну збірку. Задаємо поріг критичності, за якого збірка зупиняється.
  4. Базова лінія знахідок. Для успадкованого коду фіксуємо поточний список як baseline: він не блокує збірку, але залишається видимим і поступово скорочується. Нові знахідки потрапляють під загальний поріг.
  5. Налаштування правил. Прибираємо шум: виключаємо тестові та згенеровані файли, правимо запити, що дають хибні спрацювання на нашому стеку, згортаємо дублі.
  6. Приймання правил і передача регламенту. Прогін на розміченому наборі, де заздалегідь відомо, де уразливість є, а де її немає: рахуємо частку вірних спрацювань і залишковий шум. За підсумками фіксуємо, кому надходять знахідки, за який строк їх розбирають і хто погоджує виключення.

Що замовник отримує на руки: профілі, правила, регламенти

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

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

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

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

Кейс: знизили шум і прискорили перевірки в конвеєрі збірки

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

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

Що змінили

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

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

Що стало

Показник До Після
Частка хибних спрацювань близько 60% нижче 15%
Час перевірки зміни десятки хвилин одиниці хвилин
Прострочені знахідки зростали кожен спринт скоротилися в рази

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

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

Чим аналіз коду відрізняється від перевірки залежностей і секретів

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

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

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

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

Результат тут — не «поганий код», а список оновлень: правка займає хвилини, але потребує перевірки сумісності та повторного прогону тестів.

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

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

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

Часті сумніви під час інтеграції сканера в конвеєр збірки

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

Сканер сповільнить збірку, і її почнуть обходити?

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

Оновлення правил обвалить уже прийнятий код?

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

Хто вирішує, що знахідка спірна?

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

У нас кілька команд — політика спільна чи своя в кожної?

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

Старий код із тисячами знахідок — вмикати перевірку одразу?

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

Обговоримо задачу й повернемося з оцінкою та планом робіт

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

Що для цього потрібно від вас і з чим ми повернемося:

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

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

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

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

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