🛠 Semgrep: custom как фича и почему начинаем с него?
Салют, начнем,
Я бы хотел поговорить про
Static Application Security Testing - метод анализа, при котором проверяется статичный исходный код на наличие уязвимостей. Это подход «белого ящика».
Теперь давайте посмотрим на сам инструмент, а начем с полезной выжимки, такой как
- Tool позволяет работать с приложением в нетривиальном режиме: dataflow/ taint-трекинг, межфайловые цепочки
- Приоритизирует уязвимости зависимостей по достижимости/использованию (reachability)
- Масштабируется и в custom под написание своих собственных политик
- Определение и валидация активных секретов
- Анализирует код с помощью синтаксических шаблонов
- Поддерживает множество языков (Python, JavaScript, TypeScript, Java, Go, C/C++, Ruby и др.)
- baseline-commit
- Для фиксирования инкременты без задержек с вычислением diff не нужно костылить
- Может в pre-commit
- Тип лицензии: LGPL 2.1 (ранние версии — проприетарные, сейчас полностью opensource)
- Форматы отчетов: JSON, SARIF, GitLab SAST, JUnit XML, Text, Emacs, Vim
Вообще, задуман инструмент как opensource, который анализирует код с помощью синтаксических шаблонов, но у него есть платная версия, которая включает дополнительные правила, делает более глубокий анализ, гибок и многое другое. А мы и не знали, что хорошее платненько. Лицензируется по количеству контрибьюторов по 40 американских.
Приведу команды для работы с инструментов, которые помогут разобраться детальнее и научиться им пользоваться
# Установка через pip (или brew, docker)
python -m pip install semgrep
# Сканирование репозитория
semgrep scan --config auto # автоопределение языка и базовых правил
semgrep scan --config p/python # только Python-правила (варианты - p/gosec/ golang/ javascript/ dockerfile/ react/ secrets/ owasp-top-ten)
# CI/CD
semgrep ci # для использования semgrep в составе пайплайна
semgrep scan --config "p/ci" --exclude "tests/" # исключение директории
semgrep ci --allow--untristed-validators # разрешение работы с ненадежными источниками правил, отличными от semgrep.dev
semgrep ci --code # запуск статического анализатора от semgrep
semgrep ci --autofix # внедрение в правило автоправок от инструмента (экспериментальная функция)
semgrep ci --dryrun # отмена внесения автоисправлений в правила
# Вывод в SARIF (для GitHub Security)
semgrep scan --config auto --sarif -o results.sarif
# Docker
docker pull returntocorp/semgrep
docker run -v $(pwd):/src returntocorp/semgrep semgrep scan --config auto // запуск сканирования
Ну и зацепим как происходит интеграции в pipeline
CI/CD
semgrep_scan:
stage: security
image: returntocorp/semgrep
script:
- semgrep scan --config auto --sarif -o semgrep.sarif
artifacts:
reports:
sarif: semgrep.sarif
pipeline {
agent any
environment {
REPORT_DIR = 'semgrep-reports'
}
stages {
stage('Semgrep Scan') {
steps {
sh '''
docker run -v $(pwd):/src returntocorp/semgrep \
semgrep scan --config auto --json -o ${REPORT_DIR}/semgrep.json
'''
}
}
}
post {
always {
archiveArtifacts artifacts: '${REPORT_DIR}/**'
}
}
}
#toolchain #sast
