Threat modeling для веб-приложений: моделирование угроз до написания кода

Моделирование угроз отвечает на вопрос, что может пойти не так в вашем веб-приложении, пока его можно поменять на схеме, а не в коде. Мы рисуем потоки данных и границы доверия, вместе с вашей командой перебираем угрозы по методу STRIDE и оставляем реестр, где у каждой угрозы есть решение, владелец и проверка. Это проектная работа с людьми, а не сканирование: боевые системы мы не трогаем.

От 200 000 ₽, 2–3 недели на приложениеРабота по схеме и описанию, исходники не обязательныРеестр угроз и схемы остаются у вас в исходных форматах

С чем приходят

Когда нужна модель угроз

Новый продукт, архитектура ещё на бумаге

Ошибки замысла дешевле всего исправлять до первой строки кода, особенно если сервис хранит чужие данные или принимает платежи через ваш эквайринг.

Клиент просит модель угроз в опроснике

Крупный заказчик спрашивает, есть ли документ с угрозами и мерами. Ответ «мы следим за безопасностью» не принимают.

Приложение выходит из внутреннего контура наружу

Раньше им пользовались свои, теперь появляются клиенты, партнёры и API. Допущения, которые были безопасны внутри, перестают работать, и их надо найти явно.

Проверки находят баги, но пропускают проектные дыры

Сканер и ревью кода ловят ошибки реализации. А если защиты нет по замыслу (ссылка из письма живёт вечно, отмену заказа может вызвать любой сотрудник партнёра), код выглядит правильным.

Метод

Что такое моделирование угроз и чем оно отличается от аудита

Работа сводится к четырём вопросам, и результат нужен не для папки, а для задач разработки.

Четыре вопроса

  1. Что мы строим? Схема: участники, компоненты, хранилища данных, потоки между ними.
  2. Что может пойти не так? Перебор угроз по каждому потоку и каждой границе доверия.
  3. Что с этим делаем? По каждой угрозе одно из решений: снизить, передать, принять или избежать, с владельцем и сроком.
  4. Достаточно ли сделали? Проверка: меры попали в задачи, а сценарии атаки стали тестами.

Чем отличается от аудита и ревью

Аудит и ревью читают то, что уже написано, и отвечают, какие ошибки в нём есть. Модель угроз работает со схемой замысла и отвечает, какие защиты должны быть и где их нет. Поэтому её делают до разработки или перед крупным изменением, а не вместо проверки готового кода. Проверка готовой системы описана на странице «Аудит безопасности веб-приложения», ревью кода — на странице «Secure code review».

Модель угроз не заканчивается документом. Она устаревает при каждой новой интеграции, роли или типе данных, поэтому мы оставляем список изменений, после которых её нужно обновить.

Метод STRIDE

Шесть категорий угроз на примерах из веб-приложения

STRIDE — мнемоника из шести категорий. Она не даёт полного перечня, но не позволяет забыть целый класс угроз.

Категория
Что нарушается
Пример в веб-приложении
Типовая мера
КатегорияПодменаSpoofing
Что нарушаетсяПодлинность: кто-то выдаёт себя за другого
Пример в веб-приложенииВход по чужому токену, письмо со ссылкой сброса пароля, поддельный вызов от платёжного провайдера
Типовая мераСильная аутентификация, подпись входящих вызовов, короткий срок жизни ссылок
КатегорияИзменение данныхTampering
Что нарушаетсяЦелостность: данные изменены без права
Пример в веб-приложенииПользователь подменяет цену или идентификатор организации в теле запроса; файл правят прямо в хранилище
Типовая мераПроверка на сервере, а не в интерфейсе; запрет прямой записи в хранилище
КатегорияОтказ от действияRepudiation
Что нарушаетсяНельзя доказать, кто и что сделал
Пример в веб-приложенииЗаказ отменили, а журнал не показывает, кто именно; запись журнала можно удалить
Типовая мераЖурнал с учётной записью, временем и объектом, защита журнала от правки
КатегорияРаскрытие информацииInformation disclosure
Что нарушаетсяКонфиденциальность: данные видит не тот
Пример в веб-приложенииЧужой заказ по прямой ссылке, ошибка с адресом базы в тексте, ключ в репозитории
Типовая мераПрава на каждый запрос, обезличенные ошибки, секреты в хранилище секретов
КатегорияОтказ в обслуживанииDenial of service
Что нарушаетсяДоступность: сервис недоступен
Пример в веб-приложенииТяжёлый запрос без лимита, огромный файл, перебор входа блокирует чужие учётные записи
Типовая мераОграничения размера и частоты, очереди, таймауты
КатегорияПовышение привилегийElevation of privilege
Что нарушаетсяАвторизация: больше прав, чем выдано
Пример в веб-приложенииОбычный пользователь вызывает административный метод; приглашённый сотрудник сам назначает себе роль владельца
Типовая мераПрава по роли, объекту и действию на сервере, тесты из-под каждой роли
Сессии

Как проходит работа: схема, границы доверия, перебор угроз

Кто участвует

Нужны люди, которые знают, как система устроена на самом деле: разработчик или архитектор, аналитик, владелец продукта, администратор, который её эксплуатирует. Достаточно двух-трёх сессий по паре часов: мы ведём и записываем, вы отвечаете на вопросы.

Что рисуем

Сначала активы: что в системе ценно (персональные данные, договорные цены, права на платёж, ключи доступа). Затем потоки данных и границы доверия: там, где данные переходят от менее доверенного участника к более доверенному, чаще всего и живут угрозы. Схема остаётся в формате, который вы редактируете сами.

Условный пример: кабинет клиента с загрузкой документов

На схеме клиент в браузере, сервер приложения, база, хранилище файлов и обмен с 1С. Перебор по границам даёт, например, такие угрозы: ссылка на загруженный документ не имеет срока жизни (раскрытие), сотрудник поддержки входит «от имени клиента» без записи в журнале (отказ от действия), в окне загрузки принимается любой тип файла (подмена и повышение привилегий через содержимое). По каждой записывается решение, и это сразу превращается в три задачи.

Границы доверия

Где в типовом веб-приложении искать угрозы в первую очередь

Заготовка для разбора: в вашей схеме границ будет больше или меньше, вопросы остаются теми же.

Граница
Что пересекает
Типичная угроза
Что проверяем
ГраницаБраузер и серверпубличный интернет
Что пересекаетЛюбой ввод, файлы, токены сессии
Типичная угрозаПодмена идентификаторов и ролей в запросе, перебор, отражённый ввод
Что проверяемЧто сервер проверяет сам и что принимает на веру из браузера
ГраницаСервер и база данныхвнутренняя сеть
Что пересекаетЗапросы и результаты
Типичная угрозаСклейка запросов, избыточные права учётной записи приложения
Что проверяемПрава учётной записи базы, параметризация, разделение данных организаций
ГраницаСервер и внешние сервисыплатежи, почта, карты
Что пересекаетВходящие вызовы, ключи, ответы чужих систем
Типичная угрозаПоддельный вызов, утечка ключа, слепое доверие к ответу
Что проверяемПодпись входящих вызовов, хранение ключей, поведение при недоступности
ГраницаЗагрузка файловпользователь и хранилище
Что пересекаетФайл и его метаданные
Типичная угрозаИсполняемый файл под видом документа, очень большой файл, путь с «../» в имени
Что проверяемТип и размер, хранение вне каталога сайта, отдача по ссылке с проверкой прав
ГраницаСотрудник и клиентразные уровни доверия
Что пересекаетДействия от имени клиента, массовые операции
Типичная угрозаЗлоупотребление правами сотрудника, вход «от имени клиента» без записи
Что проверяемЖурнал, разделение ролей, подтверждение опасных действий
ГраницаПриложение и учётные системы1С, CRM, склад
Что пересекаетОбмен данными по ключу интеграции
Типичная угрозаКлюч с избыточными правами, повторная отправка, подмена источника
Что проверяемМинимальные права ключа, повторная отправка без дублей, поведение при сбое
Приоритеты

Как оцениваем серьёзность без выдуманных баллов

Числовая шкала создаёт видимость точности, которой нет. Мы используем три вопроса.

  • Кто может это сделать. Аноним из интернета, зарегистрированный пользователь, сотрудник партнёра, ваш сотрудник. Чем шире круг, тем выше приоритет.
  • Что он получит. Чужие данные, деньги, управление системой или только неудобство. Утечка договорных цен и потеря журнала весят по-разному для разных бизнесов, поэтому вес задаёт владелец продукта.
  • Насколько это трудно. Достаточно изменить число в адресе или нужна цепочка из нескольких условий. Если число в адресе, угроза почти всегда идёт первой.

Затем по каждой угрозе записывается решение. Снизить: добавить меру. Передать: платёж принимает провайдер, и данные карт не попадают к вам. Принять: оставить, как есть, с подписью владельца и сроком пересмотра. Избежать: убрать функцию, которая создаёт угрозу. Принятый риск без подписи мы считаем недоделанной работой.

Результат

Что остаётся после работы и как проверить, что оно работает

Что получаете
Что внутри
Кто использует
Как проверяем
Что получаетеСхема потоков данныходна-две страницы
Что внутриУчастники, хранилища, потоки, границы доверия
Кто используетРазработчики, аналитики, новые участники команды
Как проверяемРазработчик подтверждает схему по коду и описанию развёртывания
Что получаетеРеестр угрозтаблица
Что внутриУгроза, категория, затронутый актив, серьёзность, решение, владелец
Кто используетВладелец продукта, ответственный за безопасность
Как проверяемУ каждой угрозы есть решение и человек
Что получаетеТребования безопасностидля задач
Что внутриФормулировки для трекера: ссылка сброса пароля одноразовая и действует ограниченное время
Кто используетАналитики и разработчики
Как проверяемТребования попали в критерии приёмки задач
Что получаетеСценарии злоупотреблениядля тестов
Что внутриЧто пробует злоумышленник, шаг за шагом
Кто используетТестировщики, проверяющие перед выпуском
Как проверяемСценарии стали автоматическими тестами или пунктами проверки
Что получаетеПлан пересмотракогда модель устаревает
Что внутриИзменения, после которых модель обновляется: новая интеграция, роль, тип данных
Кто используетКоманда разработки
Как проверяемПункт добавлен в процесс изменений
Что делаем

Из чего состоит работа и сколько она стоит

Цены — по тарифам, моделирование угроз идёт по шкале обследования. Остановиться можно после любой ступени; работы дешевле 150 000 ₽ не берём.

Модель угроз одного приложения

Одно приложение с одним-двумя основными процессами и одной-двумя связанными системами. На выходе схема, реестр угроз, требования и сценарии злоупотребления. Вычитается из первого этапа, если продолжаете с нами.

200 000 ₽ · 2–3 недели

Приложение с несколькими интеграциями

Учёт, платежи, почта, внешний API и кабинет вместе. Добавляется карта источников истины и угрозы на каждой границе обмена.

350 000 ₽ · 3–4 недели

Пилот лёгкий: из модели в работу

Требования переносятся в ваш трекер, сценарии злоупотребления становятся тестами, самые серьёзные меры проверяются в коде.

150 000–400 000 ₽ · 2–8 недель

Сопровождение: пересмотр модели

Обновляем модель при новых интеграциях и ролях, участвуем в обсуждении проектных решений. Часы сверх пакета — 5 000 ₽ в час.

20 000 / 60 000 / 120 000 ₽ в месяц
Процесс

Как идёт работа

Перед стартом — Материалы и участники

Собираем схему архитектуры, список ролей и интеграций, описание развёртывания. Назначаем людей на сессии, с вашей службой безопасности согласуем, что показывать.

Первая неделя — Схема и активы

Рисуем потоки данных, отмечаем границы доверия, фиксируем, что в системе ценно. Схему подтверждает разработчик.

Вторая неделя — Сессии по угрозам

Перебираем угрозы по каждой границе по методу STRIDE. Записываем всё, включая то, что решили принять.

Третья неделя — Реестр и требования

Определяем решения и владельцев, формулируем требования и сценарии для тестов.

Дальше — Передача и пересмотр

Передаём схему и реестр в исходных форматах, оставляем список событий для пересмотра, при необходимости переходим к пилоту.

Цена

Что двигает цену внутри вилки

Размер приложения

Число ролей, процессов и типов данных. Платформа с настраиваемыми правами и несколькими организациями требует отдельных сессий.

Число интеграций

Каждая внешняя система добавляет границу доверия, ключ доступа и вопросы о поведении при сбое.

Качество исходных материалов

Если схемы нет, первая неделя уходит на восстановление картины.

Контроль

Что остаётся у вас и чего мы не делаем

Остаётся у вас

  • Схемы потоков данных в исходных форматах, которые вы правите сами.
  • Реестр угроз в вашем трекере или таблице, без привязки к нашим инструментам.
  • Требования безопасности и сценарии для тестов, готовые к переносу в задачи.
  • Список событий, после которых модель нужно обновить.
  • Право остановиться после любой ступени: сделанное остаётся у вас по акту.

Мы этого не делаем

  • Не атакуем боевые системы и не проводим пентест: работа идёт по схеме и описанию.
  • Не готовим модель угроз по формам регулятора для государственных информационных систем и не проводим аттестацию; лицензии ФСТЭК у нас нет.
  • Не оцениваем физическую защиту помещений, промышленные контуры и мобильные приложения.
  • Не даём юридических консультаций по персональным данным: оценку обязательств делает юрист заказчика, мы описываем технические меры.
  • Не обещаем полноты: модель фиксирует известные угрозы на сегодня. Работы дешевле 150 000 ₽ не берём, круглосуточно не дежурим.
Граница

Моделирование угроз и соседние услуги: где что

Модель угроз стоит в начале цепочки. Её результат — список мер и сценариев, которые затем проверяются разными способами. Автоматически: SAST, DAST и SCA ловят типовые ошибки реализации. Человеком: ревью кода на безопасность проверяет права и логику, которые сканер не понимает.

Если нужно встроить безопасность во весь цикл разработки, от требований до эксплуатации, это безопасная разработка, а моделирование угроз в ней первый шаг. Для приложения с публичным API угрозы на границе обмена разбирает страница «Защита API от несанкционированного доступа», а выбор способа входа — SSO и MFA.

Как пройти сессию самим, если пока не нужен подрядчик, описано в статье «Как провести моделирование угроз веб-приложения».

Инструменты

На чём собираем

Схемы и реестр
  • draw.io или схемы как текст: Mermaid, PlantUML, лежат в вашем репозитории рядом с кодом
  • OWASP Threat Dragon или pytm, если команде удобнее модель как код
  • Таблица или задачи в вашем трекере вместо отдельной системы
  • Выгрузка реестра в таблицу для службы безопасности и клиентов
Методы и опорные материалы
  • STRIDE для перебора угроз, вопросы LINDDUN для приватности
  • OWASP ASVS и OWASP Cheat Sheet Series как источник формулировок требований
  • Каталоги типовых атак (CAPEC) как подсказка при переборе
  • Четыре вопроса моделирования угроз как скелет каждой сессии
Материалы

Материалы по теме

Статья

Как провести моделирование угроз веб-приложения

Пошаговый порядок сессии для небольшой команды: что рисовать, как перебирать угрозы, что записывать в итоге.

  • Схема и границы
  • Перебор по STRIDE
  • Реестр угроз
Читать →
Статья

OWASP Top 10 простыми словами для заказчика

Десять классов ошибок и вопросы подрядчику. Пригодится, чтобы связать угрозы из модели с тем, что ищут проверки.

  • Десять категорий
  • Вопросы подрядчику
  • Чтение отчёта
Читать →
Статья

Проектирование API для интеграций: версии и ошибки

Как устроена граница обмена между системами. Пригодится, когда модель показывает много внешних вызовов.

  • Версии
  • Ошибки
  • Повторная отправка
Читать →
Заявка

Разберём, где в вашем приложении самые опасные границы

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

Спасибо, заявка отправлена. Ответим в течение рабочего дня.

Не удалось отправить. Напишите в телеграм или позвоните.

Вопросы

Частые вопросы: threat modeling

Что такое threat modeling простыми словами?

Это структурированный разбор того, что может пойти не так в системе, пока она на схеме. Рисуется схема потоков данных, перебираются угрозы по каждому потоку и границе доверия, по каждой записывается решение. Результат нужен команде как список задач и тестов, а не как отчёт для архива.

Сколько стоит моделирование угроз?

Модель одного приложения — 200 000 ₽ за 2–3 недели, приложение с несколькими интеграциями — 350 000 ₽ за 3–4 недели. Сумма вычитается из первого этапа, если продолжаете с нами. Перенос требований в трекер и проверка мер в коде — пилот от 150 000 до 400 000 ₽ за 2–8 недель. Сопровождение модели — 20 000, 60 000 или 120 000 ₽ в месяц.

Нужны ли исходники, или хватит схемы?

Хватит схемы и описания: модель работает на уровне замысла. Исходный код помогает сверить схему с реальностью, и мы просим выборочный доступ, но не обязаны получать его весь. Если нужен разбор самого кода, это ревью кода на безопасность, ссылка выше.

Чем модель угроз отличается от аудита безопасности?

Аудит ищет конкретные ошибки в готовой системе. Модель угроз ищет отсутствующие защиты в замысле, поэтому её делают до разработки или перед крупным изменением. Они дополняют друг друга: модель подсказывает, что проверять аудитом.

Подходит ли это для небольшого сервиса?

Да, если он хранит чужие данные или принимает платежи. Для совсем простого сервиса без личных данных и без внешних подключений достаточно чек-листа; тогда лучше не платить за модель, и мы скажем об этом на созвоне.

Как часто модель нужно пересматривать?

Не по календарю, а по событиям: новая интеграция, новая роль, новый тип данных, выход в интернет, смена способа входа. Список таких событий мы оставляем в документе и предлагаем вписать его в процесс изменений.

Заменяет ли модель угроз требования регулятора или юриста?

Нет. Это технический документ для разработки. Модель по формам регулятора для государственных информационных систем мы не делаем, лицензии ФСТЭК у нас нет. Обязательства по персональным данным оценивает юрист заказчика, мы даём технические меры.

Вы работаете только в Ростове-на-Дону?

Мы в Ростове-на-Дону, работаем с заказчиками по всей России: удалённо и в вашем контуре. Доступ к системам и обследование согласуем на старте с вашей службой безопасности.