Руководство по автоматическому построению модели угроз на основе методологии STRIDE из данных графа свойств кода (CPG). Соответствует требованиям ГОСТ Р 56939-2024, процесс 5.7.
Содержание¶
- Обзор
- Методология STRIDE
- Архитектура
- Построитель DFD
- Детектор границ доверия
- Классификатор STRIDE
- Рекомендатель мер противодействия
- Инкрементальный модуль обновления
- Экспортёр
- Использование CLI
- Конечные точки API
- Инструменты MCP
- Соответствие ГОСТ Р 56939-2024
- Конфигурация
- Модели данных
- Отображение CWE на STRIDE
- Форматы экспорта
Обзор¶
Модуль моделирования угроз CodeGraph автоматически строит модель угроз из CPG проекта. Анализ включает:
- Построение диаграммы потоков данных (DFD) из точек входа, хранилищ данных и внешних сущностей CPG.
- Обнаружение 5 типов границ доверия эвристическими методами.
- Классификацию угроз по 6 категориям STRIDE на основе отображения 43 CWE и результатов системы гипотез.
- Формирование мер противодействия (18 базовых + CWE-специфичные).
- Инкрементальное обновление при изменении кодовой базы.
- Экспорт в форматы 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 |
Обнаружение выполняется в два этапа:
- Эвристическое сопоставление: категории точек входа и имена методов сравниваются с индикаторами каждого типа границы.
- Запрос CPG: дополнительный поиск в таблице
nodes_methodпо шаблонамLIKEдля индикаторных имён.
После обнаружения границ детектор помечает потоки данных, пересекающие
границы (DataFlow.crosses_trust_boundary = True). Критерии пересечения:
- Различие уровней доверия источника и приёмника.
- Источник и приёмник находятся по разные стороны явной границы
(один во
inner_components, другой вouter_components).
Индикаторы настраиваются через конфигурацию (см. Конфигурация).
Классификатор STRIDE¶
Файл: src/security/threat_model/stride_classifier.py
Класс STRIDEClassifier генерирует список угроз из нескольких источников:
- Результаты системы гипотез (CWE): каждая находка с идентификатором CWE
отображается в одну или несколько категорий STRIDE через словарь
CWE_TO_STRIDE(43 записи). - Находки шаблонов CPG (
cpg_pattern_findings): SQL-запрос к таблице результатов сканирования шаблонов, затем отображение через CWE. - Вывод из пересечений границ доверия: нешифрованные потоки через сетевую границу, пользовательский ввод через границу, учётные данные без слоя аутентификации.
- Вывод из незащищённых точек входа: сетевые точки входа, не находящиеся внутри границы аутентификации.
После сбора выполняется дедупликация по ключу
(категория, компонент, список 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