Сценарий 02: Аудит безопасности

Инженер по безопасности выполняет оценку уязвимостей, анализ потоков данных и проверку усиления кода с помощью CPG-анализа.

Содержание

Быстрый старт

# Выберите сценарий аудита безопасности
/select 02

Как это работает

Классификация интентов

При получении запроса о безопасности SecurityIntentDetector классифицирует его в один из 12 типов интентов по ключевым словам (поддержка английского и русского):

Интент Ключевые слова (EN) Ключевые слова (RU) Обработчик
hardcoded_credentials hardcoded, credentials, secret захардкоженный, жестко закодированный VulnerabilityScanHandler
entry_points entry point, attack surface точка входа, поверхность атаки EntryPointsHandler
taint_analysis taint, data flow, trace поток данных, распространение TaintAnalysisHandler
info_disclosure information disclosure, leak раскрытие информации, утечка InfoDisclosureHandler
null_check null, dereference нулевой указатель, разыменование NullCheckHandler
memory_lifetime use after free, double free использование после освобождения MemoryLifetimeHandler
race_condition race condition, TOCTOU гонка, состояние гонки RaceConditionHandler
weak_crypto weak random, PRNG, entropy слабое случайное число WeakCryptoHandler
denial_of_service DoS, resource exhaustion отказ в обслуживании DoSHandler
vulnerability_scan vulnerability, CWE, injection уязвимость, инъекция VulnerabilityScanHandler

Архитектура обработчиков

Сценарий аудита безопасности использует архитектуру на основе обработчиков с 11 параллельными обработчиками, каждый с приоритетом:

Запрос пользователя
    |
    v
SecurityIntentDetector → классификация интента (12 типов)
    |
    v
security_registry → маршрутизация к обработчику по приоритету
    |
    +-- [4]  EntryPointsHandler      → обнаружение поверхности атаки
    +-- [5]  TaintSourcesHandler     → справочник источников/приёмников
    +-- [10] VulnerabilityScanHandler → сканирование по шаблонам
    +-- [20] TaintAnalysisHandler    → глубокая трассировка потоков данных
    +-- [25] NullCheckHandler        → разыменование нулевых указателей
    +-- [26] InfoDisclosureHandler   → утечки информации
    +-- [27] MemoryLifetimeHandler   → use-after-free, double-free
    +-- [28] RaceConditionHandler    → проблемы параллелизма
    +-- [29] WeakCryptoHandler       → слабые ГПСЧ/энтропия
    +-- [30] DoSHandler              → исчерпание ресурсов
    +-- [--] AutofixHandler          → генерация исправлений (отдельно)

Меньший номер приоритета = более высокий приоритет. Каждый обработчик имеет парный форматтер для структурированного вывода.

Классы анализа безопасности

Класс Модуль Назначение
SecurityScanner src/security/ Выполнение CPG-шаблонов, возвращает список SecurityFinding
HardeningScanner src/security/hardening/ Проверки соответствия D3FEND (11 техник)
TaintPropagator src/analysis/dataflow/taint/ Полечувствительный анализ потоков с символьным выполнением
TaintVerifiedScanner src/security/ Высоконадёжные находки с отслеживанием санитизации
AutofixEngine src/analysis/autofix/ Трёхстратегийная генерация исправлений (SSR → шаблон → LLM)
SARIFExporter src/security/ Экспорт SARIF 2.1.0 с codeFlows и тегами OWASP

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

Обнаружение SQL-инъекций

> Найти уязвимости к SQL-инъекциям

╭─────────────── Результаты анализа безопасности ─────────────╮
│                                                              │
│  КРИТИЧЕСКАЯ: SQL-инъекция                                   │
│                                                              │
│     Расположение: src/pl/plpgsql/src/pl_exec.c:4567         │
│     Шаблон: Динамический запрос с конкатенацией строк        │
│     Код:                                                     │
│       snprintf(query, "SELECT * FROM %s", table_name);       │
│                                                              │
│     Риск: Контролируемое пользователем имя таблицы           │
│           может привести к внедрению SQL-кода                │
│     Исправление: Используйте quote_identifier()             │
│     CWE: CWE-89                                              │
│                                                              │
│  Всего: 7 критических, 12 высоких, 34 средних               │
│                                                              │
╰──────────────────────────────────────────────────────────────╯

Обнаружение переполнения буфера

> Найти риски переполнения буфера в строковых функциях
> Показать функции, использующие sprintf без проверки границ

Анализ потоков данных (Taint Analysis)

Определение точек входа

> Найти все внешние точки входа

╭─────────────── Точки входа ──────────────────────────────╮
│                                                           │
│  Сетевые точки входа:                                     │
│    - pq_getmsgstring()     - Чтение строки от клиента     │
│    - pq_getmsgint()        - Чтение целого числа          │
│    - ProcessClientRead()   - Прямое чтение из сокета      │
│                                                           │
│  SQL точки входа:                                         │
│    - exec_simple_query()   - Прямое выполнение SQL        │
│    - exec_parse_message()  - Подготовленный запрос        │
│    - exec_bind_message()   - Привязка параметров          │
│                                                           │
│  Файловые точки входа:                                    │
│    - pg_read_file()        - Чтение произвольного файла   │
│    - pg_ls_dir()           - Просмотр каталога            │
│                                                           │
│  Всего: обнаружено 47 точек входа                         │
│                                                           │
╰───────────────────────────────────────────────────────────╯

Отслеживание потока данных

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

> Отследить поток данных от PQgetvalue до выполнения SQL

╭─────────────── Поток данных ─────────────────────────────╮
│                                                           │
│  ИСТОЧНИК: PQgetvalue() [Ввод от клиента]                 │
│      ↓                                                    │
│  pq_getmsgstring()                                        │
│      ↓                                                    │
│  exec_simple_query()                                      │
│      ↓                                                    │
│  pg_parse_query()                                         │
│      ↓                                                    │
│  ПРИЁМНИК: SPI_execute() [Выполнение SQL]                 │
│                                                           │
│  Уровень риска: ВЫСОКИЙ                                   │
│  Рекомендация: Добавить валидацию на точке входа          │
│                                                           │
╰───────────────────────────────────────────────────────────╯

Усиление кода по D3FEND

11 техник D3FEND

HardeningScanner анализирует код на соответствие 11 техникам MITRE D3FEND по усилению исходного кода:

ID Техника Описание CWE
D3-VI Инициализация переменных Неинициализированные переменные CWE-457
D3-CS Очистка учётных данных Жёстко заданные учётные данные CWE-798
D3-IRV Проверка диапазона целых чисел Риски переполнения целых чисел CWE-190
D3-PV Проверка указателей Разыменование указателя без проверки CWE-476
D3-RN Обнуление ссылок Использование после освобождения CWE-416
D3-TL Доверенные библиотеки Использование небезопасных функций CWE-676
D3-VTV Проверка типов переменных Уязвимости путаницы типов CWE-843
D3-MBSV Проверка начала блока памяти Выход за границы массива CWE-787
D3-NPC Проверка нулевого указателя Отсутствие проверок на NULL CWE-476
D3-DLV Проверка доменной логики Ошибки бизнес-логики CWE-20
D3-OLV Проверка операционной логики Нарушения операционных инвариантов CWE-670

Полный аудит усиления

> Запустить проверку соответствия D3FEND

╭─────────────── Отчёт о соответствии D3FEND ──────────────────╮
│                                                               │
│  Общий балл соответствия: 72,5%                               │
│                                                               │
│  Проблемы по техникам:                                        │
│                                                               │
│  D3-VI (Инициализация переменных): 23 проблемы                │
│  D3-TL (Доверенные библиотеки): 12 проблем                    │
│  D3-NPC (Проверка нулевого указателя): 8 проблем              │
│  D3-RN (Обнуление ссылок): 6 проблем                          │
│                                                               │
│  Баллы по категориям:                                         │
│    Инициализация: 65%                                         │
│    Безопасность памяти: 78%                                   │
│    Безопасность указателей: 82%                               │
│    Безопасность библиотек: 58%                                │
│                                                               │
╰───────────────────────────────────────────────────────────────╯

Проверка небезопасных функций (D3-TL)

> Проверить использование небезопасных функций (D3-TL)

╭─────────────── D3-TL: Доверенные библиотеки ─────────────────╮
│                                                               │
│  КРИТИЧЕСКИЙ — strcpy (риск переполнения буфера):             │
│    src/backend/utils/adt/varlena.c:234                        │
│    src/backend/libpq/pqformat.c:567                           │
│                                                               │
│  КРИТИЧЕСКИЙ — sprintf (риск форматной строки):               │
│    src/backend/libpq/auth.c:567                               │
│                                                               │
│  Рекомендации:                                                │
│    - strcpy → strncpy/strlcpy                                 │
│    - sprintf → snprintf                                       │
│                                                               │
╰───────────────────────────────────────────────────────────────╯

Проверка нулевых указателей (D3-NPC)

> Найти уязвимости нулевых указателей (D3-NPC)

╭─────────────── D3-NPC: Проверка нулевого указателя ──────────╮
│                                                               │
│  Отсутствующие проверки на NULL после выделения: 23           │
│                                                               │
│  malloc без проверки:                                         │
│    src/backend/utils/mmgr/aset.c:345                          │
│      char *buf = malloc(size);                                │
│      use(buf);  // ← Нет проверки на NULL!                    │
│                                                               │
│  Пример исправления:                                          │
│    char *buf = malloc(size);                                  │
│    if (buf == NULL) {                                         │
│        ereport(ERROR, (errcode(ERRCODE_OUT_OF_MEMORY)));      │
│    }                                                          │
│                                                               │
╰───────────────────────────────────────────────────────────────╯

Языковые шаблоны безопасности

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

CodeGraph поддерживает анализ безопасности для 11 языков программирования с маппингом CWE, а также фреймворк-специфичные провайдеры гипотез:

Язык Шаблоны Основные CWE
C/C++ Переполнение буфера, форматная строка, UAF, инъекция команд CWE-120, CWE-134, CWE-416, CWE-78
Python/Django SQL-инъекции, XSS, CSRF, десериализация CWE-89, CWE-79, CWE-352, CWE-502
JavaScript/TypeScript XSS, загрязнение прототипа, инъекция через eval, SSRF CWE-79, CWE-1321, CWE-94, CWE-918
Go Гонки данных, SQL-инъекции, обход путей, небезопасный TLS CWE-362, CWE-89, CWE-22, CWE-295
Ruby/Rails Инъекции через eval, десериализация YAML, массовое присвоение CWE-94, CWE-502, CWE-915
C#/.NET SQL-инъекции, XSS, небезопасная десериализация, XXE CWE-89, CWE-79, CWE-502, CWE-611
Kotlin/Android XSS в WebView, перенаправление intent, небезопасное хранение CWE-79, CWE-927, CWE-312
Swift/iOS Неправильное использование Keychain, перехват URL-схем, обход TLS CWE-312, CWE-939, CWE-295
Java SQL-инъекции, десериализация, XXE, инъекции LDAP CWE-89, CWE-502, CWE-611, CWE-90
PHP SQL-инъекции, XSS, инъекция команд, обход путей CWE-89, CWE-79, CWE-78, CWE-22
1C (OneC) SQL-инъекции, инъекция команд, обход путей CWE-89, CWE-78, CWE-22

Фреймворк-специфичные провайдеры (через подсистему гипотез): Django, Express.js, Next.js, Spring, Gin, PostgreSQL.

Покрытие CWE (69 CWE)

База шаблонов безопасности покрывает 69 уникальных идентификаторов CWE по всем языкам:

Уязвимости инъекций: - CWE-78: Инъекция команд ОС - CWE-89: SQL-инъекция - CWE-94: Инъекция кода - CWE-134: Форматная строка

Веб-уязвимости: - CWE-79: Межсайтовый скриптинг (XSS) - CWE-352: Подделка межсайтовых запросов (CSRF) - CWE-502: Небезопасная десериализация - CWE-611: Внешняя сущность XML (XXE) - CWE-918: Подделка запросов на стороне сервера (SSRF) - CWE-1321: Загрязнение прототипа

Безопасность памяти (C/C++): - CWE-120: Переполнение буфера - CWE-416: Использование после освобождения (Use After Free) - CWE-476: Разыменование нулевого указателя - CWE-190: Переполнение целого числа - CWE-787: Запись за пределами буфера

Аутентификация/авторизация: - CWE-798: Жёстко заданные учётные данные - CWE-284: Неправильный контроль доступа - CWE-862: Отсутствие авторизации

Полный список включает 69 CWE, охватывающих инъекции, безопасность памяти, веб, криптографию, параллелизм и контроль доступа.

Покрытие атакующих паттернов CAPEC

Шаблоны безопасности CodeGraph определяются через идентификаторы CWE. Каждый CWE соответствует атакующим паттернам CAPEC через стандартный маппинг MITRE CWE→CAPEC:

CWE CAPEC Атакующий паттерн
CWE-89 CAPEC-66 SQL-инъекция
CWE-79 CAPEC-86 XSS через HTTP-заголовки
CWE-78 CAPEC-88 Инъекция команд ОС
CWE-120 CAPEC-100 Переполнение буфера
CWE-22 CAPEC-126 Обход путей (Path Traversal)
CWE-502 CAPEC-586 Инъекция объектов (десериализация)
CWE-918 CAPEC-664 Подделка запросов на стороне сервера (SSRF)

Подсистема гипотез генерирует гипотезы безопасности для этих атакующих сценариев с фреймворк-специфичными провайдерами, обеспечивая целенаправленное обнаружение уязвимостей за пределами статического анализа по шаблонам.

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

Python/Django:

# Переключиться на проект Django
/project switch my_django_app

# Запустить проверку безопасности
> Найти уязвимости к SQL-инъекциям в обработчиках
> Проверить шаблоны на наличие XSS
> Найти точки входа без защиты CSRF

JavaScript/TypeScript:

> Найти уязвимости к загрязнению прототипа
> Проверить использование innerHTML на предмет XSS
> Найти вызовы eval() с пользовательским вводом

Go:

> Найти гонки данных в goroutines
> Проверить запросы к базе данных на наличие SQL-инъекций
> Найти небезопасные конфигурации TLS

Соответствие OWASP Top 10

Результаты аудита безопасности автоматически обогащаются маппингом OWASP Top 10 2021 через owasp_mapping.py (69 CWE маппированы на A01–A10):

  • Каждая находка получает тег OWASP-Axx (например, OWASP-A03 для инъекций)
  • Таблица соответствия показывает статус pass/fail по каждой категории OWASP
  • Экспорт SARIF включает теги OWASP на правилах reportingDescriptor

Пример вывода соответствия:

| Категория OWASP                     | Статус | Находки |
|--------------------------------------|--------|---------|
| A01 Нарушение контроля доступа       | PASS   | 0       |
| A02 Криптографические ошибки         | FAIL   | 2       |
| A03 Инъекции                         | FAIL   | 5       |
| A04 Небезопасная архитектура         | PASS   | 0       |
| A05 Неправильная конфигурация        | WARN   | 1       |
| ...                                  | ...    | ...     |

Визуализация путей распространения

Результаты анализа потоков данных включают Mermaid-диаграммы путей эксплуатации:

graph LR
    src["user_input()"]:::source --> proc["process_data()"]
    proc --> sink["exec_sql()"]:::sink
    classDef source fill:#f90,stroke:#333
    classDef sink fill:#f33,stroke:#333
    classDef sanitizer fill:#3c3,stroke:#333
  • Оранжевые узлы: источники (точки ввода пользовательских данных)
  • Красные узлы: приёмники (опасные операции)
  • Зелёные узлы: санитайзеры (функции валидации/экранирования)

MCP-инструмент codegraph_taint_analysis возвращает структурированный массив taint_paths с узлами источника, приёмника и промежуточными узлами. SARIFExporter включает codeFlows согласно SARIF 2.1.0 §3.36.

Интеграция автоисправлений

AutofixEngine генерирует конкретные исправления для обнаруженных уязвимостей, используя три стратегии (SSR → шаблон → LLM). Подробности в руководстве по автоисправлениям:

  • Трёхстратегийный конвейер (SSR, шаблон, LLM)
  • Поддерживаемые типы уязвимостей и шаблоны исправлений
  • Оценка уверенности и процесс одобрения
  • Конфигурация и расширение доменами

Быстрое использование:

# CLI: аудит с предложениями автоисправлений
python -m src.cli audit --db data/projects/postgres.duckdb --autofix

# MCP: генерация исправления для конкретного метода
codegraph_autofix(method_name="process_query", cwe="CWE-89")

CLI и MCP

# Полный отчёт безопасности (автоопределение языка)
python -m src.cli.security_audit full \
  --path /путь/к/проекту \
  --output ./security_reports

# Явное указание языка
python -m src.cli.security_audit full \
  --path /путь/к/проекту \
  --language python \
  --output ./security_reports

# Доступные языки: auto, c, cpp, python, javascript, typescript,
#                  go, csharp, kotlin, java, php, onec

# Анализ безопасности по запросу
python -m src.cli query "Найти уязвимости к SQL-инъекциям"

# Трассировка инцидента безопасности
python -m src.cli security incident "скомпрометированная функция" --db PATH

Форматы вывода: - security_report.md — Человекочитаемый отчёт - security_report.json — Машиночитаемый для CI/CD - security_report.sarif — Формат оповещений GitHub (SARIF 2.1.0)

MCP-инструменты: - codegraph_taint_analysis(method_name, source_category, sink_category) — трассировка потоков данных - codegraph_autofix(method_name, cwe="") — генерация исправлений

Примеры вопросов

Сканирование уязвимостей: - «Найти уязвимости к SQL-инъекциям» - «Найти риски переполнения буфера в строковых функциях» - «Проверить наличие жёстко заданных учётных данных» - «Найти риски раскрытия информации»

Анализ потоков данных: - «Отследить поток данных от пользовательского ввода до SQL» - «Найти все внешние точки входа» - «Показать пути распространения данных для process_query»

Усиление по D3FEND: - «Запустить проверку соответствия D3FEND» - «Проверить использование небезопасных функций (D3-TL)» - «Найти уязвимости нулевых указателей»

Память и параллелизм: - «Найти уязвимости использования после освобождения» - «Найти гонки данных в goroutines» - «Проверить слабую генерацию случайных чисел» - «Найти риски исчерпания ресурсов»

Связанные сценарии