
IaC-Bedrohungsmodellierer mit STRIDE, MITRE ATT&CK und PASTA-Frameworks. REST-API-, GraphQL- und Docker-Unterstützung für Terraform, CloudFormation und Kubernetes.
Statischer IaC-Bedrohungsmodellierer, der Terraform-, CloudFormation- und Kubernetes-Manifeste analysiert und strukturierte Bedrohungsmodellberichte unter Verwendung der Frameworks STRIDE, MITRE ATT&CK oder PASTA erstellt. Keine Netzwerkaufrufe, keine Cloud-Anmeldedaten, vollständig offline. Läuft als CLI, REST-API oder containerisierter Dienst.
CLI:
pip install threatmap
threatmap scan ./examples --output report.md --fail-on HIGH
Docker:
docker run -v $(pwd):/workspace bogdynn/threatmap:2.1.0 threatmap scan /workspace --output /workspace/report.md
REST-API-Server:
threatmap serve --host 0.0.0.0 --port 8000
# Oder via Docker:
docker run -p 8000:8000 bogdynn/threatmap:2.1.0
# API-Endpunkte: /health, /version, /rules, /analyze
GraphQL-API:
docker run -p 8000:8000 bogdynn/threatmap:2.1.0
# GraphQL-Endpunkt: http://localhost:8000/graphql
# Queries: health, version, rules
# Mutationen: analyze(content, filename, framework)
Installation von PyPI:
pip install threatmap
Oder für die lokale Entwicklung:
git clone https://github.com/bogdanticu88/threatmap.git
cd threatmap
pip install -e .
Ein Verzeichnis scannen und einen Markdown-Bericht auf der Standardausgabe ausgeben:
threatmap scan ./terraform/
Mehrere Pfade scannen und einen JSON-Bericht in eine Datei schreiben:
threatmap scan ./terraform/ ./k8s/ ./cloudformation/ --format json --output report.json
Einen interaktiven HTML-Bericht oder einen SARIF-Bericht für GitHub Security erstellen:
threatmap scan ./infra/ --format html --output report.html
threatmap scan ./infra/ --format sarif --output report.sarif
CI-Gate – Exit-Code 1, wenn eine KRITISCHE oder HOHE Bedrohung gefunden wird:
threatmap scan ./infra/ --fail-on HIGH --output threat-report.md
Nur eine terminale Zusammenfassungstabelle ausgeben, ohne einen vollständigen Bericht zu schreiben:
threatmap scan ./infra/ --summary
Nur ASCII-Schweregrad-Indikatoren (keine Emojis) in Umgebungen verwenden, die Unicode nicht unterstützen:
threatmap scan ./infra/ --ascii --output report.md
Analyse mit verschiedenen Bedrohungsmodellierungs-Frameworks:
# STRIDE (Standard)
threatmap scan ./infra/ --framework stride
# MITRE ATT&CK (wird auf Taktiken und Techniken abgebildet)
threatmap scan ./infra/ --framework mitre --format json
# PASTA (asset-zentrierte Bedrohungsmodellierung)
threatmap scan ./infra/ --framework pasta --format json
STRIDE (73 Regeln)
MITRE ATT&CK (11 Regeln, 14 Taktiken)
PASTA (12 Regeln, asset-zentriert)
Die Ausführung von threatmap scan ./examples --output report.md gegen die mitgelieferten Beispiele erzeugt einen vollständigen Markdown-Bericht. Nachfolgend ein repräsentativer Auszug.
### T-002 — Spoofing (KRITISCH)
Ressource: AWS::EC2::SecurityGroup.WebSecurityGroup
Eigenschaft: ingress.ssh_rdp_open
Befund: Sicherheitsgruppe 'WebSecurityGroup' macht SSH/RDP (Port 22/3389) für 0.0.0.0/0 verfügbar.
Abhilfe: Entfernen Sie den öffentlichen SSH/RDP-Zugriff. Verwenden Sie AWS Systems Manager Session Manager
oder einen Bastion-Host mit IP-Einschränkungen.
Der Bericht fügt ein Mermaid flowchart LR-Diagramm an. Knoten sind nach dem worst-case Schweregrad eingefärbt (🔴 rot = KRITISCH, 🟠 orange = HOCH). Fügen Sie den Block in einen beliebigen Mermaid-Renderer ein oder betrachten Sie ihn direkt auf GitHub.
flowchart LR
Internet((Internet))
subgraph Networking
aws_security_group_web_sg{web_sg}
NetworkPolicy_default_deny{default-deny}
azurerm_network_security_group_app_nsg{app_nsg}
end
subgraph Compute
aws_instance_web[web]
end
subgraph Kubernetes
Namespace_myapp[myapp]
Deployment_api[api]
Service_api_svc[api-svc]
Ingress_api_ingress[api-ingress]
end
subgraph Data
aws_s3_bucket_app_data[(app_data)]
aws_db_instance_app_db[(app_db)]
azurerm_storage_account_app_storage[(app_storage)]
end
subgraph Security
azurerm_key_vault_app_kv[app_kv]
end
subgraph Identity
azurerm_role_assignment_app_contributor[/app_contributor/]
end
AWS__S3__Bucket_AppBucket -->|ref| AWS__S3__Bucket_AuditBucket
AWS__CloudTrail__Trail_AppTrail -->|ref| AWS__S3__Bucket_AuditBucket
Internet -->|HTTPS| Ingress_api_ingress
style aws_security_group_web_sg fill:#ff4444,color:#fff
style aws_s3_bucket_app_data fill:#ff4444,color:#fff
style aws_instance_web fill:#ff8800,color:#fff
style Deployment_api fill:#ff8800,color:#fff
style azurerm_key_vault_app_kv fill:#ffcc00,color:#000
style azurerm_network_security_group_app_nsg fill:#ff8800,color:#fff
style azurerm_role_assignment_app_contributor fill:#ff4444,color:#fff
threatmap enthält jetzt eine Graph-Intelligenz, die Beziehungen zwischen Ressourcen verfolgt. Es identifiziert automatisch "verkettete" Bedrohungen, bei denen eine Kompromittierung einer Ressource (z. B. einer internetexponierten EC2) direkt zu einer anderen führt (z. B. einem privaten S3-Bucket), und kennzeichnet diese als Elevation of Privilege-Angriffspfade.
Sie können interne Sicherheitsanforderungen definieren, indem Sie eine threatmap_rules.yaml in Ihrem Projektstammverzeichnis erstellen.
rules:
- resource_type: "aws_s3_bucket"
property: "force_destroy"
expected: false
stride: "Tampering"
severity: "MEDIUM"
description: "Produktions-Buckets sollten force_destroy nicht aktiviert haben."
mitigation: "Setze force_destroy = false."
Die meisten Ergebnisse enthalten jetzt ein remediation-Feld (sichtbar in JSON-, HTML- und SARIF-Berichten), das den genauen Codeausschnitt zur Behebung des Sicherheitsproblems bereitstellt.
STRIDE-Analyzer – Anbieterspezifische Bedrohungsregeln:
threatmap/analyzers/
├── aws.py # 22 Regeln – S3, IAM, EC2, RDS, EKS, CloudTrail, KMS, Lambda
├── azure.py # 19 Regeln – Storage, Key Vault, NSG, RBAC, AKS, ACR, SQL
├── gcp.py # 15 Regeln – GCS, Firewall, Compute, Cloud SQL, GKE, IAM, KMS
└── kubernetes.py # 17 Regeln – Workloads, RBAC, Netzwerk, Secrets
MITRE ATT&CK-Analyzer – 11 Regeln, abgebildet auf MITRE-Taktiken:
PASTA-Analyzer – 12 Regeln mit asset-zentriertem Fokus:
APIs:
/health, /version, /rules, /analyze, /analyze/file/graphql mit Query (health, version, rules) und Mutation (analyze)Jede Regel ist eine Funktion, die ein Resource-Objekt (normalisiert aus dem geparsten Quellformat) erhält und ein Threat-Objekt zurückgibt, wenn die Bedingung erfüllt ist. Regeln sind reine Python-Bedingungen – kein DSL, keine Regex-Engine, keine externen Regelsatzdateien.
Der Schweregrad spiegelt sowohl die Ausnutzbarkeit als auch den Schadensradius wider:
| Schweregrad | Bedeutung |
|---|---|
| KRITISCH | Direkt ausnutzbar ohne zusätzliche Vorbedingungen (z. B. SSH offen für 0.0.0.0/0, Wildcard-IAM-Richtlinie, cluster-admin-Bindung an anonym) |
publicly_accessible = true, Principal: "*").metadata_options-Block auf einer EC2-Instanz bedeutet IMDSv1 ist aktiv, da dies AWS' Standard ist).(stride_category, resource_name, trigger_property) geschlüsselt, sodass dasselbe logische Problem nie zweimal gemeldet wird, selbst wenn es in mehreren Dateiformaten erscheint.# .github/workflows/threat-model.yml
name: Bedrohungsmodell
on: [pull_request]
jobs:
threatmap:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Python einrichten
uses: actions/setup-python@v5
with:
python-version: "3.11"
- name: threatmap installieren
run: pip install threatmap
- name: Bedrohungsmodell-Scan ausführen
run: |
threatmap scan ./infra/ \
--format markdown \
--output threat-report.md \
--fail-on HIGH
- name: Bedrohungsbericht hochladen
if: always()
uses: actions/upload-artifact@v4
with:
name: threat-report
path: threat-report.md
Das Flag --fail-on HIGH bewirkt, dass der Job mit Exit-Code 1 beendet wird, wenn eine HOHE oder KRITISCHE Bedrohung gefunden wird, und blockiert so den PR-Merge. Das hochgeladene Artefakt gibt Prüfern den vollständigen Bericht, ohne den Pull-Request verlassen zu müssen.
| Anbieter | Regeln |
|---|---|
| AWS (Terraform + CloudFormation) | 22 |
| Azure (Terraform) |
Abgedeckte Kategorien pro Anbieter:
(S=Spoofing, T=Tampering, R=Repudiation, I=Information Disclosure, D=Denial of Service, E=Elevation of Privilege)
Tests ausführen:
pytest tests/ -v
Mit Abdeckung ausführen:
pytest tests/ --cov=threatmap --cov-report=term-missing
threatmap/analyzers/<provider>.py nach dem bestehenden Muster hinzufügentests/fixtures/ hinzufügen, die die neue Regel auslösttests/test_analyzers.py hinzufügen| Format | Anbieter | Erweiterung |
|---|
| Terraform HCL | AWS, Azure, GCP | .tf |
| CloudFormation | AWS | .yaml, .yml, .json |
| Kubernetes-Manifeste | Kubernetes | .yaml, .yml |
| ID | Schweregrad | STRIDE-Kategorie | Ressource | Beschreibung |
|---|
| T-001 | 🔴 KRITISCH | Information Disclosure | AuditBucket | S3-Bucket 'AuditBucket' hat keinen öffentlichen Zugriffsblock konfiguriert – der Bucket könnte öffentlich zugänglich sein. |
| T-002 | 🔴 KRITISCH | Spoofing | WebSecurityGroup | Sicherheitsgruppe 'WebSecurityGroup' macht SSH/RDP (Port 22/3389) für 0.0.0.0/0 verfügbar. |
| T-003 | 🔴 KRITISCH | Elevation of Privilege | app_contributor | Rollenzuweisung 'app_contributor' gewährt die privilegierte Rolle 'Contributor'. |
| T-006 | 🟠 HOCH | Information Disclosure | AuditBucket | S3-Bucket 'AuditBucket' hat keine serverseitige Verschlüsselung konfiguriert. |
| T-008 | 🟠 HOCH | Elevation of Privilege | api | Container 'api' in Deployment 'api' könnte als Root ausgeführt werden (kein runAsNonRoot=true oder runAsUser=0). |
| T-011 | 🟠 HOCH | Elevation of Privilege | web | EC2-Instanz 'web' erlaubt IMDSv1 – Metadatendienst ohne Sitzungstoken zugänglich, was SSRF-basierten Credential-Diebstahl ermöglicht. |
| HOCH | Signifikantes Risiko, das einen zusätzlichen Schritt erfordert (z. B. unverschlüsselte RDS mit öffentlichem Zugriff, IMDSv1 auf einer EC2-Instanz) |
| MEDIUM | Fehlende Sicherheitsmaßnahmen in der Tiefe – geringeres unmittelbares Risiko, verletzt aber Sicherheitsbaselines (z. B. keine Versionierung, kein Logging, keine Ressourcenlimits) |
| NIEDRIG | Best-Practice-Lücken mit begrenzter eigenständiger Ausnutzbarkeit (z. B. Lambda nicht in VPC) |
| 19 |
| GCP (Terraform) | 15 |
| Kubernetes | 17 |
| Gesamt | 73 |
| Anbieter | S | T | R | I | D | E |
|---|
| AWS | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Azure | ✓ | ✓ | ✓ | ✓ | — | ✓ |
| GCP | ✓ | ✓ | ✓ | ✓ | — | ✓ |
| Kubernetes | ✓ | ✓ | — | ✓ | ✓ | ✓ |