Инженер по безопасности выполняет оценку уязвимостей, анализ потоков данных и проверку усиления кода с помощью CPG-анализа.
Содержание¶
- Быстрый старт
- Как это работает
- Классификация интентов
- Архитектура обработчиков
- Классы анализа безопасности
- Сканирование уязвимостей
- Обнаружение SQL-инъекций
- Обнаружение переполнения буфера
- Анализ потоков данных (Taint Analysis)
- Определение точек входа
- Отслеживание потока данных
- Усиление кода по D3FEND
- 11 техник D3FEND
- Полный аудит усиления
- Проверка небезопасных функций (D3-TL)
- Проверка нулевых указателей (D3-NPC)
- Языковые шаблоны безопасности
- Поддерживаемые языки (11)
- Покрытие CWE (69 CWE)
- Покрытие атакующих паттернов CAPEC
- Примеры для языков
- Соответствие OWASP Top 10
- Визуализация путей распространения
- Интеграция автоисправлений
- CLI и MCP
- Примеры вопросов
- Связанные сценарии
Быстрый старт¶
# Выберите сценарий аудита безопасности
/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» - «Проверить слабую генерацию случайных чисел» - «Найти риски исчерпания ресурсов»
Связанные сценарии¶
- Автоисправления — Автоматическая генерация исправлений для обнаруженных уязвимостей
- Соответствие стандартам (S08) — Проверка соответствия нормативным требованиям
- Реагирование на инциденты (S14) — Расследование после нарушения безопасности
- Точки входа (S16) — Картирование поверхности атаки