Что такое Semgrep?
Semgrep — это мощный инструмент статического анализа кода, который помогает находить баги, уязвимости безопасности и проблемы качества кода. Он поддерживает множество языков программирования и позволяет создавать собственные правила анализа.
Основные возможности Semgrep
- Многоязычная поддержка — Python, JavaScript, Java, Go, C/C++, Ruby, PHP и другие
- Быстрая работа — анализ больших кодовых баз за секунды
- Простые правила — написание правил на языке, похожем на исходный код
- Готовые наборы правил — библиотека правил для безопасности и качества
- CI/CD интеграция — встраивание в pipeline разработки
- IDE поддержка — плагины для популярных редакторов
Установка Semgrep
Установка через pip:
Базовое использование
Сканирование проекта с готовыми правилами:
1# Сканирование на уязвимости безопасности
2semgrep --config=p/security-audit /path/to/project
3
4# Сканирование Python кода
5semgrep --config=p/python /path/to/python-project
6
7# Сканирование JavaScript/TypeScript
8semgrep --config=p/javascript /path/to/js-project
9
10# Комплексное сканирование
11semgrep --config=auto /path/to/project
Создание собственных правил
Пример правила для поиска SQL инъекций в Python:
1# sql-injection.yml
2rules:
3 - id: sql-injection-risk
4 pattern-either:
5 - pattern: |
6 cursor.execute($QUERY % $VAR)
7 - pattern: |
8 cursor.execute($QUERY + $VAR)
9 - pattern: |
10 cursor.execute(f"... {$VAR} ...")
11 message: "Potential SQL injection vulnerability"
12 languages:
13 - python
14 severity: ERROR
15 metadata:
16 cwe: "CWE-89: SQL Injection"
17 owasp: "A03:2021 - Injection"
Запуск с собственным правилом:
1semgrep --config=sql-injection.yml /path/to/code
Интеграция с Python проектом
Пример использования Semgrep в Python скрипте:
1import subprocess
2import json
3
4def run_semgrep_scan(project_path, config="p/security-audit"):
5 """Запуск Semgrep сканирования"""
6
7 cmd = [
8 "semgrep",
9 "--config", config,
10 "--json",
11 "--quiet",
12 project_path
13 ]
14
15 try:
16 result = subprocess.run(cmd, capture_output=True, text=True, check=True)
17 findings = json.loads(result.stdout)
18
19 return {
20 "success": True,
21 "findings": findings.get("results", []),
22 "errors": findings.get("errors", [])
23 }
24 except subprocess.CalledProcessError as e:
25 return {
26 "success": False,
27 "error": e.stderr
28 }
29
30# Использование
31scan_results = run_semgrep_scan("/path/to/project")
32
33if scan_results["success"]:
34 print(f"Найдено проблем: {len(scan_results['findings'])}")
35 for finding in scan_results["findings"]:
36 print(f"- {finding['check_id']}: {finding['message']}")
37else:
38 print(f"Ошибка сканирования: {scan_results['error']}")
Интеграция с CI/CD
Пример для GitHub Actions:
1name: Semgrep Security Scan
2
3on:
4 push:
5 branches: [ main, develop ]
6 pull_request:
7 branches: [ main ]
8
9jobs:
10 semgrep:
11 runs-on: ubuntu-latest
12
13 steps:
14 - uses: actions/checkout@v3
15
16 - name: Run Semgrep
17 uses: returntocorp/semgrep-action@v1
18 with:
19 config: >-
20 p/security-audit
21 p/secrets
22 p/python
23 generateSarif: "1"
24
25 - name: Upload SARIF file
26 uses: github/codeql-action/upload-sarif@v2
27 with:
28 sarif_file: semgrep.sarif
29 if: always()
Применение Semgrep
- Поиск уязвимостей — обнаружение проблем безопасности в коде
- Code Review — автоматизация проверки кода
- Соблюдение стандартов — проверка coding guidelines
- Поиск багов — обнаружение типичных ошибок программирования
- Рефакторинг — поиск устаревших паттернов кода
Преимущества использования
- Простота правил — правила пишутся на языке, похожем на код
- Скорость — быстрый анализ больших кодовых баз
- Точность — минимум ложных срабатываний
- Гибкость — легко создавать собственные правила
- Интеграция — поддержка популярных инструментов и платформ
Популярные наборы правил
- p/security-audit — правила безопасности для всех языков
- p/secrets — поиск секретов и токенов в коде
- p/owasp-top-ten — правила OWASP Top 10
- p/cwe-top-25 — CWE Top 25 наиболее опасных уязвимостей
- p/python — специфичные правила для Python
FAQ
Может ли Semgrep заменить другие SAST инструменты?
Semgrep отлично дополняет существующие инструменты, предоставляя быструю и точную проверку. Для комплексной безопасности рекомендуется использовать несколько инструментов.
Поддерживает ли Semgrep анализ зависимостей?
Semgrep фокусируется на анализе исходного кода. Для анализа зависимостей используйте специализированные инструменты как Safety, Snyk или OWASP Dependency Check.
Можно ли использовать Semgrep в больших проектах?
Да, Semgrep оптимизирован для работы с большими кодовыми базами и может сканировать миллионы строк кода за минуты.