open atlas
↑ К треку
Основы безопасности SECF · 01 · 02

STRIDE: словарь того, что может пойти не так

STRIDE — это шесть подсказок: Spoofing, Tampering, Repudiation, Information disclosure, Denial of service, Elevation of privilege, каждая из которых отрицает одно свойство безопасности. Это словарь полноты, а не чек-лист, применяемый поэлементно.

SECF Middle ◷ 17 min
Уровень
ОсновыJuniorMiddleSenior

Вы на дизайн-ревью новой фичи «экспорт моих данных». Кто-то спрашивает: «это безопасно?» — и в комнате повисает тишина, потому что никто не знает, с чего начать. Один инженер беспокоится об SQL-инъекции, другой — о лимитах запросов, третий говорит: «у нас есть авторизация, всё нормально». Три человека, три угрозы, ни одной общей карты. Именно эту тишину STRIDE и создан убивать. Это не сканер и он не ищет баги; это словарь из шести слов, превращающий вопрос «это безопасно?» в шесть конкретных, отвечаемых вопросов — так что комната спорит о полноте покрытия, а не смотрит в потолок.

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

Откуда взялся STRIDE и что это вообще такое

STRIDE — мнемоника, придуманная в Microsoft в 1999 году, чтобы дать инженерам структурированный способ спрашивать «как это может сломаться?». До неё мозговой штурм угроз был тем, что вспоминал самый параноидальный человек в комнате. Идея STRIDE мала, но мощна: у каждой цели безопасности есть обратная сторона, и эта обратная сторона — угроза. Поэтому вместо перечисления атак (их бесконечно много) вы перечисляете шесть способов нарушить свойство безопасности. Шесть подсказок покрывают всё пространство.

Секрет того, как усвоить STRIDE, — читать его как список отрицаний. Аутентификация говорит «вы тот, за кого себя выдаёте» — отрицаем и получаем Spoofing. Целостность говорит «данные и код не изменены» — отрицаем и получаем Tampering. Каждая буква — это свойство, вывернутое наизнанку:

  • Spoofing отрицает аутентификацию — выдача себя за кого-то или что-то, кем вы не являетесь.
  • Tampering отрицает целостность — изменение данных или кода, которые вы менять не должны.
  • Repudiation отрицает неотказуемость — совершить действие и затем правдоподобно его отрицать, потому что ничто его не зафиксировало.
  • Information disclosure отрицает конфиденциальность — раскрытие данных тому, кто не имеет права их видеть.
  • Denial of service отрицает доступность — приведение системы в состояние, непригодное для легитимных пользователей.
  • Elevation of privilege отрицает авторизацию — получение возможностей сверх выданных вам.

Это взаимно однозначное соответствие — весь движок. Если вы можете перечислить шесть свойств, вы можете воссоздать STRIDE с нуля — и, что важнее, найдя угрозу, вы можете назвать, какую гарантию она ломает, а это говорит, какой класс контролей её исправляет.

Шесть угроз — с конкретной формой и митигацией для каждой

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

STRIDEНарушенное свойствоКонкретный примерСемейство митигаций
SpoofingАутентификацияПодделанная сессионная cookie или повторно проигранный токен даёт чужую личностьСильная аутентификация, MFA, подписанные короткоживущие токены, mutual TLS
TamperingЦелостностьКлиент меняет скрытое поле price; строка изменена в путиСерверная валидация, HMAC/подписи, TLS, ограничения БД
RepudiationНеотказуемостьАдмин удаляет запись, и нет лога, доказывающего, кто это сделалЗащищённые от подделки журналы аудита, подписанные квитанции, метки времени
Information disclosureКонфиденциальностьПодробная ошибка раскрывает стек-трейс; PII другого пользователя в ответеШифрование на диске/в пути, наименьшие привилегии, фильтрация вывода
Denial of serviceДоступностьНеограниченный запрос или zip-бомба исчерпывают CPU/памятьЛимиты запросов, квоты, таймауты, ограничения размера ввода, автомасштабирование
Elevation of privilegeАвторизацияОбычный пользователь напрямую бьёт в POST /admin/promote, и это срабатываетСерверная авторизация, deny-by-default, песочницы, наименьшие привилегии

Обратите внимание: колонка митигаций — это семейства, а не отдельные фиксы. «Сильная аутентификация» — это направление, а не строка кода. Задача STRIDE — указать вам на нужное семейство; выбор конкретного контроля — это следующий, отдельный шаг. Ценность в том, что вы больше никогда не спрашиваете «это безопасно?» — вы задаёте шесть вопросов, ответы на которые реально можете защитить на ревью.

STRIDE-per-element: куда направлять шесть вопросов

Шесть категорий — лишь половина метода. Вторая половина — это где вы их задаёте. STRIDE-per-element означает, что вы не допрашиваете всю систему разом — вы проходите её по одному элементу за раз и применяете релевантное подмножество STRIDE к каждому.

Почему это важно: не каждая угроза применима к каждому элементу. Категории группируются по типу элемента. Внешние сущности (пользователи, сторонние сервисы) могут быть Spoofed и могут Repudiate, но вы не «подделываете» пользователя. Процессы (ваши сервисы) подвержены всем шести. Хранилища данных (базы, кэши, файлы) ощущают Tampering, Information disclosure, Denial of service и Repudiation (если там живут логи) — но базу не «спуфят» так, как пользователя. Потоки данных (запросы, пересекающие границу) — там концентрируются Tampering, Information disclosure и Denial of service. Сопоставление тип элемента → применимые буквы делает упражнение конечным и не даёт вам генерировать бессмысленные угрозы.

Разбор: эндпоинт «экспорт моих данных»

Возьмём фичу из хука — GET /export отдаёт данные авторизованного пользователя файлом на скачивание. Пройдём три элемента и зададим STRIDE.

Пользователь (внешняя сущность). Spoofing: может ли кто-то предъявить чужую сессию и выгрузить его данные? Семейство контролей — сильная аутентификация: короткоживущие подписанные сессионные токены, а не угадываемый id. Repudiation: если пользователь потом заявит «я ничего не экспортировал», сможете ли вы доказать обратное? Нужна запись в журнале аудита, привязанная к личности, и метка времени.

Поток запроса (GET /export, пересекающий сетевую границу). Tampering: может ли клиент изменить параметр запроса — скажем, ?user_id= — чтобы перенаправить экспорт на кого-то другого? Information disclosure: идёт ли ответ по TLS, или его можно прочитать на проводе? Семейства фиксов — серверная привязка параметров (выводить пользователя из сессии, никогда из запроса) и шифрование транспорта.

Процесс API и база данных (процесс + хранилище). Elevation of privilege: обработчик достаёт по WHERE id = ? в одиночку, позволяя любому аутентифицированному вызывающему экспортировать любую строку — или он ограничивает выборку владельцем? Denial of service: может ли кто-то запросить экспорт настолько большой, что он положит CPU или заполнит диск, без ограничения размера и лимита запросов? Information disclosure: не включает ли экспорт случайно колонки, которые пользователь видеть не должен, — внутренние флаги, ссылки на чужие данные?

Этот единственный эндпоинт, пройденный через STRIDE-per-element, дал восемь конкретных, исправимых вопросов примерно за минуту. Ни один не потребовал инструмента. В этом весь смысл: структура побеждает память.

Почему это работает

Почему шесть и почему именно эти шесть? STRIDE сознательно ложится на классические свойства безопасности (триада CIA — конфиденциальность, целостность, доступность — плюс аутентификация, авторизация и неотказуемость). Это не совпадение, это замысел. Поскольку каждая категория — отрицание свойства, которое система уже обещает, STRIDE наследует полноту этого набора свойств. Если ваша система даёт гарантию, которую STRIDE не покрывает — скажем, приватность как несвязываемость, — то один STRIDE неполон, и именно поэтому существуют более поздние фреймворки вроде LINDDUN для приватности. Знание того, что STRIDE покрывает, точно говорит, когда выйти за его пределы.

Старшая тонкость: подсказка, а не чек-лист

Самый частый способ злоупотребить STRIDE — относиться к шести буквам как к чек-листу для галочек: «Spoofing — готово, у нас есть логин. Дальше». Это схлопывает инструмент мышления в ритуал соответствия и именно так реальные угрозы проскальзывают. STRIDE — это подсказка для полноты: его задача — убедиться, что вы рассмотрели каждую категорию, а не сертифицировать, что одно предложение на букву делает вас в безопасности.

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

Выбери лучший вариант

Команда внедряет STRIDE для новой платёжной фичи. Как реально его прогнать, чтобы он давал ценность, а не превратился в ритуал по чек-листу?

Викторина

Админ удаляет запись клиента, и через недели никто не может доказать, кто это сделал, потому что ничего не логировалось. Какая это категория STRIDE и какое свойство нарушено?

Викторина

Вы применяете STRIDE-per-element к базе Postgres (хранилище данных). Какую букву наименее естественно задавать ей?

Расставь шаги по порядку

Расставьте категории STRIDE в каноническом порядке S-T-R-I-D-E:

  1. 1 Spoofing (отрицает аутентификацию)
  2. 2 Tampering (отрицает целостность)
  3. 3 Repudiation (отрицает неотказуемость)
  4. 4 Information disclosure (отрицает конфиденциальность)
  5. 5 Denial of service (отрицает доступность)
  6. 6 Elevation of privilege (отрицает авторизацию)
Вспомните перед уходом
  1. 01
    Перечислите шесть категорий STRIDE и свойство безопасности, которое каждая нарушает, с одним конкретным примером на каждую.
  2. 02
    Что означает STRIDE-per-element и почему STRIDE — это «подсказка для полноты, а не чек-лист»?
Итог

STRIDE — это словарь из шести слов: Spoofing, Tampering, Repudiation, Information disclosure, Denial of service, Elevation of privilege — чтобы структурированно спрашивать «как это может сломаться?». Его движок в том, что каждая категория — отрицание одного свойства безопасности: аутентификации, целостности, неотказуемости, конфиденциальности, доступности и авторизации соответственно. Каждая ложится на семейство контролей, а не на единственный фикс, так что STRIDE указывает вам на нужный род защиты и оставляет конкретный выбор вам. Вы применяете его поэлементно (STRIDE-per-element) — проходя внешние сущности, процессы, хранилища и потоки и задавая только подходящие типу элемента буквы, — что держит упражнение конечным, как показал разбор эндпоинта «экспорт моих данных», давший восемь конкретных вопросов за минуту. Старшая дисциплина — относиться к шести как к подсказке для полноты, а не к чек-листу: сгенерировать кандидатов каждой буквой, затем отсортировать по вероятности и влиянию и записать только угрозы, стоящие решения. Перебор топит сигнал; недобор пропускает мерзкую вторую угрозу. В следующий раз, когда кто-то спросит «это безопасно?», у вас будет шесть вопросов вместо тишины.

Практика

Начни сверху. Задачи идут от простого к сложному: вспомнить факт, применить к случаю, затем senior-уровень. Открой, попробуй, потом открой ответ.

вспомнитьприменитьуглубить0 из 5 завершено
Связанные уроки

Что-то непонятно?

Задай вопрос по этому уроку. Вопросы анонимны и попадают напрямую автору — урок станет лучше.

Примени это

Примени этот урок в реальном проекте.

хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources2
expand
  1. 01
  2. 02

Trademarks belong to their respective owners. Editorial reference only.