Когда я впервые настраивал SAST в GitLab, потратил полтора дня на то, чтобы понять разницу между встроенным анализом и Semgrep. Сейчас видел десятки проектов, которые делают то же самое. Давайте разберёмся, что где работает и зачем это нужно.
Что такое Semgrep и почему о нём говорят все
Semgrep — это инструмент статического анализа кода, который ищет уязвимости и ошибки с помощью паттернов. На первый взгляд — просто ещё один linter. На самом деле это совсем другой подход.
Вместо синтаксического дерева AST, как в обычных статических анализаторах, Semgrep работает с семантическими паттернами. Это значит, что он может найти не только опечатки и нарушения стиля, но и логические ошибки. Вот простой пример:
# Semgrep найдёт эту уязвимость
password = request.GET['password']
execute_query(password) # SQL injection!
# А обычный linter просто скажет "переменная не используется красиво"
Semgrep написан на OCaml, очень быстрый (анализирует большие репозитории за секунды) и поддерживает кучу языков: Python, JavaScript, TypeScript, Java, Go, PHP, C, C++, Ruby, Kotlin и другие. Главное — он работает без компиляции, прямо с исходниками.
GitLab встроил Semgrep в свой SAST (Static Application Security Testing) ещё в версии 13.12. То есть если у вас есть GitLab CI, вы можете запустить анализ буквально в несколько строк.
Как интегрировать Semgrep в GitLab CI
Честно? Это проще, чем кажется. Вот базовая конфигурация:
# .gitlab-ci.yml
stages:
- test
- sast
semgrep-sast:
stage: sast
image: returntocorp/semgrep
script:
- semgrep --config=p/owasp-top-ten --json --output=semgrep-report.json .
artifacts:
reports:
sast: semgrep-report.json
allow_failure: true
Готово. На следующем push в MR появятся замечания прямо в коде.
Но если вы используете встроенный GitLab SAST, то конфиг ещё проще:
include:
- template: Security/SAST.gitlab-ci.yml
variables:
SAST_EXCLUDED_PATHS: tests, node_modules
GitLab сам запустит все доступные анализаторы, включая Semgrep. Замечания будут в отчёте "Security" на странице MR.
Я видел проекты, которые просто добавили эту строку и забыли про неё. Потом через месяц обнаружили, что находится кучу настоящих багов.
Плюсы и минусы Semgrep в GitLab
Что работает хорошо:
Semgrep очень быстрый. На проекте с 50 тысячами строк кода анализ занимает 3-5 секунд. Это значит, что вы можете запускать его на каждый commit, а не только на ночь.
Правила написаны на YAML, а не на регулярных выражениях. Это значит, что их легко читать и модифицировать. Вот правило для поиска hardcoded паролей:
rules:
- id: hardcoded-password
patterns:
- pattern-either:
- pattern: password = "..."
- pattern: password = '...'
message: Hardcoded password detected
languages: [python]
severity: HIGH
Библиотека правил огромная. Semgrep поддерживает готовые наборы для OWASP Top 10, CWE, MISRA и других стандартов. Можно просто включить нужный и всё работает.
Интеграция с GitLab встроена. Не нужно ничего дополнительного — просто добавил в CI и готово.
Где подводит:
False positives. Да, Semgrep лучше, чем обычные linter'ы, но он всё равно может ругаться на безопасный код. На одном проекте мы внедрили стандартный набор правил и получили 200 предупреждений. Половину пришлось отключить.
Правила нужно настраивать под проект. Если у вас своя архитектура и свои соглашения, стандартные наборы могут быть бесполезны.
Нет глубокого анализа потока данных. Semgrep смотрит на паттерны в коде, но не отслеживает, как данные движутся через программу. Это значит, что он может пропустить сложные уязвимости.
Бесплатный Semgrep имеет ограничения. Для работы с приватными репозиториями и advanced features нужна подписка.
Альтернативы и когда их использовать
Встроенный GitLab SAST
GitLab включает несколько анализаторов: Semgrep, SpotBugs (для Java), Gosec (для Go), Bandit (для Python). Если вы используете стандартный стек и вам хватает базовых проверок — просто включите встроенный SAST. Дополнительных затрат нет.
Но если нужна гибкость и кастомные правила — Semgrep лучше.
Sonarqube
Более тяжелый инструмент, требует отдельного сервера. Зато анализирует глубже и может отслеживать историю. Подходит для больших команд и корпоративных проектов.
OWASP Dependency-Check
Ищет уязвимости в зависимостях. Semgrep анализирует исходный код, а Dependency-Check — ваши библиотеки. Лучше использовать оба.
Российские альтернативы
Честно, на рынке не много локальных решений. Distiq — это AI-бот для code review, который находит баги, уязвимости и проблемы с производительностью. Интегрируется в GitLab за 2 минуты, анализирует каждый MR и оставляет инлайн-комментарии. Данные остаются в РФ, поддерживает все популярные языки. Если вам нужен автоматический code review без лишних движений — вот это работает.
Таблица сравнения
| Параметр | Semgrep | GitLab SAST | Sonarqube | Distiq |
|---|---|---|---|---|
| Скорость анализа | Очень быстро (3-5 сек) | Быстро | Медленно | Быстро |
| Кастомные правила | Да, на YAML | Ограниченно | Да, на Java | Нет (но не нужны) |
| Анализ потока данных | Нет | Нет | Да | Да (AI) |
| Интеграция с GitLab | Встроена | Встроена | Через плагин | Встроена |
| Цена | Бесплатно / 50$/мес | Встроено в GitLab | 100+ $/год | 99-199 $/мес |
| Русские серверы | Нет | Можно selfhosted | Можно selfhosted | Да |
| Поддержка языков | 20+ | 10+ | 20+ | 20+ |
Практический пример: настройка для реального проекта
У вас есть Python-приложение с API. Вам нужно:
- Ловить SQL injection и XSS
- Проверять безопасность зависимостей
- Находить логические ошибки в бизнес-логике
- Не задалбливать разработчиков false positives
Вот конфиг:
# .gitlab-ci.yml
include:
- template: Security/SAST.gitlab-ci.yml
- template: Security/Dependency-Scanning.gitlab-ci.yml
semgrep-sast:
variables:
SEMGREP_RULES: >
p/owasp-top-ten
p/cwe-top-25
p/django
allow_failure: false # Будем ругаться на серьёзное
sast:
allow_failure: true # А встроенный SAST — только информация
Запустите это и увидите замечания в MR. Если что-то ложное — добавьте # nosemgrep над строкой кода.
Итого: выбирать или не выбирать Semgrep?
Semgrep имеет смысл, если:
- Вы хотите более глубокий анализ, чем встроенный GitLab SAST
- Вам нужны кастомные правила под вашу архитектуру
- Вы готовы потратить время на настройку и фильтрацию false positives
Если вы просто хотите быстро включить анализ и забыть — используйте встроенный GitLab SAST. Этого хватит для большинства проектов.
Если же вам нужен анализ, который реально находит баги (а не просто ругается на стиль), попробуйте Distiq. Это AI-бот, который понимает контекст кода и оставляет инлайн-комментарии прямо в MR. Работает с GitLab, GitHub и GitVerse, данные в РФ. За 2 минуты интеграции вы получаете полноценный code review автоматом.
