mirror of
https://github.com/wshobson/agents.git
synced 2026-03-18 09:37:15 +00:00
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
657 lines
20 KiB
Markdown
657 lines
20 KiB
Markdown
---
|
|
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)
|