
SCA consciente del runtime — demuestra qué CVEs son realmente alcanzables, no solo instalados.
SCA consciente del runtime: demuestra qué CVEs son realmente alcanzables, no solo instaladas.
VulnReach es ahora un Proyecto OWASP oficial. 🎉




Soporte de lenguajes: Python está totalmente listo para producción (taint, AST, rutas, runtime). Java y JavaScript tienen análisis de grafo de llamadas funcional y son experimentales. Go, C# y PHP están en la hoja de ruta. Consulta ROADMAP.md para más detalles.
VulnReach se basa en la salida estándar del SCA añadiendo contexto de alcanzabilidad: demuestra mediante análisis estático, seguimiento de taint y cobertura de runtime en vivo cuáles de los CVEs detectados pueden alcanzarse realmente en tu aplicación.
POST /scan/{id}/cancel detiene escaneos en cursosummary + buckets clasificados en GET /scan/{id}VULNREACH_ALLOW_DOCKER_DAEMON=truedocker-socket-proxy restringidoPOST /findings/{id}/next-steps produce orientación de remediación orientada a analistas (acciones inmediatas, sondas de validación, rutas de actualización, monitorización) para un hallazgo determinista. Perezoso / bajo demanda: los escaneos nunca llaman al LLM y los fallos del LLM degradan de forma controlada. El veredicto determinista es de solo lectura. Consulta .scan.runtime.ebpf (centrado en Linux, aceptación explícita)Consulta:
Cada CVE se clasifica mediante una cadena de evidencia de cinco capas:
1. SCA (Trivy) → ¿el paquete está instalado y es vulnerable?
2. Análisis de taint (tainter) → ¿el input del usuario fluye hacia el sink vulnerable?
3. Análisis AST → ¿la función vulnerable está en tu grafo de llamadas?
4. Exposición de rutas → ¿la ruta de llamada es alcanzable desde un endpoint HTTP?
5. Cobertura de runtime → ¿el código vulnerable se ejecutó realmente?
El resultado es una lista de hallazgos priorizada con cuatro niveles:
| Nivel | Significado |
|---|---|
DYNAMICALLY_REACHABLE | La cobertura de runtime confirmó la ejecución: corregir de inmediato |
Aviso de seguridad: antes de empezar, copia
.env.examplea.env.localy reemplaza cada valorCHANGE_MEcon un secreto aleatorio seguro.
No expongas VulnReach en una red pública sin establecer credenciales reales y configurarCORS_ORIGINS.
git clone https://github.com/ihrishikesh0896/vulnreach.git
cd vulnreach
# 1. Crea tu configuración local
cp .env.example .env.local
# 2. Rellena cada CHANGE_ME: genera secretos con: openssl rand -hex 32
$EDITOR .env.local
# 3. Inicia la pila
docker compose up --build
# Opcional: habilita escaneos de runtime dinámicos (acceso al daemon de Docker mediante proxy de socket restringido)
# docker compose -f docker-compose.yml -f docker-compose.runtime.yml up --build
Opciones de autenticación:
POST /loginSettings -> API Keys y úsalo como Authorization: Bearer <API_KEY># Obtén un token (reemplaza con las credenciales que configuraste en .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)
# Inicia el escaneo desde un repositorio de GitHub
curl -X POST http://localhost:8000/scan \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"repo_url":"https://github.com/yourorg/yourapp"}'
# Consulta los resultados
curl http://localhost:8000/scan/<scan_id> \
-H "Authorization: Bearer $TOKEN" | jq .summary
coverage.pypolicy.block_if hace fallar las builds ante hallazgos críticos confirmadosAuthorization: Bearer <API_KEY>)GET /scan/{id}/export/pdfprovider: none por defecto; Ollama es compatible para uso sin conexiónObjetivo del escaneo: multi-tier-dvpa, una aplicación Python/Django intencionalmente vulnerable con 72 CVEs brutos en 11 paquetes.
El 46 % de los hallazgos se sacó de la cola indiferenciada de "corregir todo" y se trasladó a una lista de acciones priorizada. En un servicio de producción típico (donde muchas dependencias transitivas nunca se invocan), esta cifra asciende al 70–90 %.
Metodología completa, detalle de la cadena de evidencia y desglose por paquete: docs/benchmark.md
scan.ymltrivy en PATH (instalación)jq (usado en los ejemplos de inicio rápido: instalación)Opcionales (todos se omiten con elegancia si no están presentes):
semgrep: pip install semgreptainter: pip install tainter (análisis de flujo taint; consulta la guía de desarrollo)Apache 2.0: consulta LICENSE.
STATICALLY_REACHABLE | Ruta de código probada mediante AST/taint: prioridad alta |
UNCERTAIN | Solo señal débil: investigar |
NOT_REACHABLE | Sin evidencia: suprimir de la cola de alertas |
| Capa | Resultado |
|---|
| CVEs brutos (Trivy) | 72 |
| Hallazgos clasificados (VulnReach) | 90 |
| DYNAMICALLY_REACHABLE: corregir ahora | 49 |
| STATICALLY_REACHABLE: corregir en este sprint | 23 |
| UNCERTAIN: investigar | 18 |
| NOT_REACHABLE: suprimir | 0 |
| Compuerta del pipeline CI | BLOQUEADO |