STRIDE: словарь того, что может пойти не так
STRIDE — это шесть подсказок: Spoofing, Tampering, Repudiation, Information disclosure, Denial of service, Elevation of privilege, каждая из которых отрицает одно свойство безопасности. Это словарь полноты, а не чек-лист, применяемый поэлементно.
Вы на дизайн-ревью новой фичи «экспорт моих данных». Кто-то спрашивает: «это безопасно?» — и в комнате повисает тишина, потому что никто не знает, с чего начать. Один инженер беспокоится об 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 Spoofing (отрицает аутентификацию)
- 2 Tampering (отрицает целостность)
- 3 Repudiation (отрицает неотказуемость)
- 4 Information disclosure (отрицает конфиденциальность)
- 5 Denial of service (отрицает доступность)
- 6 Elevation of privilege (отрицает авторизацию)
- 01Перечислите шесть категорий STRIDE и свойство безопасности, которое каждая нарушает, с одним конкретным примером на каждую.
- 02Что означает STRIDE-per-element и почему STRIDE — это «подсказка для полноты, а не чек-лист»?
STRIDE — это словарь из шести слов: Spoofing, Tampering, Repudiation, Information disclosure, Denial of service, Elevation of privilege — чтобы структурированно спрашивать «как это может сломаться?». Его движок в том, что каждая категория — отрицание одного свойства безопасности: аутентификации, целостности, неотказуемости, конфиденциальности, доступности и авторизации соответственно. Каждая ложится на семейство контролей, а не на единственный фикс, так что STRIDE указывает вам на нужный род защиты и оставляет конкретный выбор вам. Вы применяете его поэлементно (STRIDE-per-element) — проходя внешние сущности, процессы, хранилища и потоки и задавая только подходящие типу элемента буквы, — что держит упражнение конечным, как показал разбор эндпоинта «экспорт моих данных», давший восемь конкретных вопросов за минуту. Старшая дисциплина — относиться к шести как к подсказке для полноты, а не к чек-листу: сгенерировать кандидатов каждой буквой, затем отсортировать по вероятности и влиянию и записать только угрозы, стоящие решения. Перебор топит сигнал; недобор пропускает мерзкую вторую угрозу. В следующий раз, когда кто-то спросит «это безопасно?», у вас будет шесть вопросов вместо тишины.
Практика
Начни сверху. Задачи идут от простого к сложному: вспомнить факт, применить к случаю, затем senior-уровень. Открой, попробуй, потом открой ответ.
Что-то непонятно?
Задай вопрос по этому уроку. Вопросы анонимны и попадают напрямую автору — урок станет лучше.
Примени это
Примени этот урок в реальном проекте.