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

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

Инженер по безопасности выполняет оценку уязвимостей и проверку усиления кода.

Содержание

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

# Выберите сценарий аудита безопасности
/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