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, которая автоматически выполняет сканирование безопасности при коммитах кода, изменениях зависимостей и в точках публикации релизов, а также раннего обнаружения и оповещения о потенциальных угрозах безопасности.
Мотивация
Почему эта функция необходима?
Безопасность проектов с открытым исходным кодом становится всё более важной:
- Риски уязвимостей в зависимостях: сторонние зависимости, используемые проектом, могут содержать известные уязвимости
- Атаки на цепочку поставок: вредоносный код может быть внедрён через цепочку зависимостей
- Своевременное обнаружение: после обнаружения уязвимости необходимо быстро оценить влияние и устранить её
- Требования соответствия: корпоративные пользователи предъявляют требования к соответствию кода стандартам безопасности
Текущие проблемы
В текущем проекте существуют следующие проблемы безопасности:
- Неизвестные зависимости: отсутствует систематическое отслеживание версий и состояния уязвимостей зависимостей 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)
# .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
# Генерация отчёта в формате Markdown2. Периодическое полное сканирование (security-scheduled.yml)
# .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-усиления
Анализ влияния уязвимостей
# 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)Пользовательские правила безопасности
# .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]Формат отчёта о безопасности
# 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, обновление зависимостей | Уведомление |
Модель разрешений
permissions:
contents: read
security-events: write
checks: write
issues: write # Для создания issue с оповещениями безопасностиСтратегия уведомлений
| Событие | Способ уведомления | Получатели |
|---|---|---|
| Critical/High уязвимость | Slack + Email + GitHub Mention | Команда безопасности + автор PR |
| Medium уязвимость | GitHub Issue | Владельцы кода |
| Ежедневная сводка | Все участники | |
| Завершение исправления | GitHub Check | Участники PR |
Компромиссы
Преимущества
- Высокая степень автоматизации: без ручного вмешательства, автоматическое сканирование и отчётность
- AI-усиление: интеллектуальный анализ влияния уязвимостей, сокращение ложных срабатываний
- Многоуровневая защита: полное покрытие зависимостей, кода и цепочки поставок
- CI/CD-интеграция: проверка безопасности встроена в процесс разработки
- Масштабируемость: поддержка пользовательских правил и AI-моделей
Недостатки
- Зависимость от внешних сервисов: для AI-анализа требуется OpenAI/Claude API
- Стоимостные соображения: большое количество сканирований может повлечь расходы на API-вызовы
- Обработка ложных срабатываний: требуется постоянная оптимизация правил для сокращения ложных срабатываний
- Затраты на поддержку: библиотека правил требует постоянного обновления
Альтернативные решения
| Решение | Описание | Причина отклонения |
|---|---|---|
| Только cargo-audit | Только сканирование уязвимостей зависимостей | Отсутствует анализ безопасности на уровне кода |
| Коммерческие услуги безопасности | Использование Snyk, Sonatype и др. | Высокая стоимость, низкая гибкость |
| Только ручной аудит | Ручная проверка кода и зависимостей | Низкая эффективность, узкое покрытие |
| Только Semgrep | Только статический анализ кода | Отсутствуют данные об уязвимостях зависимостей |
Стратегия реализации
Разделение на этапы
Phase 1: Базовое сканирование зависимостей(v0.3)
- Настройка GitHub Action для
cargo-audit - Создание шаблона отчёта о безопасности
- Добавление базовых уведомлений через Slack/Email
- Настройка GitHub Action для
Phase 2: Анализ безопасности кода(v0.4)
- Настройка набора правил Semgrep
- Добавление пользовательских правил безопасности
- Создание процесса обработки уязвимостей по уровням серьёзности
Phase 3: AI-усиление(v0.5)
- Интеграция OpenAI/Claude API
- Реализация анализа влияния уязвимостей
- Разработка генерации рекомендаций по исправлению
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: Конфигурация сканирования безопасности
# Конфигурация 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
# .github/advisories.yml
# Пользовательская база данных уязвимостей
exceptions:
- package: 'some-internal-crate'
vulnerability: 'YX-2024-001'
reason: 'Только для внутреннего использования, приняты меры по смягчению'
expires: '2025-06-01'Приложение C: Глоссарий
| Термин | Определение |
|---|---|
| CVE | Common Vulnerabilities and Exposures — система идентификации и каталогизации уязвимостей |
| CVSS | Common Vulnerability Scoring System — система оценки степени серьёзности уязвимостей |
| NVD | National Vulnerability Database — национальная база данных уязвимостей |
| SAST | Static Application Security Testing — статическое тестирование безопасности приложений |
| SCA | Software Composition Analysis — анализ состава программного обеспечения |
