Skip to content

RFC-005: Автоматизированная система проверки безопасности CVE

Причина отклонения

Данный RFC отклонён по следующим причинам:

1. cargo audit уже полностью удовлетворяет потребностям

В экосистеме Rust уже есть зрелый инструмент cargo audit, который:

  • Автоматически обнаруживает известные CVE в зависимостях
  • Проверяет устаревшие зависимости
  • Просто интегрируется с CI/CD

Нет необходимости изобретать велосипед.

2. Несоответствие затрат и выгод

Для разработки собственной системы CVE-сканирования требуется:

  • Постоянное поддержание базы данных уязвимостей
  • Регулярное обновление правил обнаружения
  • Разработка функций с AI-усилением (сложно и эффективность неопределённа)

При этом cargo audit уже достаточно хорош.


Краткое описание

Данный RFC предлагает создание автоматизированной системы проверки безопасности CVE (Common Vulnerabilities and Exposures) на основе AI-усиления + GitHub Actions, которая автоматически выполняет сканирование безопасности при коммитах кода, изменениях зависимостей и в точках публикации релизов, а также раннего обнаружения и оповещения о потенциальных угрозах безопасности.

Мотивация

Почему эта функция необходима?

Безопасность проектов с открытым исходным кодом становится всё более важной:

  1. Риски уязвимостей в зависимостях: сторонние зависимости, используемые проектом, могут содержать известные уязвимости
  2. Атаки на цепочку поставок: вредоносный код может быть внедрён через цепочку зависимостей
  3. Своевременное обнаружение: после обнаружения уязвимости необходимо быстро оценить влияние и устранить её
  4. Требования соответствия: корпоративные пользователи предъявляют требования к соответствию кода стандартам безопасности

Текущие проблемы

В текущем проекте существуют следующие проблемы безопасности:

  • Неизвестные зависимости: отсутствует систематическое отслеживание версий и состояния уязвимостей зависимостей Cargo/Rust
  • Ручная проверка: обновление зависимостей и аудит безопасности зависят от ручной проверки
  • Отсутствие CI-интеграции: нет обязательной проверки безопасности в CI-процессе
  • Отсутствие оповещений: невозможно своевременно оценить влияние после публикации новых CVE

Предложение

Основная архитектура

┌─────────────────────────────────────────────────────────────┐
│                   Архитектура проверки безопасности          │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│  ┌─────────────┐    ┌─────────────┐    ┌─────────────┐     │
│  │  Коммит     │    │  Изменение  │    │  Плановый   │     │
│  │  кода       │    │  зависимостей│   │  запуск     │     │
│  └──────┬──────┘    └──────┬──────┘    └──────┬──────┘     │
│         │                  │                  │             │
│         └──────────────────┼──────────────────┘             │
│                            │                                │
│                            ▼                                │
│              ┌─────────────────────────┐                    │
│              │     GitHub Actions      │                    │
│              │     автоматизированный  │                    │
│              │     рабочий процесс     │                    │
│              └───────────┬─────────────┘                    │
│                          │                                  │
│          ┌───────────────┼───────────────┐                  │
│          ▼               ▼               ▼                  │
│   ┌────────────┐  ┌────────────┐  ┌────────────┐           │
│   │Сканирование│  │Анализ      │  │AI-оценка   │           │
│   │уязвимостей │  │безопасности│  │рисков      │           │
│   │зависимостей│  │кода        │  │(LLM)      │           │
│   │(Cargo)    │  │(Semgrep)  │  │           │           │
│   └────────────┘  └────────────┘  └────────────┘           │
│                          │                                  │
│                          ▼                                  │
│              ┌─────────────────────────┐                    │
│              │   База данных уязвимостей│                    │
│              │   + AI-анализ            │                    │
│              │  (NVD + GitHub Advisories│                    │
│              │   + пользовательские     │                    │
│              │   правила)               │                    │
│              └───────────┬─────────────┘                    │
│                          │                                  │
│                          ▼                                  │
│              ┌─────────────────────────┐                    │
│              │   Отчёт о безопасности   │                    │
│              │   + уведомления об       │                    │
│              │   угрозах               │                    │
│              └─────────────────────────┘                    │
│                                                              │
└─────────────────────────────────────────────────────────────┘

Выбор технологий

КомпонентТехнологическое решениеОписание
Сканирование уязвимостей зависимостейcargo-auditИнтеграция официальной базы данных уязвимостей Rust
Анализ безопасности кодаSemgrepСтатический анализ с поддержкой пользовательских правил
AI-оценка рисковOpenAI API / Claude APIАнализ влияния уязвимостей и рекомендации по исправлению
База данных уязвимостейNVD + GitHub Advisory DBОфициальные источники данных об уязвимостях
Оркестрация рабочих процессовGitHub ActionsВстроенная интеграция, без дополнительной инфраструктуры

Дизайн рабочих процессов GitHub Actions

1. Проверка при коммите (security-check.yml)

yaml
# .github/workflows/security-check.yml
name: Security Check

on:
  push:
    branches: [main, develop]
    paths:
      - '**/Cargo.toml'
      - '**/Cargo.lock'
      - 'src/**'
      - 'rust-toolchain*'
  pull_request:
    paths:
      - '**/Cargo.toml'
      - '**/Cargo.lock'
      - 'src/**'

jobs:
  dependency-audit:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Setup Rust
        uses: dtolnay/rust-toolchain@stable
        with:
          toolchain: stable

      - name: Cache dependencies
        uses: actions/cache@v4
        with:
          path: |
            ~/.cargo/bin/
            ~/.cargo/registry/index/
            ~/.cargo/registry/cache/
            target/
          key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
          restore-keys: |
            ${{ runner.os }}-cargo-

      - name: Run cargo-audit
        uses: actions-rs/audit-check@v1
        with:
          token: ${{ secrets.GITHUB_TOKEN }}
        continue-on-error: true

      - name: AI Vulnerability Analysis
        if: failure()
        run: |
          echo "Running AI analysis..."
          # Вызов AI-анализа уязвимостей
        env:
          OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}

  code-security:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Run Semgrep
        uses: returntocorp/semgrep-action@v1
        with:
          config: >-
            r/security-audit r/lang-rust
        continue-on-error: true

  generate-report:
    needs: [dependency-audit, code-security]
    runs-on: ubuntu-latest
    if: always()
    steps:
      - name: Generate Security Report
        run: |
          echo "## Отчёт о проверке безопасности" >> $GITHUB_STEP_SUMMARY
          # Генерация отчёта в формате Markdown

2. Периодическое полное сканирование (security-scheduled.yml)

yaml
# .github/workflows/security-scheduled.yml
name: Scheduled Security Scan

on:
  schedule:
    # Ежедневно в 00:00 по UTC
    - cron: '0 0 * * *'
  # Ручной запуск
  workflow_dispatch:
    inputs:
      scan_level:
        description: 'Scan Level'
        required: false
        default: 'full'
        type: choice
        options:
          - full
          - dependencies
          - code

jobs:
  daily-scan:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Full Dependency Audit
        run: |
          cargo audit --json > audit_results.json
          # Обработка результатов в формате JSON

      - name: Check for Yanked Versions
        run: |
          # Проверка yanked-версий в Cargo.toml
          cargo update --dry-run | grep yanked

      - name: AI Security Assessment
        run: |
          # AI-анализ рисков новых уязвимостей
          python3 ai_security_analysis.py
        env:
          OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}

      - name: Send Notification
        if: failure()
        uses: slackapi/slack-github-action@v1
        with:
          payload: |
            {
              "text": "🚨 YaoXiang: обнаружены новые уязвимости при сканировании безопасности",
              "attachments": [...]
            }

Функции AI-усиления

Анализ влияния уязвимостей

python
# ai_vulnerability_analysis.py

import openai
import json

def analyze_vulnerability(vulnerability_data: dict) -> dict:
    """
    Использование AI для анализа масштаба влияния уязвимости и приоритета исправления
    """

    prompt = f"""
    Проанализируйте следующую информацию о уязвимости безопасности и предоставьте рекомендации по исправлению:

    Информация об уязвимости:
    - CVE ID: {vulnerability_data['cve_id']}
    - Название пакета: {vulnerability_data['package']}
    - Затронутые версии: {vulnerability_data['affected_versions']}
    - Степень серьёзности: {vulnerability_data['severity']}
    - Описание: {vulnerability_data['description']}

    Информация о проекте:
    - Текущая версия: {vulnerability_data['current_version']}
    - На критическом пути: {vulnerability_data['is_critical_path']}

    Пожалуйста, предоставьте:
    1. Оценку влияния (по шкале 1-10)
    2. Приоритет исправления (P0/P1/P2/P3)
    3. Рекомендуемые шаги по исправлению
    4. Временные меры по смягчению последствий
    """

    response = openai.ChatCompletion.create(
        model="gpt-4",
        messages=[
            {
                "role": "system",
                "content": "Вы эксперт по безопасности кода, специализирующийся на анализе уязвимостей в проектах с открытым исходным кодом и рекомендациях по их исправлению."
            },
            {"role": "user", "content": prompt}
        ],
        temperature=0.3
    )

    return parse_ai_response(response)

Пользовательские правила безопасности

yaml
# .semgrep/rules/security-audit.yaml

rules:
  - id: yaoxiang-unsafe-ffi
    pattern: |
      extern "C" {
        $FUNC(...)
      }
    message: |
      Обнаружен вызов FFI. Пожалуйста, убедитесь, что:
      1. Параметры правильно проверены
      2. Память правильно освобождена
      3. Ошибки правильно обработаны
    severity: WARNING
    languages: [rust]

  - id: yaoxiang-dos-risk
    pattern: |
      fn $FUNC(...) {
        ...
        $VAR.clone()
        ...
      }
    message: |
      Потенциальный риск DoS: обратите внимание на операции clone() для больших объектов
    severity: WARNING
    languages: [rust]

Формат отчёта о безопасности

markdown
# YaoXiang Отчёт о сканировании безопасности

**Время сканирования**: 2025-01-05 10:30:00 UTC **Ветка сканирования**: main **Хеш коммита**:
abc123def456

## Резюме уязвимостей

| Степень серьёзности | Количество | Статус            |
| ------------------- | ---------- | ----------------- |
| Critical            | 0          | Нет               |
| High                | 2          | Ожидает обработки |
| Medium              | 5          | Оценено           |
| Low                 | 12         | На мониторинге    |

## Уязвимости зависимостей

### High - Требует немедленных действий

1. **CVE-2024-XXXXX: package-name**
   - Затронутые версии: < 1.2.0
   - Текущая версия: 1.1.5 (уязвима)
   - Версия с исправлением: 1.2.0
   - AI-оценка риска: P0 - высокий риск

### Medium - Обработать на этой неделе

...

## Проблемы безопасности кода

...

## Резюме AI-анализа

При данном сканировании обнаружено 2 уязвимости высокого риска, рекомендуется приоритетная
обработка...

## Рекомендуемые действия

- [ ] Обновить `package-name` до версии 1.2.0
- [ ] Проверить FFI-вызовы в `module/path/file.rs`
- [ ] Настроить Dependabot для автоматического обновления зависимостей

Детальный дизайн

Точки интеграции

ЭтапТочка интеграцииСодержание проверкиУсловие блокировки
При коммитеPR CIУязвимости зависимостей, проблемы безопасности кодаCritical/High
При слиянииПроверка слиянияПолное сканирование безопасностиCritical/High
При публикацииRelease CIПолный аудит безопасностиЛюбая уязвимость
ПериодическиЕжедневная задачаПроверка новых CVE, обновление зависимостейУведомление

Модель разрешений

yaml
permissions:
  contents: read
  security-events: write
  checks: write
  issues: write # Для создания issue с оповещениями безопасности

Стратегия уведомлений

СобытиеСпособ уведомленияПолучатели
Critical/High уязвимостьSlack + Email + GitHub MentionКоманда безопасности + автор PR
Medium уязвимостьGitHub IssueВладельцы кода
Ежедневная сводкаEmailВсе участники
Завершение исправленияGitHub CheckУчастники PR

Компромиссы

Преимущества

  • Высокая степень автоматизации: без ручного вмешательства, автоматическое сканирование и отчётность
  • AI-усиление: интеллектуальный анализ влияния уязвимостей, сокращение ложных срабатываний
  • Многоуровневая защита: полное покрытие зависимостей, кода и цепочки поставок
  • CI/CD-интеграция: проверка безопасности встроена в процесс разработки
  • Масштабируемость: поддержка пользовательских правил и AI-моделей

Недостатки

  • Зависимость от внешних сервисов: для AI-анализа требуется OpenAI/Claude API
  • Стоимостные соображения: большое количество сканирований может повлечь расходы на API-вызовы
  • Обработка ложных срабатываний: требуется постоянная оптимизация правил для сокращения ложных срабатываний
  • Затраты на поддержку: библиотека правил требует постоянного обновления

Альтернативные решения

РешениеОписаниеПричина отклонения
Только cargo-auditТолько сканирование уязвимостей зависимостейОтсутствует анализ безопасности на уровне кода
Коммерческие услуги безопасностиИспользование Snyk, Sonatype и др.Высокая стоимость, низкая гибкость
Только ручной аудитРучная проверка кода и зависимостейНизкая эффективность, узкое покрытие
Только SemgrepТолько статический анализ кодаОтсутствуют данные об уязвимостях зависимостей

Стратегия реализации

Разделение на этапы

  1. Phase 1: Базовое сканирование зависимостей(v0.3)

    • Настройка GitHub Action для cargo-audit
    • Создание шаблона отчёта о безопасности
    • Добавление базовых уведомлений через Slack/Email
  2. Phase 2: Анализ безопасности кода(v0.4)

    • Настройка набора правил Semgrep
    • Добавление пользовательских правил безопасности
    • Создание процесса обработки уязвимостей по уровням серьёзности
  3. Phase 3: AI-усиление(v0.5)

    • Интеграция OpenAI/Claude API
    • Реализация анализа влияния уязвимостей
    • Разработка генерации рекомендаций по исправлению
  4. Phase 4: Продвинутые функции(v0.6)

    • Автоматическое создание PR с исправлениями
    • Подпись безопасности цепочки поставок
    • Интеграция с программой bug bounty

Зависимости

  • Phase 1 → Phase 2 → Phase 3 → Phase 4 (последовательная зависимость)
  • Нет зависимостей от внешних RFC

Риски

РискВлияниеМеры по смягчению
Утечка ключей APIРиск безопасностиИспользование GitHub Secrets, регулярная ротация
Превышение времени сканированияЗадержка CIУстановка ограничений таймаута, оптимизация области сканирования
Слишком много ложных срабатыванийПроблемы разработкиПостоянная оптимизация правил, создание белого списка
Превышение бюджетаФинансовое влияниеУстановка лимитов API-вызовов, использование кэширования

Открытые вопросы

  • [ ] Какого AI-провайдера использовать? (OpenAI / Anthropic / локальное развёртывание)
  • [ ] Нужно ли автоматически создавать PR с исправлениями?
  • [ ] Как обрабатывать обнаружение атак на цепочку поставок?
  • [ ] Нужна ли поддержка приватных репозиториев зависимостей?

Приложения

Приложение A: Конфигурация сканирования безопасности

toml
# Конфигурация cargo-audit
# cargo.toml или .cargo/config.toml

[package.metadata.audit]
# Игнорировать конкретные уязвимости
ignore = ["RUSTSEC-0000-0000"]

# Порог степени серьёзности
severity-threshold = "medium"

# Разрешённые лицензии
allow = ["MIT", "Apache-2.0", "BSD-3-Clause"]

Приложение B: Конфигурация GitHub Security Advisory

yaml
# .github/advisories.yml
# Пользовательская база данных уязвимостей

exceptions:
  - package: 'some-internal-crate'
    vulnerability: 'YX-2024-001'
    reason: 'Только для внутреннего использования, приняты меры по смягчению'
    expires: '2025-06-01'

Приложение C: Глоссарий

ТерминОпределение
CVECommon Vulnerabilities and Exposures — система идентификации и каталогизации уязвимостей
CVSSCommon Vulnerability Scoring System — система оценки степени серьёзности уязвимостей
NVDNational Vulnerability Database — национальная база данных уязвимостей
SASTStatic Application Security Testing — статическое тестирование безопасности приложений
SCASoftware Composition Analysis — анализ состава программного обеспечения

Ссылки