mirror of
https://github.com/wshobson/agents.git
synced 2026-03-18 17:47:16 +00:00
feat: add 5 new specialized agents with 20 skills
Add domain expert agents with comprehensive skill sets: - service-mesh-expert (cloud-infrastructure): Istio/Linkerd patterns, mTLS, observability - event-sourcing-architect (backend-development): CQRS, event stores, projections, sagas - vector-database-engineer (llm-application-dev): embeddings, similarity search, hybrid search - monorepo-architect (developer-essentials): Nx, Turborepo, Bazel, pnpm workspaces - threat-modeling-expert (security-scanning): STRIDE, attack trees, security requirements Update all documentation to reflect correct counts: - 67 plugins, 99 agents, 107 skills, 71 commands
This commit is contained in:
@@ -0,0 +1,656 @@
|
||||
---
|
||||
name: stride-analysis-patterns
|
||||
description: Apply STRIDE methodology to systematically identify threats. Use when analyzing system security, conducting threat modeling sessions, or creating security documentation.
|
||||
---
|
||||
|
||||
# STRIDE Analysis Patterns
|
||||
|
||||
Systematic threat identification using the STRIDE methodology.
|
||||
|
||||
## When to Use This Skill
|
||||
|
||||
- Starting new threat modeling sessions
|
||||
- Analyzing existing system architecture
|
||||
- Reviewing security design decisions
|
||||
- Creating threat documentation
|
||||
- Training teams on threat identification
|
||||
- Compliance and audit preparation
|
||||
|
||||
## Core Concepts
|
||||
|
||||
### 1. STRIDE Categories
|
||||
|
||||
```
|
||||
S - Spoofing → Authentication threats
|
||||
T - Tampering → Integrity threats
|
||||
R - Repudiation → Non-repudiation threats
|
||||
I - Information → Confidentiality threats
|
||||
Disclosure
|
||||
D - Denial of → Availability threats
|
||||
Service
|
||||
E - Elevation of → Authorization threats
|
||||
Privilege
|
||||
```
|
||||
|
||||
### 2. Threat Analysis Matrix
|
||||
|
||||
| Category | Question | Control Family |
|
||||
|----------|----------|----------------|
|
||||
| **Spoofing** | Can attacker pretend to be someone else? | Authentication |
|
||||
| **Tampering** | Can attacker modify data in transit/rest? | Integrity |
|
||||
| **Repudiation** | Can attacker deny actions? | Logging/Audit |
|
||||
| **Info Disclosure** | Can attacker access unauthorized data? | Encryption |
|
||||
| **DoS** | Can attacker disrupt availability? | Rate limiting |
|
||||
| **Elevation** | Can attacker gain higher privileges? | Authorization |
|
||||
|
||||
## Templates
|
||||
|
||||
### Template 1: STRIDE Threat Model Document
|
||||
|
||||
```markdown
|
||||
# Threat Model: [System Name]
|
||||
|
||||
## 1. System Overview
|
||||
|
||||
### 1.1 Description
|
||||
[Brief description of the system and its purpose]
|
||||
|
||||
### 1.2 Data Flow Diagram
|
||||
```
|
||||
[User] --> [Web App] --> [API Gateway] --> [Backend Services]
|
||||
|
|
||||
v
|
||||
[Database]
|
||||
```
|
||||
|
||||
### 1.3 Trust Boundaries
|
||||
- **External Boundary**: Internet to DMZ
|
||||
- **Internal Boundary**: DMZ to Internal Network
|
||||
- **Data Boundary**: Application to Database
|
||||
|
||||
## 2. Assets
|
||||
|
||||
| Asset | Sensitivity | Description |
|
||||
|-------|-------------|-------------|
|
||||
| User Credentials | High | Authentication tokens, passwords |
|
||||
| Personal Data | High | PII, financial information |
|
||||
| Session Data | Medium | Active user sessions |
|
||||
| Application Logs | Medium | System activity records |
|
||||
| Configuration | High | System settings, secrets |
|
||||
|
||||
## 3. STRIDE Analysis
|
||||
|
||||
### 3.1 Spoofing Threats
|
||||
|
||||
| ID | Threat | Target | Impact | Likelihood |
|
||||
|----|--------|--------|--------|------------|
|
||||
| S1 | Session hijacking | User sessions | High | Medium |
|
||||
| S2 | Token forgery | JWT tokens | High | Low |
|
||||
| S3 | Credential stuffing | Login endpoint | High | High |
|
||||
|
||||
**Mitigations:**
|
||||
- [ ] Implement MFA
|
||||
- [ ] Use secure session management
|
||||
- [ ] Implement account lockout policies
|
||||
|
||||
### 3.2 Tampering Threats
|
||||
|
||||
| ID | Threat | Target | Impact | Likelihood |
|
||||
|----|--------|--------|--------|------------|
|
||||
| T1 | SQL injection | Database queries | Critical | Medium |
|
||||
| T2 | Parameter manipulation | API requests | High | High |
|
||||
| T3 | File upload abuse | File storage | High | Medium |
|
||||
|
||||
**Mitigations:**
|
||||
- [ ] Input validation on all endpoints
|
||||
- [ ] Parameterized queries
|
||||
- [ ] File type validation
|
||||
|
||||
### 3.3 Repudiation Threats
|
||||
|
||||
| ID | Threat | Target | Impact | Likelihood |
|
||||
|----|--------|--------|--------|------------|
|
||||
| R1 | Transaction denial | Financial ops | High | Medium |
|
||||
| R2 | Access log tampering | Audit logs | Medium | Low |
|
||||
| R3 | Action attribution | User actions | Medium | Medium |
|
||||
|
||||
**Mitigations:**
|
||||
- [ ] Comprehensive audit logging
|
||||
- [ ] Log integrity protection
|
||||
- [ ] Digital signatures for critical actions
|
||||
|
||||
### 3.4 Information Disclosure Threats
|
||||
|
||||
| ID | Threat | Target | Impact | Likelihood |
|
||||
|----|--------|--------|--------|------------|
|
||||
| I1 | Data breach | User PII | Critical | Medium |
|
||||
| I2 | Error message leakage | System info | Low | High |
|
||||
| I3 | Insecure transmission | Network traffic | High | Medium |
|
||||
|
||||
**Mitigations:**
|
||||
- [ ] Encryption at rest and in transit
|
||||
- [ ] Sanitize error messages
|
||||
- [ ] Implement TLS 1.3
|
||||
|
||||
### 3.5 Denial of Service Threats
|
||||
|
||||
| ID | Threat | Target | Impact | Likelihood |
|
||||
|----|--------|--------|--------|------------|
|
||||
| D1 | Resource exhaustion | API servers | High | High |
|
||||
| D2 | Database overload | Database | Critical | Medium |
|
||||
| D3 | Bandwidth saturation | Network | High | Medium |
|
||||
|
||||
**Mitigations:**
|
||||
- [ ] Rate limiting
|
||||
- [ ] Auto-scaling
|
||||
- [ ] DDoS protection
|
||||
|
||||
### 3.6 Elevation of Privilege Threats
|
||||
|
||||
| ID | Threat | Target | Impact | Likelihood |
|
||||
|----|--------|--------|--------|------------|
|
||||
| E1 | IDOR vulnerabilities | User resources | High | High |
|
||||
| E2 | Role manipulation | Admin access | Critical | Low |
|
||||
| E3 | JWT claim tampering | Authorization | High | Medium |
|
||||
|
||||
**Mitigations:**
|
||||
- [ ] Proper authorization checks
|
||||
- [ ] Principle of least privilege
|
||||
- [ ] Server-side role validation
|
||||
|
||||
## 4. Risk Assessment
|
||||
|
||||
### 4.1 Risk Matrix
|
||||
|
||||
```
|
||||
IMPACT
|
||||
Low Med High Crit
|
||||
Low 1 2 3 4
|
||||
L Med 2 4 6 8
|
||||
I High 3 6 9 12
|
||||
K Crit 4 8 12 16
|
||||
```
|
||||
|
||||
### 4.2 Prioritized Risks
|
||||
|
||||
| Rank | Threat | Risk Score | Priority |
|
||||
|------|--------|------------|----------|
|
||||
| 1 | SQL Injection (T1) | 12 | Critical |
|
||||
| 2 | IDOR (E1) | 9 | High |
|
||||
| 3 | Credential Stuffing (S3) | 9 | High |
|
||||
| 4 | Data Breach (I1) | 8 | High |
|
||||
|
||||
## 5. Recommendations
|
||||
|
||||
### Immediate Actions
|
||||
1. Implement input validation framework
|
||||
2. Add rate limiting to authentication endpoints
|
||||
3. Enable comprehensive audit logging
|
||||
|
||||
### Short-term (30 days)
|
||||
1. Deploy WAF with OWASP ruleset
|
||||
2. Implement MFA for sensitive operations
|
||||
3. Encrypt all PII at rest
|
||||
|
||||
### Long-term (90 days)
|
||||
1. Security awareness training
|
||||
2. Penetration testing
|
||||
3. Bug bounty program
|
||||
```
|
||||
|
||||
### Template 2: STRIDE Analysis Code
|
||||
|
||||
```python
|
||||
from dataclasses import dataclass, field
|
||||
from enum import Enum
|
||||
from typing import List, Dict, Optional
|
||||
import json
|
||||
|
||||
class StrideCategory(Enum):
|
||||
SPOOFING = "S"
|
||||
TAMPERING = "T"
|
||||
REPUDIATION = "R"
|
||||
INFORMATION_DISCLOSURE = "I"
|
||||
DENIAL_OF_SERVICE = "D"
|
||||
ELEVATION_OF_PRIVILEGE = "E"
|
||||
|
||||
|
||||
class Impact(Enum):
|
||||
LOW = 1
|
||||
MEDIUM = 2
|
||||
HIGH = 3
|
||||
CRITICAL = 4
|
||||
|
||||
|
||||
class Likelihood(Enum):
|
||||
LOW = 1
|
||||
MEDIUM = 2
|
||||
HIGH = 3
|
||||
CRITICAL = 4
|
||||
|
||||
|
||||
@dataclass
|
||||
class Threat:
|
||||
id: str
|
||||
category: StrideCategory
|
||||
title: str
|
||||
description: str
|
||||
target: str
|
||||
impact: Impact
|
||||
likelihood: Likelihood
|
||||
mitigations: List[str] = field(default_factory=list)
|
||||
status: str = "open"
|
||||
|
||||
@property
|
||||
def risk_score(self) -> int:
|
||||
return self.impact.value * self.likelihood.value
|
||||
|
||||
@property
|
||||
def risk_level(self) -> str:
|
||||
score = self.risk_score
|
||||
if score >= 12:
|
||||
return "Critical"
|
||||
elif score >= 6:
|
||||
return "High"
|
||||
elif score >= 3:
|
||||
return "Medium"
|
||||
return "Low"
|
||||
|
||||
|
||||
@dataclass
|
||||
class Asset:
|
||||
name: str
|
||||
sensitivity: str
|
||||
description: str
|
||||
data_classification: str
|
||||
|
||||
|
||||
@dataclass
|
||||
class TrustBoundary:
|
||||
name: str
|
||||
description: str
|
||||
from_zone: str
|
||||
to_zone: str
|
||||
|
||||
|
||||
@dataclass
|
||||
class ThreatModel:
|
||||
name: str
|
||||
version: str
|
||||
description: str
|
||||
assets: List[Asset] = field(default_factory=list)
|
||||
boundaries: List[TrustBoundary] = field(default_factory=list)
|
||||
threats: List[Threat] = field(default_factory=list)
|
||||
|
||||
def add_threat(self, threat: Threat) -> None:
|
||||
self.threats.append(threat)
|
||||
|
||||
def get_threats_by_category(self, category: StrideCategory) -> List[Threat]:
|
||||
return [t for t in self.threats if t.category == category]
|
||||
|
||||
def get_critical_threats(self) -> List[Threat]:
|
||||
return [t for t in self.threats if t.risk_level in ("Critical", "High")]
|
||||
|
||||
def generate_report(self) -> Dict:
|
||||
"""Generate threat model report."""
|
||||
return {
|
||||
"summary": {
|
||||
"name": self.name,
|
||||
"version": self.version,
|
||||
"total_threats": len(self.threats),
|
||||
"critical_threats": len([t for t in self.threats if t.risk_level == "Critical"]),
|
||||
"high_threats": len([t for t in self.threats if t.risk_level == "High"]),
|
||||
},
|
||||
"by_category": {
|
||||
cat.name: len(self.get_threats_by_category(cat))
|
||||
for cat in StrideCategory
|
||||
},
|
||||
"top_risks": [
|
||||
{
|
||||
"id": t.id,
|
||||
"title": t.title,
|
||||
"risk_score": t.risk_score,
|
||||
"risk_level": t.risk_level
|
||||
}
|
||||
for t in sorted(self.threats, key=lambda x: x.risk_score, reverse=True)[:10]
|
||||
]
|
||||
}
|
||||
|
||||
|
||||
class StrideAnalyzer:
|
||||
"""Automated STRIDE analysis helper."""
|
||||
|
||||
STRIDE_QUESTIONS = {
|
||||
StrideCategory.SPOOFING: [
|
||||
"Can an attacker impersonate a legitimate user?",
|
||||
"Are authentication tokens properly validated?",
|
||||
"Can session identifiers be predicted or stolen?",
|
||||
"Is multi-factor authentication available?",
|
||||
],
|
||||
StrideCategory.TAMPERING: [
|
||||
"Can data be modified in transit?",
|
||||
"Can data be modified at rest?",
|
||||
"Are input validation controls sufficient?",
|
||||
"Can an attacker manipulate application logic?",
|
||||
],
|
||||
StrideCategory.REPUDIATION: [
|
||||
"Are all security-relevant actions logged?",
|
||||
"Can logs be tampered with?",
|
||||
"Is there sufficient attribution for actions?",
|
||||
"Are timestamps reliable and synchronized?",
|
||||
],
|
||||
StrideCategory.INFORMATION_DISCLOSURE: [
|
||||
"Is sensitive data encrypted at rest?",
|
||||
"Is sensitive data encrypted in transit?",
|
||||
"Can error messages reveal sensitive information?",
|
||||
"Are access controls properly enforced?",
|
||||
],
|
||||
StrideCategory.DENIAL_OF_SERVICE: [
|
||||
"Are rate limits implemented?",
|
||||
"Can resources be exhausted by malicious input?",
|
||||
"Is there protection against amplification attacks?",
|
||||
"Are there single points of failure?",
|
||||
],
|
||||
StrideCategory.ELEVATION_OF_PRIVILEGE: [
|
||||
"Are authorization checks performed consistently?",
|
||||
"Can users access other users' resources?",
|
||||
"Can privilege escalation occur through parameter manipulation?",
|
||||
"Is the principle of least privilege followed?",
|
||||
],
|
||||
}
|
||||
|
||||
def generate_questionnaire(self, component: str) -> List[Dict]:
|
||||
"""Generate STRIDE questionnaire for a component."""
|
||||
questionnaire = []
|
||||
for category, questions in self.STRIDE_QUESTIONS.items():
|
||||
for q in questions:
|
||||
questionnaire.append({
|
||||
"component": component,
|
||||
"category": category.name,
|
||||
"question": q,
|
||||
"answer": None,
|
||||
"notes": ""
|
||||
})
|
||||
return questionnaire
|
||||
|
||||
def suggest_mitigations(self, category: StrideCategory) -> List[str]:
|
||||
"""Suggest common mitigations for a STRIDE category."""
|
||||
mitigations = {
|
||||
StrideCategory.SPOOFING: [
|
||||
"Implement multi-factor authentication",
|
||||
"Use secure session management",
|
||||
"Implement account lockout policies",
|
||||
"Use cryptographically secure tokens",
|
||||
"Validate authentication at every request",
|
||||
],
|
||||
StrideCategory.TAMPERING: [
|
||||
"Implement input validation",
|
||||
"Use parameterized queries",
|
||||
"Apply integrity checks (HMAC, signatures)",
|
||||
"Implement Content Security Policy",
|
||||
"Use immutable infrastructure",
|
||||
],
|
||||
StrideCategory.REPUDIATION: [
|
||||
"Enable comprehensive audit logging",
|
||||
"Protect log integrity",
|
||||
"Implement digital signatures",
|
||||
"Use centralized, tamper-evident logging",
|
||||
"Maintain accurate timestamps",
|
||||
],
|
||||
StrideCategory.INFORMATION_DISCLOSURE: [
|
||||
"Encrypt data at rest and in transit",
|
||||
"Implement proper access controls",
|
||||
"Sanitize error messages",
|
||||
"Use secure defaults",
|
||||
"Implement data classification",
|
||||
],
|
||||
StrideCategory.DENIAL_OF_SERVICE: [
|
||||
"Implement rate limiting",
|
||||
"Use auto-scaling",
|
||||
"Deploy DDoS protection",
|
||||
"Implement circuit breakers",
|
||||
"Set resource quotas",
|
||||
],
|
||||
StrideCategory.ELEVATION_OF_PRIVILEGE: [
|
||||
"Implement proper authorization",
|
||||
"Follow principle of least privilege",
|
||||
"Validate permissions server-side",
|
||||
"Use role-based access control",
|
||||
"Implement security boundaries",
|
||||
],
|
||||
}
|
||||
return mitigations.get(category, [])
|
||||
```
|
||||
|
||||
### Template 3: Data Flow Diagram Analysis
|
||||
|
||||
```python
|
||||
from dataclasses import dataclass
|
||||
from typing import List, Set, Tuple
|
||||
from enum import Enum
|
||||
|
||||
class ElementType(Enum):
|
||||
EXTERNAL_ENTITY = "external"
|
||||
PROCESS = "process"
|
||||
DATA_STORE = "datastore"
|
||||
DATA_FLOW = "dataflow"
|
||||
|
||||
|
||||
@dataclass
|
||||
class DFDElement:
|
||||
id: str
|
||||
name: str
|
||||
type: ElementType
|
||||
trust_level: int # 0 = untrusted, higher = more trusted
|
||||
description: str = ""
|
||||
|
||||
|
||||
@dataclass
|
||||
class DataFlow:
|
||||
id: str
|
||||
name: str
|
||||
source: str
|
||||
destination: str
|
||||
data_type: str
|
||||
protocol: str
|
||||
encrypted: bool = False
|
||||
|
||||
|
||||
class DFDAnalyzer:
|
||||
"""Analyze Data Flow Diagrams for STRIDE threats."""
|
||||
|
||||
def __init__(self):
|
||||
self.elements: Dict[str, DFDElement] = {}
|
||||
self.flows: List[DataFlow] = []
|
||||
|
||||
def add_element(self, element: DFDElement) -> None:
|
||||
self.elements[element.id] = element
|
||||
|
||||
def add_flow(self, flow: DataFlow) -> None:
|
||||
self.flows.append(flow)
|
||||
|
||||
def find_trust_boundary_crossings(self) -> List[Tuple[DataFlow, int]]:
|
||||
"""Find data flows that cross trust boundaries."""
|
||||
crossings = []
|
||||
for flow in self.flows:
|
||||
source = self.elements.get(flow.source)
|
||||
dest = self.elements.get(flow.destination)
|
||||
if source and dest and source.trust_level != dest.trust_level:
|
||||
trust_diff = abs(source.trust_level - dest.trust_level)
|
||||
crossings.append((flow, trust_diff))
|
||||
return sorted(crossings, key=lambda x: x[1], reverse=True)
|
||||
|
||||
def identify_threats_per_element(self) -> Dict[str, List[StrideCategory]]:
|
||||
"""Map applicable STRIDE categories to element types."""
|
||||
threat_mapping = {
|
||||
ElementType.EXTERNAL_ENTITY: [
|
||||
StrideCategory.SPOOFING,
|
||||
StrideCategory.REPUDIATION,
|
||||
],
|
||||
ElementType.PROCESS: [
|
||||
StrideCategory.SPOOFING,
|
||||
StrideCategory.TAMPERING,
|
||||
StrideCategory.REPUDIATION,
|
||||
StrideCategory.INFORMATION_DISCLOSURE,
|
||||
StrideCategory.DENIAL_OF_SERVICE,
|
||||
StrideCategory.ELEVATION_OF_PRIVILEGE,
|
||||
],
|
||||
ElementType.DATA_STORE: [
|
||||
StrideCategory.TAMPERING,
|
||||
StrideCategory.REPUDIATION,
|
||||
StrideCategory.INFORMATION_DISCLOSURE,
|
||||
StrideCategory.DENIAL_OF_SERVICE,
|
||||
],
|
||||
ElementType.DATA_FLOW: [
|
||||
StrideCategory.TAMPERING,
|
||||
StrideCategory.INFORMATION_DISCLOSURE,
|
||||
StrideCategory.DENIAL_OF_SERVICE,
|
||||
],
|
||||
}
|
||||
|
||||
result = {}
|
||||
for elem_id, elem in self.elements.items():
|
||||
result[elem_id] = threat_mapping.get(elem.type, [])
|
||||
return result
|
||||
|
||||
def analyze_unencrypted_flows(self) -> List[DataFlow]:
|
||||
"""Find unencrypted data flows crossing trust boundaries."""
|
||||
risky_flows = []
|
||||
for flow in self.flows:
|
||||
if not flow.encrypted:
|
||||
source = self.elements.get(flow.source)
|
||||
dest = self.elements.get(flow.destination)
|
||||
if source and dest and source.trust_level != dest.trust_level:
|
||||
risky_flows.append(flow)
|
||||
return risky_flows
|
||||
|
||||
def generate_threat_enumeration(self) -> List[Dict]:
|
||||
"""Generate comprehensive threat enumeration."""
|
||||
threats = []
|
||||
element_threats = self.identify_threats_per_element()
|
||||
|
||||
for elem_id, categories in element_threats.items():
|
||||
elem = self.elements[elem_id]
|
||||
for category in categories:
|
||||
threats.append({
|
||||
"element_id": elem_id,
|
||||
"element_name": elem.name,
|
||||
"element_type": elem.type.value,
|
||||
"stride_category": category.name,
|
||||
"description": f"{category.name} threat against {elem.name}",
|
||||
"trust_level": elem.trust_level
|
||||
})
|
||||
|
||||
return threats
|
||||
```
|
||||
|
||||
### Template 4: STRIDE per Interaction
|
||||
|
||||
```python
|
||||
from typing import List, Dict, Optional
|
||||
from dataclasses import dataclass
|
||||
|
||||
@dataclass
|
||||
class Interaction:
|
||||
"""Represents an interaction between two components."""
|
||||
id: str
|
||||
source: str
|
||||
target: str
|
||||
action: str
|
||||
data: str
|
||||
protocol: str
|
||||
|
||||
|
||||
class StridePerInteraction:
|
||||
"""Apply STRIDE to each interaction in the system."""
|
||||
|
||||
INTERACTION_THREATS = {
|
||||
# Source type -> Target type -> Applicable threats
|
||||
("external", "process"): {
|
||||
"S": "External entity spoofing identity to process",
|
||||
"T": "Tampering with data sent to process",
|
||||
"R": "External entity denying sending data",
|
||||
"I": "Data exposure during transmission",
|
||||
"D": "Flooding process with requests",
|
||||
"E": "Exploiting process to gain privileges",
|
||||
},
|
||||
("process", "datastore"): {
|
||||
"T": "Process tampering with stored data",
|
||||
"R": "Process denying data modifications",
|
||||
"I": "Unauthorized data access by process",
|
||||
"D": "Process exhausting storage resources",
|
||||
},
|
||||
("process", "process"): {
|
||||
"S": "Process spoofing another process",
|
||||
"T": "Tampering with inter-process data",
|
||||
"I": "Data leakage between processes",
|
||||
"D": "One process overwhelming another",
|
||||
"E": "Process gaining elevated access",
|
||||
},
|
||||
}
|
||||
|
||||
def analyze_interaction(
|
||||
self,
|
||||
interaction: Interaction,
|
||||
source_type: str,
|
||||
target_type: str
|
||||
) -> List[Dict]:
|
||||
"""Analyze a single interaction for STRIDE threats."""
|
||||
threats = []
|
||||
key = (source_type, target_type)
|
||||
|
||||
applicable_threats = self.INTERACTION_THREATS.get(key, {})
|
||||
|
||||
for stride_code, description in applicable_threats.items():
|
||||
threats.append({
|
||||
"interaction_id": interaction.id,
|
||||
"source": interaction.source,
|
||||
"target": interaction.target,
|
||||
"stride_category": stride_code,
|
||||
"threat_description": description,
|
||||
"context": f"{interaction.action} - {interaction.data}",
|
||||
})
|
||||
|
||||
return threats
|
||||
|
||||
def generate_threat_matrix(
|
||||
self,
|
||||
interactions: List[Interaction],
|
||||
element_types: Dict[str, str]
|
||||
) -> List[Dict]:
|
||||
"""Generate complete threat matrix for all interactions."""
|
||||
all_threats = []
|
||||
|
||||
for interaction in interactions:
|
||||
source_type = element_types.get(interaction.source, "unknown")
|
||||
target_type = element_types.get(interaction.target, "unknown")
|
||||
|
||||
threats = self.analyze_interaction(
|
||||
interaction, source_type, target_type
|
||||
)
|
||||
all_threats.extend(threats)
|
||||
|
||||
return all_threats
|
||||
```
|
||||
|
||||
## Best Practices
|
||||
|
||||
### Do's
|
||||
- **Involve stakeholders** - Security, dev, and ops perspectives
|
||||
- **Be systematic** - Cover all STRIDE categories
|
||||
- **Prioritize realistically** - Focus on high-impact threats
|
||||
- **Update regularly** - Threat models are living documents
|
||||
- **Use visual aids** - DFDs help communication
|
||||
|
||||
### Don'ts
|
||||
- **Don't skip categories** - Each reveals different threats
|
||||
- **Don't assume security** - Question every component
|
||||
- **Don't work in isolation** - Collaborative modeling is better
|
||||
- **Don't ignore low-probability** - High-impact threats matter
|
||||
- **Don't stop at identification** - Follow through with mitigations
|
||||
|
||||
## Resources
|
||||
|
||||
- [Microsoft STRIDE Documentation](https://docs.microsoft.com/en-us/azure/security/develop/threat-modeling-tool-threats)
|
||||
- [OWASP Threat Modeling](https://owasp.org/www-community/Threat_Modeling)
|
||||
- [Threat Modeling: Designing for Security](https://www.wiley.com/en-us/Threat+Modeling%3A+Designing+for+Security-p-9781118809990)
|
||||
Reference in New Issue
Block a user