Сценарий 02: Аудит безопасности¶
Инженер по безопасности выполняет оценку уязвимостей и проверку усиления кода.
Содержание¶
- Быстрый старт
- Сканирование уязвимостей
- Обнаружение SQL-инъекций
- Обнаружение переполнения буфера
- Анализ потока заражённых данных (Taint Flow Analysis)
- Определение точек входа
- Отслеживание потока данных
- Усиление безопасности исходного кода по D3FEND
- Полный аудит усиления безопасности
- Проверка небезопасных функций (D3-TL)
- Проверка безопасности указателей на NULL (D3-NPC)
- Языковые шаблоны безопасности
- Поддерживаемые языки и шаблоны уязвимостей
- Охват базы данных CWE (более 30 CWE)
- Шаблоны атак CAPEC (более 15 шаблонов)
- Пример Python/Django
- Пример JavaScript/TypeScript
- Пример Go
- Отчёты безопасности в CLI
- Связанные сценарии
Быстрый старт¶
# Выберите сценарий аудита безопасности
/select 02
Сканирование уязвимостей¶
Обнаружение 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 Flow Analysis)¶
Определение точек входа¶
> Найти все внешние точки входа
╭─────────────── Точки входа ──────────────────────────────╮
│ │
│ Сетевые точки входа: │
│ - pq_getmsgstring() - Чтение строки от клиента │
│ - pq_getmsgint() - Чтение целого числа от клиента│
│ - ProcessClientRead() - Прямое чтение из сокета │
│ │
│ SQL точки входа: │
│ - exec_simple_query() - Прямое выполнение SQL │
│ - exec_parse_message() - Подготовленный запрос │
│ - exec_bind_message() - Привязка параметров │
│ │
│ Файловые точки входа: │
│ - pg_read_file() - Чтение произвольного файла │
│ - pg_ls_dir() - Просмотр содержимого каталога│
│ │
│ Всего: обнаружено 47 точек входа │
│ │
╰───────────────────────────────────────────────────────────╯
Отслеживание потока данных¶
> Отслеживание потока данных от PQgetvalue до выполнения SQL
╭─────────────── Поток заслуживающих доверия данных ────────╮
│ │
│ ИСТОЧНИК: PQgetvalue() [Ввод от клиента] │
│ ↓ │
│ pq_getmsgstring() │
│ ↓ │
│ exec_simple_query() │
│ ↓ │
│ pg_parse_query() │
│ ↓ │
│ СТЕК: SPI_execute() [Выполнение SQL] │
│ │
│ Уровень риска: ВЫСОКИЙ │
│ Рекомендация: Добавить проверку входных данных на точке входа│
│ │
╰───────────────────────────────────────────────────────────╯
Усиление защиты исходного кода D3FEND¶
Модуль D3FEND анализирует код на соответствие 11 методикам MITRE D3FEND по усилению защиты исходного кода:
| ID | Методика | Описание | CWE |
|---|---|---|---|
| D3-VI | Инициализация переменных | Неинициализированные переменные | CWE-457 |
| D3-CS | Очистка учетных данных | Жестко заданные учетные данные | CWE-798 |
| D3-IRV | Проверка диапазона целых чисел | Риски переполнения целых чисел | CWE-190 |
| D3-PV | Проверка указателей | Разыменование указателя без проверки | CWE-476 |
| D3-RN | Обнуление ссылок | Использование после освобождения (use-after-free) | CWE-416 |
| D3-TL | Доверенные библиотеки | Использование небезопасных функций | CWE-676 |
| D3-NPC | Проверка на нулевой указатель | Отсутствие проверок на NULL | CWE-476 |
Политика аудита усиления защиты¶
> Запуск проверки соответствия усилению защиты 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))); │
│ } │
│ │
╰───────────────────────────────────────────────────────────────╯
Языковые шаблоны безопасности¶
CodeGraph поддерживает анализ безопасности для нескольких языков программирования с отображением на CWE/CAPEC.
Поддерживаемые языки и шаблоны уязвимостей¶
| Язык | Шаблоны | Основные 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 |
Охват базы данных CWE (более 30 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-798: Жестко заданные учетные данные - CWE-284: Неправильный контроль доступа - CWE-862: Отсутствие авторизации
Шаблоны атак CAPEC (более 15 шаблонов)¶
- CAPEC-66: SQL-инъекция
- CAPEC-86: XSS через HTTP-заголовки
- CAPEC-88: Инъекция команд ОС
- CAPEC-100: Переполнение буфера
- CAPEC-126: Обход путей (Path Traversal)
- CAPEC-586: Инъекция объектов (десериализация)
- CAPEC-664: Подделка запросов на стороне сервера (SSRF)
Пример для Python/Django¶
# Переключиться на проект Django
/project switch my_django_app
# Запустить проверку безопасности
> Найти уязвимости к SQL-инъекциям в обработчиках (views)
> Проверить шаблоны на наличие XSS
> Найти точки входа без защиты CSRF
Пример для JavaScript/TypeScript¶
> Найти уязвимости к загрязнению прототипа
> Проверить использование innerHTML на предмет XSS
> Найти вызовы eval() с пользовательским вводом
Пример для Go¶
> Найти гонки данных в goroutines
> Проверить запросы к базе данных на наличие SQL-инъекций
> Найти небезопасные конфигурации TLS
Отчёты безопасности CLI¶
Генерация полных отчётов безопасности:
# Автоопределение языка
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, ruby, csharp, kotlin, swift, java, php
Создаёт:
- security_report.md — Человекочитаемый отчёт
- security_report.json — Машиночитаемый формат для CI/CD
- security_report.sarif — Формат оповещений безопасности GitHub
Связанные сценарии¶
- Соответствие требованиям — Проверка соответствия нормативным требованиям
- Реагирование на инциденты — Расследование после нарушения безопасности
- Точки входа — Картирование поверхности атаки