Threat modeling concept page (STRIDE methodology). DFD with trust boundaries (Internet -> DMZ -> App tier -> Data tier). Three scenarios: STRIDE walkthrough on login flow (Spoofing/Tampering/Repudiation/Information disclosure/DoS/Elevation), STRIDE on file upload feature, LINDDUN privacy threat model for GDPR PII flow. Includes ADR on lightweight vs formal SDLC threat modeling.
Threat modeling — это дисциплина дизайн-стадии: за 1-2 часа на whiteboard'е команда отвечает на 4 вопроса (Что строим? Что может пойти не так? Что с этим делаем? Хорошо ли поработали?) и фиксирует список конкретных угроз с mitigations. По данным NIST, ~50% уязвимостей закладываются на этапе дизайна и стоят в 30 раз дороже, если их чинить после релиза. STRIDE (Microsoft, 1999) — самая известная mnemonic-таксономия для шага «что может пойти не так», LINDDUN — её privacy-аналог для GDPR-чувствительных систем, DREAD/CVSS — для приоритизации найденных угроз.
Threat model — это не «отчёт для аудитора», а рабочий артефакт команды: фотография доски + одностраничный список threats с owner-ами и Jira-тикетами на mitigations. Если документ никто не читает после написания — он мёртв.
Threat modeling = DFD (Data Flow Diagram) + trust boundaries + STRIDE walk.
DFD рисуется тремя элементами: processes (то, что выполняет код), data stores (БД, файлы, кеши), external entities (пользователь, third-party API). Соединяются они data flows (рёбра со стрелками). Поверх рисуем trust boundaries — линии, через которые данные переходят «из менее доверенной зоны в более доверенную» (интернет → DMZ → app tier → data tier).
Главное правило: анализ STRIDE применяется к каждому пересечению trust boundary, не к каждому компоненту. На пересечении ставим 6 вопросов:
Для каждой угрозы — конкретный mitigation (control), owner, тикет. Список угроз без mitigations — это bookkeeping, не безопасность.
Канва — упрощённый, но реалистичный backend: внешний пользователь, атакующий, edge (LB + WAF), application tier (auth, API, upload service), data tier (PostgreSQL c PII, KMS, S3, audit log). Группы соответствуют trust zones — данные, переходя между ними, проходят STRIDE-проверки.
Каждое ребро в диаграмме — физическое соединение через границу. На пересечениях должны висеть проверки: TLS, JWT validation, IAM-role с least privilege, encryption at rest, audit logging. Edge от attacker к LB существует, чтобы напомнить: attacker уже в сети, периметр не равен безопасности.
STRIDE walk на login flow. Идём по 4-question framework: что мы строим (DFD), что может пойти не так (STRIDE по каждой boundary), что делаем (конкретный mitigation), хорошо ли (review). На каждом из 6 шагов рассматриваем одну букву применительно к login: S = атакующий выдаёт себя за user (mitigation: MFA + WebAuthn); T = меняет request body (TLS integrity + HMAC); R = user потом отрицает что логинился (signed audit log с IP+timestamp); I = bcrypt-хэши утекают из БД (encryption at rest + ACL); D = brute-force атака (rate limit + account lockout); E = JWT с подделанным role=admin (sign+verify, never trust client). Финал — review: pen-test, regression suite, table-top exercise.
STRIDE per-element для file upload feature. File upload — классический «привлекательный» компонент для атакующего: исполняемые файлы, path traversal, zip-бомбы, polyglot-форматы (валидный JPEG, который ещё и PHP). Проходим STRIDE: spoofing (требуем auth token), tampering (sanitize filename + UUID rename), information disclosure (per-user prefix в S3 + signed URLs, чтобы user1 не читал файлы user2), DoS (max-size + streaming + per-user quota), elevation (отдельный домен/субдомен для uploaded content, no execute permission — иначе .php = RCE). Audit log на каждый upload для forensics и compliance. Pen-test покрывает: zip bomb, polyglot, SSRF через SVG (<image href="http://internal">), EXIF leakage (GPS координаты в JPEG).
LINDDUN walk — privacy-focused threat model. Для GDPR-чувствительных систем STRIDE недостаточен — он про security, не про privacy. LINDDUN добавляет privacy-угрозы: Linkability (две сессии связываются в одного user через fingerprint), Identifiability (anonymous данные деанонимизируются: Latanya Sweeney показала что 87% американцев уникально идентифицируются по {zip, gender, dob}), Non-repudiation как privacy-проблема (право быть забытым: user должен мочь отозвать данные), Detectability (timing-attack на /forgot-password показывает, зарегистрирован ли email), Disclosure (error message «user not found in tenant Y» утекает metadata о существовании tenant'а), Unawareness (user не знает что мы собираем precise location и behavioural recording), Non-compliance (PII европейцев попадает в US-based S3 — Schrems II violation). Mitigations: granular consent UI, region pinning per tenant, generic error messages с constant time, soft-delete с tombstone + hard-delete через retention period, DSAR endpoint, DPIA для high-risk processing.
Главный design-trade-off threat modeling'а — как глубоко идти. Спектр: от 1-часового whiteboard'а на feature до 2-4 недель формального SDL-процесса с dedicated security architect и DFD-инструментами. Выбор зависит от трёх факторов: blast radius (формальный процесс обязателен для PII/PHI/payments/critical infra, потому что compliance-аудиторы требуют evidence, и whiteboard-фоткой их не убедить), частота изменений (microservices с 50 deploys/день не выдержат формальный процесс — модель устареет за неделю, нужен code-as-DFD типа PyTM/Threagile в CI), maturity команды (junior team тонет в формализме без понимания, лучше lightweight + pairing; senior выжимает из часа на доске больше insight-ов чем формальный процесс за неделю). Default — lightweight whiteboard на дизайн-стадии, эскалация к формальному процессу по триггерам (новая интеграция с external party, compliance audit, security incident).
Threat modeling — не silver bullet, и в нескольких ситуациях формальный процесс — overkill:
Threat modeling также не заменяет: SAST/DAST (находят bugs в коде), pen-test (валидируют гипотезы), SIEM/detection (ловят атаку в runtime), bug bounty (находят то, что пропустили все остальные). Это дополнительный layer на дизайн-стадии.
Канон: