Zenith Engine
Multi-Hop-Angriffspfad-Simulation über einen gerichteten, gewichteten Infrastrukturgraphen — mittels Negativ-Log-Dijkstra auf dem Maximum-Wahrscheinlichkeits-Kompromittierungspfad.
// Architektur-Überblick
Zenith überführt passive Scan-Daten in ein adversariales Graphmodell. Jedes Target wird zu einem Knoten; jedes gemeinsam genutzte Infrastrukturelement — IP, ASN, TLS-Zertifikat, CDN-Anbieter, DNS-Nameserver — wird zu einer gerichteten Kante mit einem assoziierten Kompromittierungsgewicht. Die Engine löst dann den optimalen Angriffspfad und berechnet die infrastrukturweiten Blast Radii.
Graphkonstruktion
Knoten entstehen aus Target-Datensätzen. Kanten werden abgeleitet aus:
- Gemeinsamen /24- oder /16-IP-Subnetzen
- Identischer ASN (BGP-Peer)
- Gemeinsamem TLS-Zertifikat-Serial oder Aussteller
- Gemeinsamem CDN-Edge-Node (Cloudflare, Fastly, Akamai Fingerprint)
- Identischem DNS-Nameserver-Cluster
- Gemeinsamer MX- oder SPF-Infrastruktur
Kantengewichtung
Jede Kante trägt ein Kompromittierungsgewicht w ∈ (0,1], berechnet aus:
- EPSS-Score des höchsten CVE am Quellknoten
- CVSS-Basiswert normalisiert auf [0,1]
- Service-Exposition — öffentliche Port-Anzahl × 0,05
- Zertifikats-Gültigkeit — abgelaufenes Zert = +0,3 Penalty
- Security-Header-Abdeckung — fehlendes CSP = +0,15
- WAF/CDN-Schutz — erkannter Schutz = −0,2
Ausgabe-Artefakte
- Kritischer Pfad: geordnete Knotenliste mit kumulativem P(Kompromittierung)
- Blast-Radius-Karte: pro Knoten Reichweite und Impact-Score
- Chokepoint-Liste: Knoten, deren Entfernung den Pfad maximal verlängert
- Resilience-Delta: simulierte Verbesserung je Remediation-Maßnahme
- Executive Risk Score: einziger 0–100-Wert mit Trendhistorie
// Pfadfindung — Negativ-Log-Dijkstra
Den Pfad mit der maximalen zusammengesetzten Kompromittierungswahrscheinlichkeit zu finden ist äquivalent zum Finden des kürzesten Pfads im Negativ-Log-Gewichtsraum. Dies bildet das Problem auf Standard-Dijkstra ab — ohne Korrektheitsverlust und mit O(V log V + E) Laufzeit via Min-Heap.
| Parameter | Wert | Begründung |
|---|---|---|
| Graph-Bibliothek | NetworkX 3.x + Custom-C-Extension | DiGraph unterstützt gerichtete Pfade und Zentralitäts-Algorithmen |
| Heap-Implementierung | Python heapq (binärer Min-Heap) | O(log V) Push/Pop, ausreichend für ≤10k Knoten |
| Max. Graphgröße | 50.000 Knoten / 500.000 Kanten | Speicher-Cap: ~2 GB; größere Graphen werden gesampelt |
| Gewichts-Untergrenze | w_raw ≥ 0,001 | Verhindert −log(0) = ∞; selbst gehärtete Hosts haben Restrisiko |
| Neuberechnungs-Trigger | Bei jedem ScanResult-Änderungsevent | Graph wird invalidiert und beim nächsten Zenith-Aufruf neu gebaut |
// Monte-Carlo-Adversar-Simulation
Deterministische Pfadfindung liefert den optimalen Pfad unter Durchschnittsbedingungen. Monte-Carlo-Simulation fügt stochastischen Realismus hinzu: Angreifer-Skill-Varianz, Defender-Response-Latenz und Umgebungsrauschen werden über 90.000 unabhängige Läufe gesampelt.
| Dimension | Detail |
|---|---|
| Gesamt-Läufe | 90.000 (3 Personas × 3 Win-Conditions × 10.000 Iterationen) |
| Persona: Opportunist | Nutzt nur EPSS ≥ 0,7 CVEs; keine laterale Bewegung; bricht nach 2 fehlgeschlagenen Hops ab |
| Persona: Advanced Persistent Threat | Vollständige laterale Bewegung; Zero-Day-Budget = 1 pro Simulation; Persistenz-Mechanismen modelliert |
| Persona: Insider | Startet von zufälligem internen Knoten; alle Kanten bidirektional; Credential-Reuse-Wahrscheinlichkeit 0,4 |
| Win-Condition: Datenexfiltration | Erreichung eines Knotens mit offenem S3/Blob-Storage oder exponiertem DB-Port |
| Win-Condition: Ransomware | Erreichung von ≥ 30 % aller Knoten mit erreichbarem RDP/SMB |
| Win-Condition: Persistenz | Erreichung eines Knotens mit CI/CD- oder Registry-Zugriff (Supply-Chain-Pivot) |
| Ausgabe | P(Win) pro Persona/Condition, Median-TTB (Time-to-Breach), 95. Perzentil der Pfadlänge |
// Live-EPSS- und KEV-Integration
Statische CVSS-Scores sind ein schlechter Prädiktor für Exploitation-Aktivität. Zenith integriert Live-EPSS-Daten (Exploit Prediction Scoring System) von FIRST.org und CISA KEV (Known Exploited Vulnerabilities), um Kanten mit realer Exploitation-Wahrscheinlichkeit zu gewichten.
EPSS-Datenpipeline
- Täglicher Pull von
epss.cyentia.com/epss_scores-YYYY-MM-DD.csv.gz - Laden in lokalen SQLite-Cache mit TTL = 24 Std.
- Komprimiertes CSV: ~10 MB / ~220k CVE-Einträge pro Tag
- EPSS-Score = Wahrscheinlichkeit der Exploitation innerhalb 30 Tagen
CISA-KEV-Overlay
- Jeder CVE im CISA-KEV-Katalog erhält EPSS-Untergrenze von 0,90
- KEV-CVEs umgehen auch den EPSS-≥0,7-Schwellenwert beim Opportunisten
- KEV-JSON wird alle 6 Std. gepullt und gecacht
- Kantengewicht wird bei neuem KEV-Eintrag sofort neu berechnet
Kombinierte Gewichtsformel
epss × 0,50
+ cvss_norm × 0,25
+ exposure_score × 0,15
+ age_penalty × 0,10)
// API-Endpunkte & Ausgabeformat
| Endpunkt | Methode | Beschreibung |
|---|---|---|
/analytics/zenith/run | POST | Vollständige Zenith-Analyse für aktuellen Tenant auslösen |
/analytics/zenith/result | GET | Letztes gecachtes Ergebnis abrufen (oder 202 wenn noch nicht bereit) |
/analytics/zenith/graph | GET | D3-kompatibles Node/Edge-JSON für Visualisierung |
/analytics/zenith/chokepoints | GET | Geordnete Liste von SPOFs mit Remediation-Empfehlungen |
/analytics/zenith/monte-carlo | GET | Monte-Carlo-Simulationsergebnisse pro Persona/Win-Condition |
| Tenant-Größe | Graph-Build | Dijkstra | Monte Carlo (90k) | Gesamt |
|---|---|---|---|---|
| Klein (≤50 Targets) | ~80 ms | ~5 ms | ~0,9 s | ~1,1 s |
| Mittel (≤500 Targets) | ~400 ms | ~35 ms | ~4,2 s | ~4,8 s |
| Groß (≤5.000 Targets) | ~2,8 s | ~280 ms | ~18 s | ~22 s |
| XL (≤50.000 Targets) | ~18 s | ~2,1 s | ~90 s* | ~112 s* |