Модель угроз STRIDE

Руководство по автоматическому построению модели угроз на основе методологии STRIDE из данных графа свойств кода (CPG). Соответствует требованиям ГОСТ Р 56939-2024, процесс 5.7.

Содержание


Обзор

Модуль моделирования угроз CodeGraph автоматически строит модель угроз из CPG проекта. Анализ включает:

  1. Построение диаграммы потоков данных (DFD) из точек входа, хранилищ данных и внешних сущностей CPG.
  2. Обнаружение 5 типов границ доверия эвристическими методами.
  3. Классификацию угроз по 6 категориям STRIDE на основе отображения 43 CWE и результатов системы гипотез.
  4. Формирование мер противодействия (18 базовых + CWE-специфичные).
  5. Инкрементальное обновление при изменении кодовой базы.
  6. Экспорт в форматы JSON, Markdown (русский/английский), ГОСТ, SARIF 2.1.0, Mermaid DFD.

Исходный код: src/security/threat_model/.

Методология STRIDE

STRIDE – классификация угроз, разработанная Microsoft. Каждая буква аббревиатуры обозначает категорию угрозы:

Категория Описание Свойство безопасности
S – Подмена (Spoofing) Присвоение чужой идентичности Аутентификация
T – Подделка данных (Tampering) Несанкционированное изменение данных Целостность
R – Отказ от авторства (Repudiation) Отрицание выполненного действия Неотказуемость
I – Раскрытие информации (Information Disclosure) Несанкционированный доступ к данным Конфиденциальность
D – Отказ в обслуживании (Denial of Service) Нарушение доступности системы Доступность
E – Повышение привилегий (Elevation of Privilege) Получение полномочий выше разрешённых Авторизация

CodeGraph автоматически относит каждую найденную уязвимость к одной или нескольким категориям STRIDE через отображение CWE (43 записи).

Архитектура

Модуль состоит из 7 файлов в каталоге src/security/threat_model/:

src/security/threat_model/
    __init__.py              # Реэкспорт моделей
    models.py                # Модели данных: ThreatModel, STRIDEThreat, DataComponent, ...
    dfd_builder.py           # Построитель DFD из CPG
    trust_boundary.py        # Детектор границ доверия
    stride_classifier.py     # Классификатор угроз STRIDE
    mitigation.py            # Рекомендатель мер противодействия
    incremental.py           # Инкрементальное обновление модели
    exporter.py              # Экспорт (JSON, Markdown, ГОСТ, Mermaid)

Последовательность построения модели угроз:

CPG (DuckDB)
    |
    v
DFDBuilder.build()              --> компоненты + потоки данных
    |
    v
TrustBoundaryDetector.detect()  --> границы доверия + пометка пересечений
    |
    v
STRIDEClassifier.classify()     --> список угроз STRIDE
    |
    v
MitigationRecommender.recommend_for_model()  --> меры противодействия
    |
    v
ThreatModelExporter.to_*()      --> JSON / Markdown / ГОСТ / SARIF / Mermaid

Построитель DFD

Файл: src/security/threat_model/dfd_builder.py

Класс DFDBuilder извлекает диаграмму потоков данных из CPG:

  • Процессы (ComponentType.PROCESS): модули с точками входа из таблицы nodes_method (поле is_entry_point = true). Группировка по файлам.
  • Хранилища данных (ComponentType.DATA_STORE): определяются через категории приёмников помечённых данных (database, file, cache, log, network_send).
  • Внешние сущности (ComponentType.EXTERNAL_ENTITY): определяются через категории источников помечённых данных (network, user_input, file_system).
  • Потоки данных (DataFlow): извлекаются из рёбер вызовов (edges_call) между точками входа, а также путём связывания внешних сущностей с процессами.

Каждый компонент получает уровень доверия (TrustLevel):

Уровень Значение Критерий
UNTRUSTED 0 Сетевые, пользовательские, сокетные точки входа
PARTIALLY_TRUSTED 1 Аутентификация, подключения
TRUSTED 2 Внутренние модули без внешнего доступа

Определение протокола потока данных выполняется автоматически на основе категории точки входа: http_handler -> http, grpc_handler -> grpc, network / socket -> tcp, websocket -> ws.

Источники и приёмники помечённых данных получаются из доменного модуля (DomainPluginV3.get_taint_sources() / get_taint_sinks()). При отсутствии доменного модуля используются встроенные значения по умолчанию.

Детектор границ доверия

Файл: src/security/threat_model/trust_boundary.py

Класс TrustBoundaryDetector обнаруживает 5 типов границ доверия:

Тип границы Описание Индикаторы
network Сетевая граница recv, accept, listen, http_handler, grpc_handler, serve
auth Граница аутентификации authenticate, authorize, check_permission, verify_token, login
ffi Граница межъязыкового вызова cgo_call, ctypes, cffi, jni, ffi_call
process Граница межпроцессного взаимодействия exec, subprocess, popen, system, spawn
file_system Граница файловой системы open, read_file, write_file, fopen, readdir

Обнаружение выполняется в два этапа:

  1. Эвристическое сопоставление: категории точек входа и имена методов сравниваются с индикаторами каждого типа границы.
  2. Запрос CPG: дополнительный поиск в таблице nodes_method по шаблонам LIKE для индикаторных имён.

После обнаружения границ детектор помечает потоки данных, пересекающие границы (DataFlow.crosses_trust_boundary = True). Критерии пересечения:

  • Различие уровней доверия источника и приёмника.
  • Источник и приёмник находятся по разные стороны явной границы (один во inner_components, другой в outer_components).

Индикаторы настраиваются через конфигурацию (см. Конфигурация).

Классификатор STRIDE

Файл: src/security/threat_model/stride_classifier.py

Класс STRIDEClassifier генерирует список угроз из нескольких источников:

  1. Результаты системы гипотез (CWE): каждая находка с идентификатором CWE отображается в одну или несколько категорий STRIDE через словарь CWE_TO_STRIDE (43 записи).
  2. Находки шаблонов CPG (cpg_pattern_findings): SQL-запрос к таблице результатов сканирования шаблонов, затем отображение через CWE.
  3. Вывод из пересечений границ доверия: нешифрованные потоки через сетевую границу, пользовательский ввод через границу, учётные данные без слоя аутентификации.
  4. Вывод из незащищённых точек входа: сетевые точки входа, не находящиеся внутри границы аутентификации.

После сбора выполняется дедупликация по ключу (категория, компонент, список CWE) и ранжирование по убыванию оценки риска (risk_score = severity * likelihood).

Весовые коэффициенты оценки риска:

Критичность Вес Вероятность Вес
critical 10 high 3
high 7 medium 2
medium 4 low 1
low 1

Рекомендатель мер противодействия

Файл: src/security/threat_model/mitigation.py

Класс MitigationRecommender формирует рекомендации на двух уровнях:

Категорийные меры (18 записей, по 3 на категорию STRIDE):

Категория Меры
Подмена M-S-1 Аутентификация, M-S-2 Защита сессий, M-S-3 Многофакторная аутентификация
Подделка данных M-T-1 Валидация ввода, M-T-2 Контроль целостности, M-T-3 Параметризованные запросы
Отказ от авторства M-R-1 Журналирование, M-R-2 Контрольный журнал, M-R-3 Интеграция с SIEM
Раскрытие информации M-I-1 Шифрование данных, M-I-2 Защита от утечек, M-I-3 Минимизация раскрытия
Отказ в обслуживании M-D-1 Ограничение частоты запросов, M-D-2 Ограничение ресурсов, M-D-3 Проверка сложности
Повышение привилегий M-E-1 Принцип наименьших привилегий, M-E-2 Авторизация, M-E-3 Защита памяти

CWE-специфичные меры (14 записей): дополнительные рекомендации для конкретных CWE (CWE-89, CWE-79, CWE-78, CWE-120, CWE-287, CWE-200, CWE-352, CWE-502, CWE-319, CWE-400, CWE-862, CWE-787, CWE-416, CWE-476).

Приоритизация по критичности угрозы: - critical / high: все меры. - medium: первые 4 меры. - low: первые 2 меры.

Инкрементальный модуль обновления

Файл: src/security/threat_model/incremental.py

Класс IncrementalThreatModelUpdater вычисляет разницу (ThreatModelDelta) между предыдущей и новой моделью угроз (ГОСТ Р 56939-2024, п. 5.7.2.4):

  • Добавленные угрозы: присутствуют в новой модели, отсутствуют в старой.
  • Удалённые угрозы: присутствуют в старой модели, отсутствуют в новой.
  • Изменённые угрозы: совпадение по ID, но изменилась критичность, статус, категория, список CWE или затронутый компонент.
  • Добавленные / удалённые компоненты: аналогично.

Результат: объединённая модель (ThreatModel) с метаданными о предыдущей версии, списком изменённых файлов и сводкой изменений.

Экспортёр

Файл: src/security/threat_model/exporter.py

Класс ThreatModelExporter поддерживает форматы:

Формат Метод Описание
JSON to_json(), to_json_string() Структурированный словарь / строка JSON
Markdown to_markdown(language="ru") Отчёт с таблицами и диаграммой Mermaid (русский / английский)
ГОСТ to_gost(language="ru") Артефакты по ГОСТ Р 56939-2024 (п. 5.7.3.1–5.7.3.7)
SARIF 2.1.0 to_sarif() Стандарт обмена результатами анализа
Mermaid DFD to_mermaid_dfd() Диаграмма потоков данных в формате Mermaid

Диаграмма Mermaid использует следующие обозначения:

  • Процессы: (имя) – скруглённый прямоугольник.
  • Хранилища данных: [(имя)] – цилиндр.
  • Внешние сущности: [/имя\] – трапеция.
  • Потоки через границу доверия: пунктирная стрелка -.->.
  • Шифрованные потоки: подпись encrypted.
  • Границы доверия: подграфы (subgraph).

Использование CLI

Генерация модели угроз

python -m src.cli threat-model generate [--db ПУТЬ] [--format json|markdown|gost|sarif] \
    [--language ru|en] [--output ФАЙЛ] [--min-severity low|medium|high|critical]

Пример:

# Полная модель в формате ГОСТ (русский)
python -m src.cli threat-model generate --format gost --language ru --output threat_model_gost.md

# JSON для автоматической обработки
python -m src.cli threat-model generate --format json --output threat_model.json

# Только критические и высокие угрозы
python -m src.cli threat-model generate --min-severity high --format markdown

Инкрементальное обновление

python -m src.cli threat-model update [--db ПУТЬ] [--previous ФАЙЛ] \
    [--changed-files ФАЙЛ1,ФАЙЛ2,...] [--output ФАЙЛ]

Пример:

# Обновление после изменений
python -m src.cli threat-model update --previous threat_model.json \
    --changed-files src/api/main.py,src/auth/handler.py --output updated_model.json

Генерация DFD

python -m src.cli threat-model dfd [--db ПУТЬ] [--format mermaid|json] [--output ФАЙЛ]

Пример:

# Диаграмма потоков данных в формате Mermaid
python -m src.cli threat-model dfd --format mermaid --output dfd.mmd

Список угроз

python -m src.cli threat-model list [--db ПУТЬ] [--category spoofing|tampering|...] \
    [--severity critical|high|medium|low] [--status open|mitigated]

Пример:

# Все открытые угрозы категории «Повышение привилегий»
python -m src.cli threat-model list --category elevation --status open

# Критические угрозы
python -m src.cli threat-model list --severity critical

Конечные точки API

7 конечных точек REST API по пути /api/v1/security/threat-model/:

Метод Путь Описание
POST /api/v1/security/threat-model/generate Генерация полной модели угроз
POST /api/v1/security/threat-model/update Инкрементальное обновление
GET /api/v1/security/threat-model/ Получение текущей модели
GET /api/v1/security/threat-model/dfd Получение DFD (JSON или Mermaid)
GET /api/v1/security/threat-model/threats Список угроз с фильтрацией
GET /api/v1/security/threat-model/summary Сводка: количество по категориям и критичности
GET /api/v1/security/threat-model/compliance Оценка соответствия ГОСТ

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

Генерация модели:

curl -X POST http://localhost:8000/api/v1/security/threat-model/generate \
    -H "Content-Type: application/json" \
    -d '{"format": "json", "language": "ru", "min_severity": "low"}'

Получение DFD в формате Mermaid:

curl http://localhost:8000/api/v1/security/threat-model/dfd?format=mermaid

Фильтрация угроз по категории и критичности:

curl "http://localhost:8000/api/v1/security/threat-model/threats?category=tampering&severity=critical"

Оценка соответствия ГОСТ:

curl http://localhost:8000/api/v1/security/threat-model/compliance

Ответ:

{
  "compliance_score": 0.72,
  "total_threats": 18,
  "mitigated_threats": 13,
  "gost_reference": "GOST R 56939-2024, 5.7"
}

Инструменты MCP

Два инструмента MCP для использования из OpenCode или других MCP-клиентов:

codegraph_threat_model_generate

Генерация модели угроз STRIDE.

Параметры:

Параметр Тип По умолчанию Описание
format string "json" Формат: json, markdown, gost, sarif
language string "ru" Язык отчёта: ru, en
min_severity string "low" Минимальная критичность: low, medium, high, critical
include_dfd boolean true Включить диаграмму потоков данных

Пример вызова:

{
  "tool": "codegraph_threat_model_generate",
  "arguments": {
    "format": "markdown",
    "language": "ru",
    "min_severity": "medium"
  }
}

codegraph_threat_model_dfd

Получение диаграммы потоков данных.

Параметры:

Параметр Тип По умолчанию Описание
format string "mermaid" Формат: mermaid, json

Соответствие ГОСТ Р 56939-2024

Модуль реализует требования процесса 5.7 «Моделирование угроз» ГОСТ Р 56939-2024. Формат экспорта gost генерирует артефакты для пунктов 5.7.3.1–5.7.3.7:

Пункт ГОСТ Артефакт Реализация
5.7.3.1 Модель угроз безопасности Таблица угроз STRIDE с категорией, критичностью, CWE, компонентом
5.7.3.2 Перечень мер нейтрализации угроз Приоритизированный список мер (18 базовых + CWE-специфичные)
5.7.3.3 Описание поверхности атаки Точки входа, границы доверия, потоки через границы
5.7.3.4 Перечень целей для исследований Компоненты с наибольшим числом критичных угроз
5.7.3.5 Требования безопасности Извлекаются из мер противодействия
5.7.3.6 Отчёт о тестировании безопасности Интеграция с SARIF-выходом
5.7.3.7 Документация изменений Инкрементальное обновление (ThreatModelDelta)

Свойство ThreatModel.compliance_score вычисляет долю угроз со статусом mitigated в общем числе угроз – показатель зрелости нейтрализации.

Конфигурация

Настройки в файле config.yaml в разделе threat_model::

threat_model:
  methodology: stride
  auto_generate_on_import: true
  include_inferred_threats: true
  min_severity_for_report: low
  trust_boundary_network_indicators:
    - recv
    - accept
    - listen
    - http_handler
    - grpc_handler
  trust_boundary_auth_indicators:
    - authenticate
    - authorize
    - check_permission
    - verify_token
  trust_boundary_ffi_indicators:
    - cgo_call
    - ctypes
    - cffi
    - jni
  severity_weight_critical: 10
  severity_weight_high: 7
  severity_weight_medium: 4
  severity_weight_low: 1
  likelihood_weight_high: 3
  likelihood_weight_medium: 2
  likelihood_weight_low: 1

Доступ из кода через ThreatModelConfig в src/config/unified_config.py:

from src.config import get_unified_config

cfg = get_unified_config()
cfg.threat_model.methodology                       # "stride"
cfg.threat_model.auto_generate_on_import           # True
cfg.threat_model.include_inferred_threats           # True
cfg.threat_model.min_severity_for_report           # "low"
cfg.threat_model.trust_boundary_network_indicators # ["recv", "accept", ...]
cfg.threat_model.severity_weight_critical          # 10

Описание параметров:

Параметр Тип По умолчанию Описание
methodology str "stride" Методология моделирования угроз
auto_generate_on_import bool true Автоматическая генерация при импорте проекта
include_inferred_threats bool true Включать угрозы, выведенные из пересечений границ
min_severity_for_report str "low" Минимальная критичность для включения в отчёт
trust_boundary_network_indicators list см. выше Индикаторы сетевой границы доверия
trust_boundary_auth_indicators list см. выше Индикаторы границы аутентификации
trust_boundary_ffi_indicators list см. выше Индикаторы границы межъязыкового вызова
severity_weight_* int 10/7/4/1 Весовые коэффициенты критичности для risk_score
likelihood_weight_* int 3/2/1 Весовые коэффициенты вероятности для risk_score

Модели данных

Файл: src/security/threat_model/models.py

ThreatModel

Корневая модель – совокупная модель угроз проекта:

Поле Тип Описание
project_name str Название проекта
version str Версия модели
methodology str Методология ("STRIDE")
components List[DataComponent] Компоненты DFD
flows List[DataFlow] Потоки данных
trust_boundaries List[TrustBoundary] Границы доверия
threats List[STRIDEThreat] Перечень угроз
attack_surface_summary Dict Сводка поверхности атаки
metadata Dict Метаданные (версии, изменения)
generated_at str Дата генерации (ISO 8601)

Свойства: threat_count_by_category, threat_count_by_severity, compliance_score.

STRIDEThreat

Запись об отдельной угрозе:

Поле Тип Описание
id str Уникальный идентификатор (например, TM-spoofing-CWE-287-h42)
category STRIDECategory Категория STRIDE
title str Краткое название
description str Подробное описание
affected_component_id str Затронутый компонент DFD
affected_flow_id Optional[str] Затронутый поток данных
cwe_ids List[str] Связанные идентификаторы CWE
capec_ids List[str] Связанные идентификаторы CAPEC
severity str Критичность: critical, high, medium, low
likelihood str Вероятность: high, medium, low
mitigations List[str] Рекомендованные меры противодействия
status str Статус: open, mitigated

Свойство risk_score: произведение весов критичности и вероятности.

ThreatModelDelta

Разница между двумя версиями модели:

Поле Тип Описание
added_threats List[STRIDEThreat] Новые угрозы
removed_threats List[STRIDEThreat] Удалённые угрозы
modified_threats List[STRIDEThreat] Изменённые угрозы
added_components List[DataComponent] Новые компоненты
removed_components List[DataComponent] Удалённые компоненты

Отображение CWE на STRIDE

Словарь CWE_TO_STRIDE в файле src/security/threat_model/stride_classifier.py содержит 43 записи. Некоторые CWE отображаются в несколько категорий STRIDE:

CWE Категории STRIDE
CWE-287, CWE-290, CWE-294, CWE-295, CWE-306, CWE-384, CWE-613 Подмена
CWE-20, CWE-89, CWE-352, CWE-434, CWE-917 Подделка данных
CWE-79, CWE-611 Подделка данных + Раскрытие информации
CWE-94, CWE-78, CWE-502 Подделка данных + Повышение привилегий
CWE-778, CWE-223 Отказ от авторства
CWE-532 Отказ от авторства + Раскрытие информации
CWE-200, CWE-209, CWE-312, CWE-319, CWE-522, CWE-538, CWE-732 Раскрытие информации
CWE-601 Раскрытие информации + Подмена
CWE-400, CWE-770, CWE-776, CWE-835, CWE-674 Отказ в обслуживании
CWE-250, CWE-269, CWE-276, CWE-863, CWE-862, CWE-120, CWE-416, CWE-787 Повышение привилегий
CWE-476, CWE-190 Отказ в обслуживании + Повышение привилегий

Форматы экспорта

JSON

Полная сериализация модели с вложенными объектами. Пригоден для автоматической обработки, сравнения версий и хранения.

Markdown

Структурированный отчёт с таблицами, диаграммой Mermaid DFD, перечнем границ доверия, списком угроз и рекомендациями. Поддерживает русский и английский языки.

ГОСТ

Артефакты в соответствии с ГОСТ Р 56939-2024: модель угроз (5.7.3.1), перечень мер (5.7.3.2), описание поверхности атаки (5.7.3.3), перечень целей исследований (5.7.3.4). Разделы отделены горизонтальной чертой.

SARIF 2.1.0

Стандартный формат обмена результатами статического анализа. Совместим с инструментами визуализации (GitHub Code Scanning, VS Code SARIF Viewer).

Mermaid DFD

Диаграмма потоков данных в текстовом формате Mermaid. Границы доверия отображаются как подграфы. Потоки, пересекающие границы, отмечены пунктиром.

Пример:

graph LR
    subgraph tb_network["Network Boundary"]
        proc_api_main(api/main)
    end
    ext_network[/Network/]
    store_database[(Database)]
    ext_network -.->|http user_input| proc_api_main
    proc_api_main -->|tcp| store_database