
Laufzeitbewusste SCA — beweist, welche CVEs tatsächlich erreichbar sind, nicht nur installiert.
Laufzeitbewusstes SCA – beweist, welche CVEs tatsächlich erreichbar sind, nicht nur installiert.
VulnReach ist jetzt ein offizielles OWASP-Projekt. 🎉




Sprachunterstützung: Python ist vollständig produktionsreif (Taint, AST, Route, Laufzeit). Java und JavaScript verfügen über eine funktionierende Call-Graph-Analyse und sind experimentell. Go, C# und PHP stehen auf der Roadmap. Siehe ROADMAP.md für Details.
VulnReach baut auf der standardmäßigen SCA-Ausgabe auf und fügt Erreichbarkeitskontext hinzu – es weist durch statische Analyse, Taint-Tracking und Live-Laufzeitabdeckung nach, welche der erkannten CVEs in Ihrer Anwendung tatsächlich erreicht werden können.
POST /scan/{id}/cancel stoppt laufende Scanssummary + klassifizierte Kategorien unter GET /scan/{id}VULNREACH_ALLOW_DOCKER_DAEMON=truedocker-socket-proxyPOST /findings/{id}/next-steps erzeugt für Analysten bestimmte Sanierungsanleitungen (sofortige Maßnahmen, Validierungssonden, Upgrade-Pfade, Überwachung) für einen deterministischen Befund. Lazy / On-Demand: Scans rufen das LLM nie auf, und LLM-Fehler werden elegant abgefangen. Das deterministische Urteil ist schreibgeschützt. Siehe .scan.runtime.ebpf-Tracing-Modus (Linux-fokussiert, explizites Opt-in)Siehe:
Jede CVE wird über eine fünfschichtige Evidenzkette klassifiziert:
1. SCA (Trivy) → is the package installed and vulnerable?
2. Taint analysis (tainter) → does user input flow to the vulnerable sink?
3. AST analysis → is the vulnerable function in your call graph?
4. Route exposure → is the call path reachable from an HTTP endpoint?
5. Runtime coverage → was the vulnerable code actually executed?
Das Ergebnis ist eine priorisierte Befundliste mit vier Stufen:
| Stufe | Bedeutung |
|---|---|
DYNAMICALLY_REACHABLE | Ausführung durch Laufzeitabdeckung bestätigt – sofort beheben |
Sicherheitshinweis – Kopieren Sie vor dem Start
.env.examplein.env.localund ersetzen Sie jedenCHANGE_ME-Wert durch ein starkes zufälliges Geheimnis.
Setzen Sie VulnReach nicht ohne echte Anmeldedaten und ohne Konfiguration vonCORS_ORIGINSeinem öffentlichen Netzwerk aus.
git clone https://github.com/ihrishikesh0896/vulnreach.git
cd vulnreach
# 1. Create your local config
cp .env.example .env.local
# 2. Fill in every CHANGE_ME — generate secrets with: openssl rand -hex 32
$EDITOR .env.local
# 3. Start the stack
docker compose up --build
# Optional: enable dynamic runtime scans (Docker daemon access via restricted socket proxy)
# docker compose -f docker-compose.yml -f docker-compose.runtime.yml up --build
Authentifizierungsoptionen:
POST /loginSettings -> API Keys erstellen und dann als Authorization: Bearer <API_KEY> verwenden# Get a token (replace with the credentials you set in .env.local)
TOKEN=$(curl -s -X POST http://localhost:8000/login \
-H "Content-Type: application/json" \
-d '{"username":"<your-admin-user>","password":"<your-admin-password>"}' | jq -r .access_token)
# Start scan from a GitHub repo
curl -X POST http://localhost:8000/scan \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"repo_url":"https://github.com/yourorg/yourapp"}'
# Poll for results
curl http://localhost:8000/scan/<scan_id> \
-H "Authorization: Bearer $TOKEN" | jq .summary
coverage.pypolicy.block_if lässt Builds bei bestätigten kritischen Befunden fehlschlagenAuthorization: Bearer <API_KEY>)GET /scan/{id}/export/pdfprovider: none gesetzt; Ollama wird für den Offline-Betrieb unterstütztScan-Ziel: multi-tier-dvpa – eine absichtlich verwundbare Python/Django-Anwendung mit 72 rohen CVEs in 11 Paketen.
46 % der Befunde wurden aus der undifferenzierten „alles beheben“-Warteschlange in eine priorisierte Maßnahmenliste verschoben. In einem typischen Produktionsdienst (in dem viele transitive Abhängigkeiten nie aufgerufen werden) steigt dieser Wert auf 70–90 %.
Vollständige Methodik, Details zur Evidenzkette und Aufschlüsselung auf Paketebene: docs/benchmark.md
scan.yml-Konfigurationsreferenztrivy im PATH (installieren)jq (wird in den Schnellstart-Beispielen verwendet – installieren)Optional (alles wird elegant übersprungen, wenn nicht vorhanden):
semgrep – pip install semgreptainter – pip install tainter (Taint-Flow-Analyse; siehe Entwicklungsleitfaden)Apache 2.0 – siehe LICENSE.
STATICALLY_REACHABLE | Codepfad über AST/Taint nachgewiesen – hohe Priorität |
UNCERTAIN | Nur schwaches Signal – untersuchen |
NOT_REACHABLE | Keine Evidenz – aus der Alarmwarteschlange entfernen |
| Ebene | Ergebnis |
|---|
| Rohe CVEs (Trivy) | 72 |
| Klassifizierte Befunde (VulnReach) | 90 |
| DYNAMICALLY_REACHABLE – sofort beheben | 49 |
| STATICALLY_REACHABLE – in diesem Sprint beheben | 23 |
| UNCERTAIN – untersuchen | 18 |
| NOT_REACHABLE – unterdrücken | 0 |
| CI-Pipeline-Gate | GESPERRT |