Когда речь заходит о статическом анализе кода в GitHub, Semgrep всплывает одним из первых. Инструмент с открытым ядром, гибкие правила, бесплатный tier — звучит как мечта. Но так ли всё радужно на практике?
Разберёмся, что умеет Semgrep, как его прикрутить к GitHub, где он работает отлично, а где создаёт больше проблем, чем решает. И, конечно, сравним с альтернативами — потому что выбор есть всегда.
Что такое Semgrep и зачем он нужен
Semgrep — это инструмент статического анализа кода (SAST). Он ищет баги, уязвимости безопасности и нарушения code style, не запуская код. Работает по принципу pattern matching: вы описываете паттерн, Semgrep находит все места, где этот паттерн встречается.
Главное отличие от классических анализаторов типа SonarQube — Semgrep не строит сложный граф потока данных (хотя добавляет эту функцию постепенно). Он быстрее, легче, и его правила пишутся на человекочитаемом DSL. Вот как выглядит правило, ищущее использование eval() в Python:
rules:
- id: dangerous-eval
pattern: eval(...)
message: "eval() is dangerous. Don't use it."
severity: WARNING
languages: [python]
Просто, правда? Любой разработчик напишет такое правило за минуту. Не нужен PhD в области статического анализа.
Semgrep поддерживает 30+ языков: Python, JavaScript, TypeScript, Java, Go, Ruby, PHP, C, C++, Rust, Swift, Kotlin и другие. Причём поддерживает хорошо — не просто "умеет парсить", а знает особенности каждого языка.
Интеграция Semgrep с GitHub
Есть три способа запустить Semgrep в пайплайне GitHub. Разберём каждый.
Через GitHub Actions
Самый распространённый вариант. Добавляете в репозиторий файл .github/workflows/semgrep.yml:
name: Semgrep
on:
pull_request:
push:
branches: [main]
jobs:
semgrep:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: returntocorp/semgrep-action@v1
with:
config: >-
p/security-audit
p/secrets
p/owasp-top-ten
Готово. Теперь при каждом PR Semgrep будет проверять код и оставлять комментарии прямо в пулл-реквесте. Бесплатно до 100 коммитов в месяц на публичных репозиториях.
Через GitHub App
У Semgrep есть готовое приложение в GitHub Marketplace. Устанавливаете в организацию, даёте доступ к репозиториям — и всё работает без единой строчки конфига.
Плюсы: не нужно возиться с Actions, получаете доступ к веб-интерфейсу Semgrep CI, где можно смотреть историю сканов, настраивать игнорирование, смотреть метрики. Минусы: данные уходят на серверы Semgrep (США), а это не всем подходит.
Локальный запуск в CI
Можно просто установить Semgrep через pip и запускать как CLI-утилиту:
pip install semgrep
semgrep --config auto --json > results.json
Это даёт полный контроль. Результаты можно парсить, отправлять куда угодно, интегрировать с любой системой. Но и настраивать придётся всё самостоятельно.
Сильные стороны Semgrep
По моему опыту, Semgrep отлично работает в нескольких сценариях.
Быстрый старт. Сконфигурировали, запустили — через 5 минут получаете первые находки. Не нужно неделю настраивать правила под свой проект. Встроенные наборы правил (p/security-audit, p/owasp-top-ten, p/secrets) покрывают типичные проблемы из коробки.
Кастомные правила. Написать правило под специфический паттерн вашего проекта — дело пары минут. На одном проекте мы написали правило, которое ловило использование deprecated-функций нашего внутреннего API. Semgrep нашёл 47 мест, которые мы пропустили бы при обычном code review.
Скорость работы. Semgrep быстрый. На проекте в 100K строк он отрабатывает за 10-20 секунд. Для сравнения: SonarQube на том же проекте думает минуты. Это критично для CI/CD — никто не хочет ждать 10 минут после каждого коммита.
Open source ядро. Можно использовать бесплатно, модифицировать, запускать на своих серверах. Коммерческая версия добавляет продвинутые правила (Semgrep Pro), AI-ассистента, интеграции — но базовый функционал доступен всем.
Где Semgrep подводит
Не всё так радужно. Есть моменты, которые бесят.
False positives. Semgrep иногда находит проблемы там, где их нет. Например, правило, ищущее SQL-инъекции, может ругаться на параметризованные запросы, если не понимает контекст. Приходится либо глушить предупреждения, либо дорабатывать правила.
# Semgrep может ругаться и на такое, если правило слишком агрессивное
cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))
Поверхностный анализ. Semgrep не умеет строить полный граф потока данных (taint analysis) в бесплатной версии. Он найдёт eval(user_input), но может пропустить случай, когда user_input приходит через три функции и глобальную переменную. Для глубокого анализа уязвимостей нужен Semgrep Pro — а это уже платно.
Настройка игнорирования. Файл .semgrepignore работает по принципу .gitignore, но есть нюансы. На одном проекте мы полдня разбирались, почему Semgrep не проверяет определённую директорию. Оказалось, порядок паттернов в файле имеет значение, а документация об этом умалчивает.
Данные за рубежом. Если используете Semgrep CI App — ваши код и метрики уходят на серверы в США. Для многих российских компаний это стоп-фактор. Можно развернуть self-hosted версию, но это уже усложнение инфраструктуры.
Сравнение Semgrep с альтернативами
Поговорим о конкурентах. Сравним по критериям, которые реально важны в работе.
| Критерий | Semgrep | CodeQL | SonarQube | Distiq |
|---|---|---|---|---|
| Цена | Free / $50/мес | Free для open source | $150/мес | От 3000 руб/мес |
| Скорость | 10-30 сек | 2-10 мин | 1-5 мин | 15-60 сек |
| Настройка | Минимальная | Сложная | Средняя | Минимальная |
| Кастомные правила | Очень лёгкие | Сложные | Средние | — |
| Taint analysis | В Pro версии | Есть | Есть | Есть |
| Серверы | США | США | Self-hosted | РФ |
CodeQL — главный конкурент от GitHub. Мощный, глубокий анализ, строит полноценный граф потока данных. Но: сложный в настройке, медленный, требует expertise. Бесплатен только для open source проектов. Если у вас приватный репозиторий — готовьте кошелёк.
SonarQube — классика жанра. Есть всё: quality gates, метрики, история, интеграции. Но тяжёлый, дорогой, требует отдельного сервера. Для маленькой команды — overkill.
Distiq — российский AI-бот для code review. Работает с GitLab, GitHub, GitVerse. Интегрируется за 2 минуты через webhook, серверы в РФ, данные не уходят за рубеж. Анализирует код с помощью LLM — находит баги, уязвимости, проблемы с производительностью. Не требует написания правил, понимает контекст лучше, чем pattern-matching инструменты.
Кому подходит Semgrep
Semgrep — отличный выбор, если:
- Нужен быстрый SAST с минимальной настройкой
- Важны кастомные правила под специфику проекта
- Команда готова мириться с false positives и донастраивать правила
- Нет ограничений на передачу данных за рубеж
Не подойдет, если:
- Нужен глубокий taint analysis без покупки Pro
- Требуется максимальная точность (минимум ложных срабатываний)
- Есть строгие требования по локализации данных
- Нет ресурсов на поддержку и доработку правил
Практические рекомендации
По-хорошему, один инструмент не закроет все потребности. Идеальная схема, которую я видел на продвинутых проектах:
- Pre-commit: легковесные линтеры (eslint, ruff, black) — быстро, локально, блокирует очевидные проблемы.
- CI/PR: Semgrep или аналог — поиск security-проблем и типичных багов.
- Nightly/Weekly: глубокий анализ (CodeQL, SonarQube) — сложные уязвимости, метрики качества.
Если ресурсов мало — начните с Semgrep. Он даст 80% результата за 20% усилий. Потом добавите инструменты по необходимости.
Резюме
Semgrep + GitHub — рабочая комбинация, которую используют тысячи команд. Быстрая настройка, гибкие правила, бесплатный tier — это плюсы. False positives, ограниченный taint analysis в бесплатной версии, серверы в США — это минусы.
Для российских команд, которым важна локализация данных, есть альтернативы. Я сейчас тестирую Distiq для наших проектов — он закрывает потребности в автоматическом code review, при этом данные остаются в РФ. Интеграция через webhook заняла пару минут, AI находит проблемы, которые Semgrep пропускает из-за ограничений pattern-matching. Если для вас критична работа с российским сервисом — попробуйте, это хорошая альтернатива Semgrep для GitHub.
