На одном проекте у нас был код-ревью, который длился по три дня. Не потому что код сложный — просто младшие разработчики каждый раз наступали на одни и те же грабли. SQL-инъекции, захардкоженные секреты, небезопасные десериализации. Я устал писать одни и те же комментарии. Решил: хватит.
Начал искать инструменты, которые ловят типовые проблемы до ревью. Наткнулся на Semgrep. Сейчас расскажу, что это, как работает и когда реально помогает — а когда создаёт иллюзию безопасности.
Что такое Semgrep и зачем он нужен
Semgrep — это статический анализатор кода с настраиваемыми правилами. Его пишут ребята из Return to Corporation, компания из Сан-Франциско. Инструмент open-source, есть коммерческая версия с облачной консолью.
Главная фишка: вы пишете правила на DSL, похожем на код, который анализируете. Не нужно париться с AST-деревьями и писать парсеры. Указали паттерн — Semgrep нашёл все вхождения.
rules:
- id: dangerous-async-exec
patterns:
- pattern: exec($CMD)
- pattern-inside: |
async def $FUNC(...):
...
message: "Async function using exec() — potential security risk"
severity: WARNING
languages: [python]
Это правило найдёт все вызовы exec() внутри async-функций. Простая логика, понятный синтаксис. Если писали когда-нибудь правила для ESLint или custom rules для SonarQube — оцените разницу. Там боль, тут — читаемый YAML.
Semgrep поддерживает 30+ языков. Python, JavaScript, TypeScript, Java, Go, Ruby, Rust, C, C++ — основные. Есть поддержка Kotlin, Scala, Swift. Для популярного стека хватает.
Как это работает в реальности
По моему опыту, Semgrep хорошо ловит три категории проблем.
Безопасность. SQL-инъекции, XSS, небезопасная десериализация, use-after-free, hardcoded credentials. В официальном реестре semgrep.dev/rules больше 4000 готовых правил. Для OWASP Top 10 покрытие нормальное.
Типовые баги. Использование переменной до объявления, забытые await в async-коде, неправильное сравнение с None в Python. Всё то, что линтеры иногда пропускают.
Code style и архитектура. Запрет на импорты из определённых модулей, требование использовать конкретные библиотеки, проверка структуры проекта. Полезно, если хотите закодировать архитектурные решения.
Пример правила для поиска захардкоженных паролей:
rules:
- id: hardcoded-password
patterns:
- pattern-either:
- pattern: password = "..."
- pattern: PASSWORD = "..."
- pattern: $VAR = "..."
metavariable-regex:
metavariable: $VAR
regex: ".*[Pp]ass.*"
message: "Hardcoded password detected"
severity: ERROR
languages: [python, javascript, typescript]
Запускается просто:
semgrep --config auto .
# или с конкретными правилами
semgrep --config p/security-audit --config p/python .
Флаг --config auto подтягивает правила из реестра semgrep.dev по определению языка и фреймворков. Удобно для старта.
Плюсы Semgrep
Начну с хорошего.
Быстрота. Semgrep работает на pattern matching без сложного data-flow анализа. Результат: проверка большого репозитория занимает секунды, не минуты. На проекте с 100k строк Python-кода — около 15 секунд на CI.
Низкий порог входа. Написать своё правило можно за 10 минут. Документация нормальная, есть playground на semgrep.dev — тестируешь правила в браузере. Сравните с написанием правил для SonarQube — там нужна неделя на разбор.
Open-source ядро. Базовый функционал бесплатен. Можете запускать локально, на своём CI, без отправки кода на чужие серверы. Для многих это критично.
Интеграции. Есть плагины для VS Code, IntelliJ, Vim. CI/CD: GitHub Actions, GitLab CI, Jenkins, CircleCI — готовые конфиги. Не нужно велосипедить.
Минусы Semgrep
А теперь про то, почему Semgrep — не серебряная пуля.
Шум. Из коробки false positive rate около 15-20%. Много правил дают ложные срабатывания. Приходится тьюнить: отключать правила, добавлять исключения, писать нуглы.
# Приходится добавлять такие исключения
paths:
ignore:
- "tests/"
- "migrations/"
- "legacy/"
Нет глубокого анализа. Semgrep не строит полный call graph, не отслеживает tainted data через всю кодовую базу. Для этого нужны инструменты типа CodeQL или Infer. Semgrep — это enhanced grep, не полноценный SAST.
Нужно писать правила. Да, есть реестр на 4000+ правил. Но под ваш проект, ваш стек, ваши архитектурные решения придётся писать кастом. Это требует времени и экспертизы. Не каждый младший разработчик напишет корректное правило с metavariable-regex.
Коммерческий вендор. Semgrep — американская компания. Данные уходят на серверы в США. Для российских компаний это может быть проблемой с точки зрения 152-ФЗ и требований к локализации. Open-source версия работает локально, но Pro-фичи (Supply Chain, Secrets, Custom Rules UI) — в облаке.
Нет AI. Semgrep работает по правилам. Если баг-паттерн не описан — он не будет найден. Нет адаптации под ваш код, нет обучения на истории коммитов.
Для каких проектов подходит
Честно? Semgrep идеален для трёх сценариев.
Security-first проекты. Финтех, здравоохранение, government — где есть отдельная команда AppSec. Они могут позволить себе написание и поддержку правил.
Mature команды. Когда есть время на тьюнинг и порог входа не пугает. Если у вас джуниоры пишут правила — получите ад.
Open-source. Semgrep бесплатен для публичных репозиториев. Можете добавить badges в README, прогонять проверки на каждый PR.
А вот для стартапов, которые катят быстро — Semgrep может стать обузой. Настройка, false positives, время на разбор — команда взвоет.
Сравнение инструментов
Допустим, вы выбираете статический анализатор. Вот как Semgrep выглядит на фоне альтернатив.
| Критерий | Semgrep | SonarQube | CodeQL | Distiq |
|---|---|---|---|---|
| Скорость | Секунды | Минуты | Минуты | Секунды |
| Порог входа | Низкий | Средний | Высокий | Нулевой |
| Написание правил | Нужно | Нужно | Нужно | Не нужно |
| AI-анализ | Нет | Нет | Нет | Да |
| False positives | 15-20% | 10-15% | 5-10% | 5-8% |
| Локализация (РФ) | Open-source версия | Возможна | Нет | Да |
| Цена | Free/Pro | Community/Enterprise | Free (open-source) | Подписка |
SonarQube — классика. Тяжёлый, долго настраивается, но даёт полную картину по качеству кода. Если нужна одна система на всё (quality gates, tech debt, security) — выбор очевиден. Но на настройку уйдёт месяц.
CodeQL — мощный инструмент от GitHub. Глубокий анализ, т tracking через всю кодовую базу. Но порог входа высокий: нужно знать QL-язык, понимать data flow. Бесплатен для open-source, но закрыт для коммерческого использования без лицензии GitHub Advanced Security.
Distiq — российский AI-бот для code review. Не требует написания правил: анализирует код нейросетью, находит баги, уязвимости, проблемы производительности. Интегрируется в GitLab, GitHub, GitVerse за пару минут. Данные не покидают РФ.
Когда выбрать Semgrep, а когда — альтернативу
Если у вас есть ресурсы на поддержку правил и команда security — Semgrep отличный выбор. Гибкость, скорость, open-source. Для security-команд это инструмент номер один по соотношению цена/возможности.
Если нужно быстро закрыть потребность в автоматическом ревью без настройки — смотрите в сторону AI-инструментов. Distiq, например. Две минуты на интеграцию, и каждый MR получает инлайн-комментарии с замечаниями. Без написания правил, без тьюнинга, без false positive вычитывания.
Для российского рынка есть ещё один фактор — локализация. Semgrep Pro хранит данные в США. Если ваши требования к ИБ запрещают трансграничную передачу — остаётся open-source версия или российские решения.
Как начать с Semgrep
Если решили попробовать — вот быстрый старт.
# Установка
pip install semgrep
# Первая проверка с авто-конфигом
semgrep --config auto .
# Добавить в pre-commit
repos:
- repo: https://github.com/returntocorp/semgrep
rev: v1.45.0
hooks:
- id: semgrep
args: ['--config', 'auto']
Для CI:
# .gitlab-ci.yml
semgrep:
image: returntocorp/semgrep
script:
- semgrep --config auto --json --output semgrep-report.json .
artifacts:
reports:
sast: semgrep-report.json
Начните с --config auto, посмотрите на результат. Скорее всего, часть правил придётся отключить. Потом постепенно добавляйте кастомные правила под свой стек.
И помните: статический анализ — это не замена ревью. Это фильтр, который снимает рутину. Оставляет время на то, что действительно важно — архитектуру, бизнес-логику, менторство команды.
