Композиционный анализ (КА) и SBOM

CodeGraph включает встроенный модуль композиционного анализа для проверки зависимостей, поиска уязвимостей и формирования SBOM. Модуль покрывает требования процесса 5.16 ГОСТ Р 56939-2024.

Обзор

Конвейер композиционного анализа:

Парсеры зависимостей → Генератор SBOM → Проверка уязвимостей → Отчёт
         ↓                    ↓                    ↓                ↓
   7 модулей парсеров   CycloneDX 1.5       4 источника       SARIF/ГОСТ/JSON
   7 экосистем          SPDX 2.3            SQLite-кэш        Коды возврата CI

Поддерживаемые языки

Язык Парсер Файлы манифестов
Python PythonDependencyParser requirements.txt, pyproject.toml, Pipfile, setup.py
JavaScript/TypeScript JavaScriptDependencyParser package.json, yarn.lock, pnpm-lock.yaml
Go GoDependencyParser go.mod, go.sum
Java/Kotlin JavaDependencyParser pom.xml, build.gradle, build.gradle.kts
C# CSharpDependencyParser *.csproj, packages.config, Directory.Packages.props
PHP PHPDependencyParser composer.json, composer.lock
C/C++ CCppDependencyParser conanfile.txt, conanfile.py, vcpkg.json, CMakeLists.txt

Текущая реализация содержит 7 модулей парсеров и покрывает Python, JavaScript/TypeScript, Go, Java/Kotlin, C#, PHP и C/C++. TypeScript использует парсер JavaScript. Kotlin использует парсер Java (build.gradle.kts). 1С:Предприятие не имеет стандартного менеджера пакетов.

Источники уязвимостей

Источник Описание Аутентификация
OSV База данных уязвимостей открытого ПО Не требуется
GitHub Advisory Рекомендации по безопасности GitHub (GraphQL) GITHUB_TOKEN
NVD Национальная база уязвимостей NIST (API v2.0) NVD_API_KEY
БДУ ФСТЭК Федеральная база уязвимостей Не требуется

Результаты кэшируются локально в SQLite (data/vuln_cache.sqlite) с настраиваемым сроком действия.

Команды CLI

Формирование SBOM

python -m src.cli sbom generate --format cyclonedx --output sbom.json
python -m src.cli sbom generate --format spdx --project myproject

Форматы: cyclonedx (CycloneDX 1.5, по умолчанию), spdx (SPDX 2.3).

Аудит зависимостей

# Базовый аудит (только OSV)
python -m src.cli sbom audit

# Полный аудит с несколькими источниками
python -m src.cli sbom audit --sources osv,nvd,bdu --format sarif --output sca.sarif

# Режим CI: код возврата 1 при критических уязвимостях
python -m src.cli sbom audit --fail-on critical --format json

Коды возврата: - 0 — уязвимостей выше порога нет - 1 — есть уязвимости выше порога --fail-on - 2 — ошибка выполнения

Форматы вывода: json, sarif, markdown, gost.

Синхронизация кэша уязвимостей

python -m src.cli sbom sync --sources osv,nvd,bdu
python -m src.cli sbom sync --force  # очистка и пересинхронизация

Формирование отчёта ГОСТ

python -m src.cli sbom gost-report --language ru --output gost_sca.md
python -m src.cli sbom gost-report --language en

Формирует отчёт в формате Markdown с четырьмя разделами по ГОСТ Р 56939-2024 5.16.3: - 5.16.3.2 — Перечень зависимостей - 5.16.3.3 — Контроль актуальности версий - 5.16.3.4 — Результаты проверки на уязвимости - 5.16.3.5 — Рекомендации по обновлению

REST API

Все маршруты SCA смонтированы под /api/v1/deps.

Project-scoped конечные точки (основной контракт)

Метод Путь Описание
GET /api/v1/deps/projects/{project_name}/summary SCA summary зарегистрированного проекта: scan_status, инвентарь, лицензии и счётчики уязвимостей
GET /api/v1/deps/projects/{project_name}/dependencies Инвентарь зависимостей зарегистрированного проекта
GET /api/v1/deps/projects/{project_name}/vulnerabilities Результаты проверки уязвимостей по зарегистрированному проекту
GET /api/v1/deps/projects/{project_name}/sbom Экспорт SBOM проекта в формате spdx или cyclonedx
POST /api/v1/deps/projects/{project_name}/audit Project-scoped аудит уязвимостей (json или sarif)
GET /api/v1/deps/projects/{project_name}/gost-report Project-scoped Markdown-отчёт ГОСТ 5.16.3

Web-экраны SCA / SBOM используют именно project-scoped endpoints выше. Портфельный агрегат /api/v2/dashboard/sca/overview остаётся доступным, но не является основным источником данных для проектного SCA-экрана.

Legacy scan-scoped endpoints (compatibility)

Эти маршруты сохранены для CLI/manual workflow, где временный граф сначала загружается через /scan, но они не являются каноническим multi-project контрактом:

Метод Путь Описание
POST /api/v1/deps/scan Сканирование произвольного пути в legacy in-memory graph
GET /api/v1/deps/list Чтение зависимостей из последнего legacy scan
GET /api/v1/deps/graph Чтение графа зависимостей из последнего legacy scan
POST /api/v1/deps/check-vulnerabilities Проверка уязвимостей для последнего legacy scan
GET /api/v1/deps/outdated Устаревшие пакеты для последнего legacy scan
GET /api/v1/deps/licenses Сводка лицензий для последнего legacy scan
GET /api/v1/deps/health-score Health score для последнего legacy scan
GET /api/v1/deps/sbom Экспорт SBOM для последнего legacy scan
POST /api/v1/deps/audit Аудит последнего legacy scan
GET /api/v1/deps/gost-report ГОСТ-отчёт для последнего legacy scan
POST /api/v1/deps/sync-cache Синхронизация общего кэша уязвимостей

POST /api/v1/deps/projects/{project_name}/audit

Аудит зависимостей с настраиваемыми источниками и порогом серьёзности.

{
  "sources": ["osv", "nvd", "bdu_fstec"],
  "fail_on": "critical",
  "format": "json"
}

Ответ содержит threshold_breached: true при превышении порога.

GET /api/v1/deps/projects/{project_name}/gost-report

Формирование отчёта ГОСТ 5.16.3.

GET /api/v1/deps/projects/codegraph/gost-report?language=ru

Возвращает {"format": "markdown", "language": "ru", "content": "..."}.

POST /api/v1/deps/sync-cache

Синхронизация локального кэша уязвимостей.

{
  "sources": ["osv", "nvd", "bdu_fstec"],
  "force": false
}

Инструменты MCP

Три инструмента MCP для интеграции с IDE:

Инструмент Описание
codegraph_sbom_generate Формирование SBOM (формат, проект)
codegraph_sbom_audit Аудит уязвимостей (источники, порог, формат)
codegraph_sbom_sync Синхронизация кэша (источники, принудительно)

Конфигурация

В config.yaml в разделе dependencies:

dependencies:
  enabled: true
  vulnerability:
    sources: [osv, github_advisory, nvd, bdu_fstec]

  vuln_cache:
    enabled: true
    db_path: "data/vuln_cache.sqlite"
    ttl_hours: 24
    sync_interval_hours: 12

  sources:
    osv:
      enabled: true
    nvd:
      enabled: true
      api_key_env: "NVD_API_KEY"
      rate_limit_per_second: 5
    bdu_fstec:
      enabled: true
      base_url: "https://bdu.fstec.ru/api"
    github_advisory:
      enabled: true
      token_env: "GITHUB_TOKEN"

  ci:
    fail_on: "critical"
    sarif_output: "sca-results.sarif"

  sbom:
    default_format: "cyclonedx"
    cyclonedx_version: "1.5"
    include_dev_deps: false

Доступ через get_unified_config().sca:

from src.config import get_unified_config
cfg = get_unified_config().sca
cfg.ci_fail_on          # "critical"
cfg.sbom_default_format # "cyclonedx"
cfg.vuln_cache_ttl_hours # 24

Интеграция с CI

Рабочий процесс GitHub Actions: .github/workflows/sca-audit.yml:

- name: Аудит зависимостей
  run: python -m src.cli sbom audit --sources osv --format sarif --output sca-results.sarif --fail-on critical

- name: Загрузка SARIF
  uses: github/codeql-action/upload-sarif@v3
  with:
    sarif_file: sca-results.sarif

Рабочий процесс запускается при изменении файлов манифестов зависимостей: 1. Формирует CycloneDX SBOM 2. Выполняет аудит с --fail-on critical (блокирует конвейер при критических уязвимостях) 3. Загружает SARIF в GitHub Code Scanning 4. Сохраняет SBOM как артефакт сборки

Соответствие ГОСТ Р 56939-2024

Модуль КА покрывает процесс 5.16 через SCAEvaluator в подсистеме соответствия. Запуск:

python -m src.cli compliance gost-56939 --format markdown --language ru

Оценщик проверяет 5 артефактов: 1. SBOM (5.16.3.2) 2. Контроль актуальности (5.16.3.3) 3. Проверка уязвимостей (5.16.3.4) 4. Рекомендации по обновлению (5.16.3.5) 5. Множественные источники уязвимостей

Статус: 0 = ПРОБЕЛ, 1–3 = ЧАСТИЧНО, 4–5 = ПОЛНОСТЬЮ.

Экспорт SARIF

Результаты КА экспортируются в формате SARIF 2.1.0, совместимом с: - GitHub Code Scanning - VS Code SARIF Viewer - Azure DevOps

Соответствие серьёзности: CRITICAL/HIGH → error, MEDIUM → warning, LOW → note.

Каждая находка содержит: - Расположение файла манифеста и номер строки - Версию исправления (при наличии) - Поддержку подавления (suppressed, suppression_reason)

Архитектура

src/dependencies/
    parsers/
        python.py, javascript.py, go.py     # существующие
        java.py, c_cpp.py, csharp.py, php.py # новые
        __init__.py                          # реестр ALL_PARSERS
    models.py           # Dependency, Vulnerability, SCAFinding и др.
    vulnerability.py    # VulnerabilityChecker (OSV, GitHub, NVD, БДУ ФСТЭК)
    vuln_cache.py       # SQLite-кэш с TTL
    license_checker.py  # CycloneDX 1.5, SPDX 2.3
    sarif_export.py     # SARIF 2.1.0 для находок КА
    gost_report.py      # Генератор отчёта ГОСТ 5.16.3
    graph.py            # DependencyGraphBuilder (NetworkX)
    analyzer.py         # Устаревшие, неиспользуемые, показатель здоровья
src/cli/sbom_commands.py    # CLI: sbom generate/audit/sync/gost-report
src/api/routers/dependencies.py  # REST API (project-scoped + legacy compatibility)
src/mcp/tools/sca.py       # Инструменты MCP (3)
src/compliance/gost_56939/evaluators/automated.py  # SCAEvaluator