
SCA conscient du runtime — prouve quelles CVE sont réellement accessibles, pas seulement installées.
SCA sensible au runtime — prouve quelles CVE sont réellement atteignables, pas seulement installées.
VulnReach est désormais un projet OWASP officiel. 🎉




Langages pris en charge : Python est entièrement prêt pour la production (taint, AST, route, runtime). Java et JavaScript disposent d'une analyse de graphe d'appels fonctionnelle et sont expérimentaux. Go, C# et PHP sont sur la feuille de route. Voir ROADMAP.md pour plus de détails.
VulnReach s'appuie sur la sortie SCA standard en ajoutant un contexte d'atteignabilité — prouvant via l'analyse statique, le suivi de taint et la couverture runtime réelle lesquelles des CVE détectées peuvent réellement être atteintes dans votre application.
POST /scan/{id}/cancel arrête les analyses en courssummary + compartiments classifiés sur GET /scan/{id}VULNREACH_ALLOW_DOCKER_DAEMON=truedocker-socket-proxy restreintPOST /findings/{id}/next-steps produit des recommandations de remédiation orientées analyste (actions immédiates, sondes de validation, chemins de mise à niveau, surveillance) pour un résultat déterministe. Paresseux / à la demande : les analyses n'appellent jamais le LLM, et une défaillance du LLM est dégradée avec grâce. Le verdict déterministe est en lecture seule. Voir .scan.runtime.ebpf (axé Linux, adhésion explicite)Voir :
Chaque CVE est classée via une chaîne de preuve à cinq niveaux :
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?
Le résultat est une liste de résultats priorisés avec quatre niveaux :
| Niveau | Signification |
|---|---|
DYNAMICALLY_REACHABLE | Exécution confirmée par la couverture runtime — corriger immédiatement |
Avis de sécurité — avant de commencer, copiez
.env.examplevers.env.localet remplacez chaque valeurCHANGE_MEpar un secret aléatoire fort.
N'exposez pas VulnReach sur un réseau public sans définir de véritables identifiants et configurerCORS_ORIGINS.
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
Options d'authentification :
POST /loginSettings -> API Keys, puis utilisez-le comme Authorization: Bearer <API_KEY># 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 fait échouer les builds sur les résultats critiques confirmésAuthorization: Bearer <API_KEY>)GET /scan/{id}/export/pdfprovider: none ; Ollama est pris en charge pour une utilisation hors ligneCible d'analyse : multi-tier-dvpa — une application Python/Django volontairement vulnérable avec 72 CVE brutes réparties sur 11 paquets.
46 % des résultats ont été sortis de la file indifférenciée « tout corriger » pour rejoindre une liste d'actions priorisée. Dans un service de production typique (où de nombreuses dépendances transitives ne sont jamais appelées), ce chiffre atteint 70 à 90 %.
Méthodologie complète, détail de la chaîne de preuve et ventilation par paquet : docs/benchmark.md
scan.ymltrivy dans le PATH (install)jq (utilisé dans les exemples de démarrage rapide — install)Optionnel (tout est ignoré proprement en cas d'absence) :
semgrep — pip install semgreptainter — pip install tainter (analyse de flux de taint ; voir guide de développement)Apache 2.0 — voir LICENSE.
STATICALLY_REACHABLE | Chemin de code prouvé via AST/taint — priorité élevée |
UNCERTAIN | Signal faible uniquement — examiner |
NOT_REACHABLE | Aucune preuve — supprimer de la file d'alertes |
| Couche | Résultat |
|---|
| CVE brutes (Trivy) | 72 |
| Résultats classifiés (VulnReach) | 90 |
| DYNAMICALLY_REACHABLE — à corriger maintenant | 49 |
| STATICALLY_REACHABLE — à corriger dans ce sprint | 23 |
| UNCERTAIN — à examiner | 18 |
| NOT_REACHABLE — à supprimer | 0 |
| Passerelle de pipeline CI | BLOQUÉE |