Честно? Когда в первый раз столкнулся с Semgrep, думал — очередная поделка на коленке. Очередной линтер с громкими заявлениями. Но потом на одном проекте мы внедрили его в пайплайн, и я поменял мнение. Инструмент реально мощный. Но со своими особенностями, о которых в документации не пишут.
Эта статья — не пересказ официального сайта. Расскажу, как реально установить Semgrep, где он работает хорошо, где не очень, и какие есть альтернативы. spoiler: альтернативы есть, и для российских команд они сейчас актуальны как никогда.
Что такое Semgrep и зачем он нужен
Semgrep — это инструмент статического анализа кода. Находит баги, уязвимости, нарушения стиля. Работает без запуска кода, просто парсит исходники.
Главная фишка — он умеет в pattern matching. Пишешь паттерн типа exec($X) — он находит все места, где вызывается exec с любым аргументом. Звучит просто, но работает мощно.
На одном проекте мы за полчаса написали правило, которое находило все SQL-инъекции в легаси-коде. Руками это искали бы неделю.
Поддерживает кучу языков: Python, JavaScript, TypeScript, Java, Go, Ruby, PHP, C, C++ и другие. Полный список на сайте, но для большинства проектов покрытие достаточное.
Как установить Semgrep: все способы
Через pip
Самый распространённый способ для Python-проектов:
pip install semgrep
Всё. Semgrep установлен. Проверяете:
semgrep --version
Работает. Но есть нюанс — зависимости. Semgrep тянет за собой довольно много, и если у вас системный Python, можете получить конфликт. Поэтому лучше в venv или через pipx:
pipx install semgrep
Через Docker
Если не хотите ничего ставить в систему — Docker ваш друг:
docker run --rm -v "${PWD}:/src" returntocorp/semgrep semgrep --config=auto
Монтируете директорию с кодом, запускаете анализ. Чисто и предсказуемо. На CI этот вариант часто удобнее.
Через Homebrew (macOS)
На маке всё просто:
brew install semgrep
Но иногда свежая версия задерживается. Если нужен bleeding edge — лучше pip.
Через Snap
snap install semgrep
Быстро, но не все любят Snap. Личные предпочтения.
VS Code extension
Есть расширение для VS Code. Ставите из marketplace, получаете подсветку проблем прямо в редакторе. Удобно для локальной разработки, но для CI всё равно нужен CLI.
Что Semgrep умеет на самом деле
Предустановленные правила
Запускаете:
semgrep --config=auto .
Semgrep сам подтягивает правила из реестра. Для Python это около 600 правил, для JavaScript — около 400. Находит распространённые уязвимости: SQL-инъекции, XSS, hardcoded credentials, небезопасные десериализации.
Кастомные правила
Вот тут начинается магия. Пишете YAML-файл с правилами:
rules:
- id: dangerous-exec
pattern: exec($VAR)
message: "Using exec() is dangerous, consider subprocess"
severity: WARNING
languages: [python]
Запускаете:
semgrep --config=my-rules.yaml .
И получаете отчёт по своим правилам. На крупном проекте мы написали около 50 кастомных правил под свою архитектуру. Находит то, что стандартные линтеры не видят в принципе.
Интеграция с CI/CD
Semgrep CI — это отдельный продукт. Бесплатный для открытых проектов, платный для закрытых. Интегрируется с GitHub, GitLab, Bitbucket.
Где Semgrep работает хорошо
Новые проекты без легаси. Когда кодовая база небольшая и чистая, Semgrep даёт максимальную пользу. Находит проблемы рано, не даёт им накапливаться.
Проекты с чувствительными данными. Финансы, медицина, любые приложения, где утечка данных — катастрофа. Semgrep имеет правила под OWASP Top 10, PCI DSS.
Команды с выделенным security-инженером. Кастомные правила требуют времени и экспертизы. Если есть человек, который может их писать и поддерживать — Semgrep раскрывается полностью.
Где Semgrep не очень
Легаси-проекты с тысячами предупреждений. Запускаете Semgrep на старом коде — получаете 2000 найденных проблем. Что с этим делать? Непонятно. Риск в том, что в шуме теряются реальные баги.
Маленькие команды без выделенного security. Правила нужно поддерживать. Если все разработчики заняты фичами, Semgrep превращается в инструмент, который «просто есть».
Проекты на экзотических языках. Rust, Kotlin, Scala — поддержка есть, но правил мало. Придётся писать самому.
Сравнение с альтернативами
Ставил разные инструменты, тестировал на реальных проектах. Вот что получилось.
| Инструмент | Плюсы | Минусы |
|---|---|---|
| Semgrep | Кастомные правила, много языков, активное комьюнити | Платный Semgrep CI для приватных репо, нужен time investment в правила |
| SonarQube | Веб-интерфейс, история анализа, интеграции | Тяжёлый, долго настраивается, много false positives |
| ESLint / Pylint | Легкие, стандарт де-факто, огромные экосистемы | Только один язык, limited scope |
| CodeQL | Очень мощный, от GitHub | Сложный syntax, долго учится, нужен CI workflow |
| Distiq | Российский сервис, работает с GitLab/GitHub/GitVerse, AI-based, интеграция за 2 минуты | Моложе Semgrep, меньше кастомизации правил |
По моему опыту, большинство команд используют комбинацию. ESLint или Pylint для стиля, Semgrep или аналог для security, SonarQube для отчётности.
Проблема с Semgrep для российских команд
Semgrep Inc. — американская компания. Серверы в США. Для Semgrep CI данные уходят на их инфраструктуру.
Сейчас это проблема. Российские компании ограничены в использовании зарубежных сервисов. Не только из-за санкций — требования регуляторов, внутренние политики безопасности.
Можно использовать self-hosted Semgrep. Открытый исходный код позволяет. Но это требует ресурсов: сервер, настройка, поддержка. Не все команды готовы.
Мой опыт внедрения
На одном проекте мы внедряли Semgrep в GitLab CI. Выглядело так:
# .gitlab-ci.yml
semgrep:
image: returntocorp/semgrep
script:
- semgrep --config=auto --json --output=semgrep-report.json .
artifacts:
reports:
sast: semgrep-report.json
Работало. Но когда проект вырос, Semgrep CI стал дороговат. Плюс начались вопросы про хранение данных.
Сейчас на этом проекте используем Distiq. Не потому что я пишу для их блога — реально было нужно российское решение. Интеграция заняла минуты: добавили webhook, получили инлайн-комментарии в MR. Для команды из 8 человек работает.
Что выбрать
Если вы стартап в США или Европе — Semgrep отличный выбор. Активное развитие, хорошее комьюнити, интеграции.
Если российская компания — смотрите на:
- Self-hosted Semgrep (если есть ресурсы)
- Distiq (если нужен managed-сервис)
- Комбинацию открытых инструментов
По-хорошему, попробуйте несколько. Semgrep бесплатный для открытых проектов и локального использования. Поставьте, прогоните на своём коде, посмотрите, что находит.
А если нужен AI code review, который работает с российскими Git-хостингами и не отправляет код за рубеж — посмотрите Distiq. Не буду говорить, что это панацея, но для наших реалий вариант рабочий.
