agentleFS
robissonrobisson/build-like-amazon-agent-skills/skills/threat-modeling/SKILL.md

threat-modeling

Skill16 starsChanged 38 days agoMITView on GitHub

Security threat modeling using STRIDE methodology adapted for cloud services. Covers data classification, IAM boundaries, encryption requirements, blast radius analysis, and systematic identification of attack vectors before code is written.

45 other projects use a version of this.

Adopted by

Most recently taken up by

Used with

Projects with it also use iac-security, container-security and 9 more.

Other files people use alongside this one.

Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
  • hardw00tSkill

    iac-security

    Infrastructure-as-Code security scanning router for Terraform, CloudFormation, Kubernetes manifests, Helm, ARM/Bicep. Orchestrates Checkov, tfsec, Terrascan, KICS, kubesec, kube-linter, Polaris, cfn-lint/cfn-nag, and OPA/Conftest. Use when auditing IaC for misconfigurations, scanning Terraform plans, validating K8s security policies, checking cloud infrastructure compliance, or authoring custom policy-as-code (Rego).

    Also in 4 projects that use this

  • vbrevikSkill

    container-security

    Scan container images, Dockerfiles, docker-compose files, and Kubernetes manifests for security misconfigurations and vulnerabilities. Uses Trivy for image/IaC scanning and Kubescape for K8s policy compliance. Falls back to regex-based Dockerfile and K8s YAML analysis when tools are unavailable. Produces STIG V-ID-tagged findings for /stig-compliance pipeline. Use when (1) reviewing Docker or K8s configuration changes, (2) scanning container images for OS-level CVEs, (3) validating K8s RBAC and NetworkPolicy configuration, (4) before deployment. Works air-gapped with pre-downloaded vulnerability database.

    Also in 4 projects that use this

  • wgpsecSkill

    prompt-injection

    AI/LLM 间接 Prompt 注入攻击。当目标 AI 系统会处理外部数据源(网页、文档、邮件、数据库、API 返回)时使用。覆盖间接注入、工具链劫持、RAG 投毒、数据外泄等技术。OWASP LLM Top 10 #1 漏洞类别

    Also in 4 projects that use this

  • allanninalSkill

    threat-hunting

    Hunt threats using Sigma detection rules and security analysis techniques. Use when investigating security incidents, creating detection rules, or analyzing suspicious activity.

    Also in 3 projects that use this

  • narlyseorgSkill

    secure-code-review

    Use when reviewing source code for security vulnerabilities, performing static analysis of a codebase, auditing code for injection flaws, authentication issues, cryptographic weaknesses, insecure deserialization, SSRF, path traversal, memory safety bugs, hardcoded secrets, or misconfigurations. Use when the user asks to find security bugs in code, assess code quality from a security perspective, or review pull requests for security implications. Use when performing dependency audits, secrets scanning, or configuration review of application source.

    Also in 3 projects that use this

  • jefflesterSkill

    api-security

    API security best practices and common vulnerability prevention. Enforces security checks for authentication, input validation, SQL injection, XSS, and OWASP Top 10 vulnerabilities. Use when building or modifying APIs.

    Also in 3 projects that use this

The file

Show its rules and text

We split this skill into the rules it gives an agent

19 rules. 0 are common, 19 are distinctive, and 0 are very specific to this project.

  • 0

    Common

    Most of the 40 edited versions we read keep these.

  • 19

    Distinctive

    This author's own choices. Worth a look.

  • 0

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    When adding new data flows (especially customer data or credentials)

    line 23
  2. Distinctive:

    When changing authentication or authorization mechanisms

    line 24
  3. Distinctive:

    When adding new external-facing endpoints (API, web, mobile)

    line 25
  4. Distinctive:

    When integrating with a new third-party service

    line 26
  5. Distinctive:

    When changing trust boundaries (new service-to-service communication)

    line 27
  6. Distinctive:

    When an incident reveals a class of vulnerability (model similar systems)

    line 28
  7. Distinctive:

    Before any Design Bar Raiser review for systems handling sensitive data

    line 29
  8. Distinctive:

    Before identifying threats, classify the data your system handles:

    line 49
  9. Distinctive:

    Create a Data Flow Diagram (DFD) that identifies:

    line 62
  10. Distinctive:

    Data flows: Every arrow between elements (API calls, events, file transfers)

    line 69
  11. Distinctive:

    Every crossing of a trust boundary is a potential attack surface.

    line 97
  12. Distinctive:

    Each service has its own IAM role: No shared roles between services.

    line 135
  13. Distinctive:

    Roles are scoped to minimum needed actions and resources: Use IAM Access Analyzer.

    line 136
  14. Distinctive:

    Human access to production is time-bounded and audited: No persistent admin access.

    line 138
  15. Distinctive:

    Key access policy: Only the owning service's role can use the key for Encrypt/Decrypt.

    line 169
  16. Distinctive:

    No threat model exists for a service handling customer data

    line 244
  17. Distinctive:

    No data classification has been performed.

    line 249
  18. Distinctive:

    No audit logging for access to Restricted or Confidential data

    line 252
  19. Distinctive:

    No automated credential scanning in the CI pipeline

    line 254

“Common” is measured: kept by at least 6 in 10 of the 40 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Threat Modeling

Overview

Threat modeling is the systematic identification of security threats to a system BEFORE the system is built. It answers four questions: What are we building? What can go wrong? What are we going to do about it? Did we do a good enough job? You cannot secure a system by adding security after the fact—security must be designed in. Threat modeling is how you design it in.

A threat model is not a penetration test. Penetration testing finds bugs in implementation. Threat modeling finds flaws in design. A perfectly implemented system with a flawed design is still insecure. You do threat modeling at design time; you do pen testing at implementation time. Both are required; neither replaces the other.

When to Use

  • During the design phase of any new service or feature
  • When adding new data flows (especially customer data or credentials)
  • When changing authentication or authorization mechanisms
  • When adding new external-facing endpoints (API, web, mobile)
  • When integrating with a new third-party service
  • When changing trust boundaries (new service-to-service communication)
  • When an incident reveals a class of vulnerability (model similar systems)
  • Before any Design Bar Raiser review for systems handling sensitive data

Agent Persona

Load agents/security-guardian.md when reviewing the threat model. Use it to challenge trust boundaries, data classification, least privilege, encryption, blast radius, and missing abuse cases.

Template

Write the threat model into .bla/design/<feature-name>/threat-model.md — <service-name> when /onboard Path A produces the baseline off existing code — following skills/threat-modeling/templates/threat-model-template.md; that file is the shape of the threat model, never its destination. The template records the decisions this skill produces — classification, boundaries, STRIDE per crossing, IAM, encryption, blast radius, accepted risks — and deliberately does not restate the tables below, which are the authority. It uses this skill's own Critical/High/Medium/Low severities, mapped to the canonical levels in AGENTS.md → One Severity Scale and One Verdict Scale, and adds no new label.

Amazon Context

Threat models are living documents maintained alongside design documents. They are updated when the system changes, when new threat intelligence emerges, or when incidents reveal gaps. Every system that handles customer data, credentials, or payment information requires a formal threat model reviewed by security teams before launch.

The principle of "blast radius minimization" is paramount: design systems so that a compromise of one component cannot cascade to compromise the entire system. This drives decisions about service boundaries, IAM scope, encryption key separation, and network isolation.

The Process

1. Data Classification

Before identifying threats, classify the data your system handles:

ClassificationDefinitionExamplesRequirements
RestrictedCompromise causes severe harm to customers or business. Regulatory implications.Payment card numbers, SSNs, authentication credentials, encryption keysEncrypted at rest AND in transit. Access logged. Minimal retention. Need-to-know access. Annual audit.
ConfidentialInternal business data. Competitive advantage if disclosed.Customer PII (name, email, address), internal financial data, unreleased product plansEncrypted at rest AND in transit. Access controlled by role. Retention policy enforced.
InternalNot public but low sensitivity. Operational data.Service metrics, internal documentation, team rosters, non-sensitive logsEncrypted in transit. Access controlled by team. Standard retention.
PublicIntended for public consumption.Marketing content, public documentation, open-source codeIntegrity protection (prevent tampering). No confidentiality requirements.

Rule: A system's classification is determined by the HIGHEST classification of data it handles. A service that processes one Restricted field is a Restricted service.

2. System Decomposition

Create a Data Flow Diagram (DFD) that identifies:

Elements

  • External entities: Users, third-party services, partner systems (outside your trust boundary)
  • Processes: Your services, Lambda functions, containers, batch jobs
  • Data stores: Databases, caches, S3 buckets, queues, logs
  • Data flows: Every arrow between elements (API calls, events, file transfers)

Trust Boundaries

Draw lines around components that share the same trust level:

┌─────────────────────── Internet (Untrusted) ───────────────────────┐
│  [Browser]    [Mobile App]    [Partner API]                        │
└──────────────────────────┬─────────────────────────────────────────┘
                           │ TLS
┌──────────────────────────┼─── Public Subnet ───────────────────────┐
│                    [API Gateway + WAF]                              │
└──────────────────────────┬─────────────────────────────────────────┘
                           │ IAM Auth
┌──────────────────────────┼─── Private Subnet ──────────────────────┐
│                    [Application Service]                            │
│                           │                                        │
│              ┌────────────┼────────────┐                           │
│              ▼            ▼            ▼                           │
│        [DynamoDB]   [S3 Bucket]  [SQS Queue]                      │
└────────────────────────────────────────────────────────────────────┘
                           │ Cross-account role
┌──────────────────────────┼─── Separate Account ────────────────────┐
│                    [Audit Log Store]                                │
└────────────────────────────────────────────────────────────────────┘

Every crossing of a trust boundary is a potential attack surface.

3. STRIDE Analysis

For each element and data flow in the DFD, systematically analyze threats using STRIDE:

CategoryThreatQuestion to AskExample
SpoofingIdentity falsificationCan an attacker pretend to be someone/something else?Attacker forges JWT to impersonate another user
TamperingData modificationCan an attacker modify data in transit or at rest?Man-in-the-middle modifies API request; attacker modifies S3 object
RepudiationDenying actionsCan an actor deny performing an action with no proof?Admin deletes records with no audit trail
Information DisclosureData leakageCan an attacker access data they shouldn't?Error messages expose internal system details; logs contain PII
Denial of ServiceAvailability disruptionCan an attacker make the system unavailable?Unbounded request causes OOM; regex DoS; resource exhaustion
Elevation of PrivilegeUnauthorized access escalationCan an attacker gain higher privileges?SSRF to access instance metadata; SQL injection to admin role

STRIDE Per Element

For each component in your DFD, fill in:

Component: [Name]
Trust Level: [What trust boundary is it in?]
Data Classification: [Highest classification of data it touches]

| STRIDE | Applicable? | Threat Scenario | Likelihood | Impact | Mitigation |
|--------|-------------|----------------|-----------|--------|-----------|
| Spoofing | Yes/No | [Specific scenario] | H/M/L | H/M/L | [Control] |
| Tampering | Yes/No | [Specific scenario] | H/M/L | H/M/L | [Control] |
| Repudiation | Yes/No | [Specific scenario] | H/M/L | H/M/L | [Control] |
| Info Disclosure | Yes/No | [Specific scenario] | H/M/L | H/M/L | [Control] |
| DoS | Yes/No | [Specific scenario] | H/M/L | H/M/L | [Control] |
| EoP | Yes/No | [Specific scenario] | H/M/L | H/M/L | [Control] |

4. IAM Boundary Design

Principles

  1. Each service has its own IAM role. No shared roles between services.
  2. Roles are scoped to minimum needed actions and resources. Use IAM Access Analyzer.
  3. Cross-service access uses role assumption, not shared credentials.
  4. Human access to production is time-bounded and audited. No persistent admin access.
  5. Separate accounts for separate blast radii. Production, staging, and security tooling in different accounts.

IAM Threat Patterns

PatternThreatMitigation
Shared IAM role across servicesCompromise of one service = compromise of allSeparate role per service, minimum permissions
Wildcard resource in policyAny resource accessible, not just intended onesExplicit ARNs; use conditions for dynamic resources
No MFA on privileged operationsCredential theft = full accessRequire MFA for all human privileged operations
Long-lived access keysKeys leaked in code/logs = persistent accessUse IAM roles with temporary credentials; rotate keys <90 days
Instance metadata accessibleSSRF → credential theft via 169.254.169.254IMDSv2 (require token); restrict network access to metadata
Over-scoped Lambda execution roleCompromised function has broad accessLeast privilege per function; separate roles per Lambda

5. Encryption Requirements

Encryption Decision Matrix

Data StateClassification: RestrictedClassification: ConfidentialClassification: Internal
At restKMS CMK (team-managed key), key rotation enabledKMS CMK or AWS-managed keyAWS-managed key or SSE-S3
In transitTLS 1.2+ (mandatory)TLS 1.2+ (mandatory)TLS 1.2+ (recommended)
In memoryClear from memory after use; don't logStandard precautionsStandard precautions
In backupsSame encryption as primarySame encryption as primaryAWS-managed encryption
In logsMUST NOT appear in logsMask/redact; tokenizeAcceptable in logs

Key Management

  • Key per service: Each service has its own KMS key. Compromise of one service's key doesn't expose another service's data.
  • Key per data classification: Restricted and Confidential data use different keys.
  • Key rotation: Automatic annual rotation enabled. Manual rotation immediately on suspected compromise.
  • Key access policy: Only the owning service's role can use the key for Encrypt/Decrypt. Admin access (for rotation, deletion) is a separate role.
  • Cross-account key access: Grant via key policy, not IAM policy. Explicit deny for any principal not explicitly allowed.

6. Blast Radius Analysis

Blast radius = the extent of damage if a single component is fully compromised.

Analysis Process

For each component, answer:

  1. If this component is fully compromised (attacker has complete control), what can they access?
  2. What other systems trust this component? (follow the trust relationships)
  3. What data can be exfiltrated? (follow the data flows)
  4. Can the attacker move laterally? (check network access, shared credentials, role chaining)
  5. What's the recovery time? (how long to detect, contain, and recover)

Blast Radius Containment Strategies

StrategyImplementationReduces Blast Radius By
Service isolationSeparate IAM roles per servicePrevents lateral movement via credentials
Network segmentationSecurity groups with explicit allow listsPrevents network-based lateral movement
Account boundariesSeparate AWS accounts for different trust levelsHard boundary; cross-account requires explicit grant
Data compartmentalizationDifferent encryption keys per data domainCompromised key exposes only one domain
Privilege separationRead and write through different roles/pathsCompromised read path can't modify data
Secret rotationAutomated, frequent rotation of all secretsLimits window of exposure for leaked secrets
Circuit breakersRate limits between servicesPrevents cascading resource exhaustion

Blast Radius Scoring

Rate each component:

ScoreBlast RadiusCriteria
CriticalSystem-wide compromiseComponent has admin access, cross-service credentials, or access to encryption keys for multiple services
HighMultiple services affectedComponent can access data or systems beyond its own boundary
MediumSingle service affectedCompromise is contained to this service's data and functionality
LowMinimal impactComponent is stateless, has no persistent data access, and is easily replaced

Any component scoring "Critical" must be re-architected to reduce blast radius.

7. Common Attack Patterns (Cloud-Specific)

AttackVectorMitigation
SSRF to metadataApplication fetches attacker-controlled URL → 169.254.169.254IMDSv2; block metadata IP in application egress
Confused deputyAttacker tricks your service into acting on their behalfExternal ID in cross-account roles; validate caller identity
S3 bucket enumerationPredictable bucket names → unauthorized accessRandom bucket name suffixes; block public access; bucket policies
Lambda event injectionMalicious input in event payloadValidate and sanitize all event fields; treat events as untrusted
IAM privilege escalationiam:PassRole + lambda:CreateFunction = arbitrary code execution as any roleRestrict iam:PassRole to specific role ARNs; permissions boundaries
Supply chain attackCompromised dependency in build pipelinePin dependencies; verify checksums; scan for vulnerabilities; use private registry
Log injectionAttacker injects malicious content into logs → exploits log viewersSanitize log output; structured logging; separate log viewers from production

Mechanisms Over Good Intentions

IntentionMechanism
"I'll encrypt sensitive data"KMS key policies that deny unencrypted writes; S3 bucket policies that require SSE
"I'll follow least privilege"IAM Access Analyzer reviews weekly; over-permissioned roles auto-generate tickets
"I'll audit access to sensitive data"CloudTrail data events mandatory for all Restricted/Confidential data stores
"I'll keep secrets safe"Secrets Manager with automated rotation; credential scanning in CI blocks commits with secrets
"I'll limit blast radius"Separate AWS accounts per trust boundary; network isolation verified by automated tests

Common Rationalizations

What They SayWhy It's WrongWhat To Do Instead
"We'll add security later, we need to ship fast"Security bolted on after the fact is expensive and incomplete. Architecture decisions made without threat modeling create vulnerabilities that require re-architecture to fix.Threat model during design. It takes 2-4 hours. Re-architecting for security later takes weeks.
"We're not a target; attackers focus on bigger companies"Automated attacks don't discriminate. Bots scan every public endpoint. Supply chain attacks target small components. You ARE a target the moment you have a public endpoint or store customer data.Model threats regardless of perceived risk. The model will tell you which threats are low-likelihood. Don't skip the analysis.
"Our data isn't that sensitive"Have you classified it? PII includes name + email. Payment data includes partial card numbers. Internal data includes access patterns that reveal business strategy.Classify your data formally. You may be surprised what's actually Confidential when you apply the classification framework.
"IAM is too complex; we'll use broad permissions and tighten later"Tightening permissions breaks things. Teams never tighten. Broad permissions persist forever and become the assumed blast radius.Start with zero permissions. Add one permission at a time. Use IAM Access Analyzer to verify you're not over-provisioned.
"Encryption at rest doesn't matter if the network is secure"Networks are breached. Insiders exist. Backups are stolen. Disks are improperly decommissioned. Encryption at rest is defense in depth, not redundancy.Encrypt at rest. Always. The cost is negligible. The protection is essential.

Red Flags

  • No threat model exists for a service handling customer data
  • Threat model was written once and never updated (system has changed significantly since)
  • STRIDE analysis is superficial ("Spoofing: N/A" for an authentication system)
  • IAM policies use Resource: "*" with no documented justification
  • Same encryption key used across multiple services
  • No data classification has been performed; team can't articulate what classification their data falls under
  • Blast radius analysis shows a single component compromise = system-wide breach
  • Secrets (API keys, passwords, tokens) found in code repositories, config files, or logs
  • No audit logging for access to Restricted or Confidential data
  • Trust boundaries aren't defined; all services communicate freely without authentication
  • No automated credential scanning in the CI pipeline
  • IMDSv1 is enabled (allows SSRF-based credential theft)

Verification

  • Data classification is documented for all data the system handles
  • Data Flow Diagram exists showing all components, data stores, and trust boundaries
  • STRIDE analysis completed for every component crossing a trust boundary
  • IAM roles follow least privilege (verified by IAM Access Analyzer)
  • Encryption requirements match data classification (see matrix above)
  • Blast radius analysis completed; no "Critical" components exist without documented mitigation plan
  • Secrets are stored in Secrets Manager/Parameter Store, never in code or config files
  • Automated credential scanning runs in CI pipeline
  • Audit logging enabled for all access to Restricted/Confidential data
  • IMDSv2 enforced on all EC2 instances
  • Network segmentation verified (security groups have explicit allow lists, not 0.0.0.0/0)
  • Threat model reviewed by AppSec for any system handling Restricted data
  • Threat model update schedule defined (at minimum: every major feature addition)

Tenets

  1. Security is designed in, not bolted on. Threat modeling happens at design time. If you're threat modeling after launch, you're patching, not designing.
  2. Blast radius above all. The most important security property is containment. A compromised component must not cascade. Design for breach, not just prevention.
  3. Data classification drives everything. Encryption, access control, logging, retention—all determined by data classification. Classify first, then secure.
  4. Assume breach. Design every component as if the adjacent component is already compromised. This drives proper authentication, authorization, and isolation between every boundary.
  5. Least privilege is the default. Zero permissions until explicitly granted. Every grant is documented, justified, scoped, and auditable.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.