Что такое Semgrep?

Semgrep — это мощный инструмент статического анализа кода, который помогает находить баги, уязвимости безопасности и проблемы качества кода. Он поддерживает множество языков программирования и позволяет создавать собственные правила анализа.

Основные возможности Semgrep

  • Многоязычная поддержка — Python, JavaScript, Java, Go, C/C++, Ruby, PHP и другие
  • Быстрая работа — анализ больших кодовых баз за секунды
  • Простые правила — написание правил на языке, похожем на исходный код
  • Готовые наборы правил — библиотека правил для безопасности и качества
  • CI/CD интеграция — встраивание в pipeline разработки
  • IDE поддержка — плагины для популярных редакторов

Установка Semgrep

Установка через pip:

1pip install semgrep
2# или
3poetry add semgrep
4
5# Установка через Homebrew (macOS)
6brew install semgrep
7
8# Установка через Docker
9docker pull returntocorp/semgrep

Базовое использование

Сканирование проекта с готовыми правилами:

 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 оптимизирован для работы с большими кодовыми базами и может сканировать миллионы строк кода за минуты.