
Runtime-aware SCA — proves which CVEs are actually reachable, not just installed.
SCA consciente de tempo de execução — prova quais CVEs são realmente alcançáveis, não apenas instaladas.
VulnReach agora é um Projeto OWASP oficial. 🎉




Suporte a linguagens: Python está totalmente pronto para produção (taint, AST, rota, runtime). Java e JavaScript possuem análise funcional de grafo de chamadas e são experimentais. Go, C# e PHP estão no roadmap. Veja ROADMAP.md para detalhes.
VulnReach se baseia na saída padrão do SCA adicionando contexto de alcançabilidade — provando através de análise estática, rastreamento de taint e cobertura de runtime ao vivo quais das CVEs detectadas podem realmente ser alcançadas em sua aplicação.
POST /scan/{id}/cancel interrompe varreduras em andamentosummary + buckets classificados em GET /scan/{id}VULNREACH_ALLOW_DOCKER_DAEMON=truedocker-socket-proxy restritoPOST /findings/{id}/next-steps produz orientação de remediação voltada para analistas (ações imediatas, sondas de validação, caminhos de atualização, monitoramento) para uma descoberta determinística. Preguiçoso / sob demanda: as varreduras nunca chamam o LLM, e falhas do LLM degradam graciosamente. O veredito determinístico é somente leitura. Veja .scan.runtime.ebpf (focado em Linux, aceitação explícita)Veja:
Cada CVE é classificada através de uma cadeia de evidências de cinco camadas:
1. SCA (Trivy) → o pacote está instalado e vulnerável?
2. Análise de taint (tainter) → a entrada do usuário flui para o sink vulnerável?
3. Análise AST → a função vulnerável está no seu grafo de chamadas?
4. Exposição de rota → o caminho de chamada é alcançável a partir de um endpoint HTTP?
5. Cobertura de runtime → o código vulnerável foi realmente executado?
O resultado é uma lista de descobertas priorizadas com quatro níveis:
| Nível | Significado |
|---|---|
DYNAMICALLY_REACHABLE | Cobertura de runtime confirmou execução — corrija imediatamente |
Aviso de segurança — antes de iniciar, copie
.env.examplepara.env.locale substitua cada valorCHANGE_MEpor um segredo aleatório forte.
Não exponha o VulnReach em uma rede pública sem definir credenciais reais e configurarCORS_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
Opções de autenticação:
POST /loginConfigurações -> Chaves da API, depois use como 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 falha builds em descobertas críticas confirmadasAuthorization: Bearer <API_KEY>)GET /scan/{id}/export/pdfprovider: none; Ollama suportado para uso offlineAlvo da varredura: multi-tier-dvpa — uma aplicação Python/Django intencionalmente vulnerável com 72 CVEs brutas em 11 pacotes.
46% das descobertas foram removidas da fila indiferenciada de 'corrigir tudo' para uma lista de ações priorizadas. Em um serviço de produção típico (onde muitas dependências transitórias nunca são chamadas), este número sobe para 70–90%.
Metodologia completa, detalhes da cadeia de evidências e detalhamento por pacote: docs/benchmark.md
scan.ymltrivy no PATH (instalar)jq (usado em exemplos de início rápido — instalar)Opcional (todos ignoram graciosamente se ausentes):
semgrep — pip install semgreptainter — pip install tainter (análise de fluxo de taint; veja o guia de desenvolvimento)Apache 2.0 — veja LICENSE.
STATICALLY_REACHABLE | Caminho de código comprovado via AST/taint — alta prioridade |
UNCERTAIN | Apenas sinal fraco — investigue |
NOT_REACHABLE | Nenhuma evidência — suprima da fila de alertas |
| Camada | Resultado |
|---|
| CVEs brutas (Trivy) | 72 |
| Descobertas classificadas (VulnReach) | 90 |
| DINAMICAMENTE ALCANÇÁVEIS — corrija agora | 49 |
| ESTATICAMENTE ALCANÇÁVEIS — corrija nesta sprint | 23 |
| INCERTO — investigue | 18 |
| NÃO ALCANÇÁVEL — suprima | 0 |
| Portão do pipeline CI | BLOQUEADO |