
Runtime-aware SCA — доказывает, какие CVE реально достижимы, а не просто установлены.
SCA с учётом среды выполнения — доказывает, какие CVE действительно достижимы, а не просто установлены.
VulnReach теперь официальный OWASP Project. 🎉




Поддержка языков: Python полностью готов к продакшену (taint, AST, route, runtime). Java и JavaScript имеют функциональный анализ графа вызовов и являются экспериментальными. Go, C# и PHP — в планах. Подробности см. в ROADMAP.md.
VulnReach строится на стандартном выводе SCA, добавляя контекст достижимости — доказывая с помощью статического анализа, отслеживания taint-потоков и покрытия во время выполнения, какие из обнаруженных CVE действительно могут быть достигнуты в вашем приложении.
POST /scan/{id}/cancel останавливает выполняющиеся сканированияsummary + классифицированные группы в GET /scan/{id}VULNREACH_ALLOW_DOCKER_DAEMON=truedocker-socket-proxyPOST /findings/{id}/next-steps формирует ориентированные на аналитика рекомендации по устранению (немедленные действия, проверочные пробы, пути обновления, мониторинг) для детерминированной находки. Ленивый / по требованию: сканирования никогда не вызывают LLM, а сбои LLM деградируют корректно. Детерминированный вердикт доступен только для чтения. См. docs/api.md.scan.runtime.ebpf (ориентирован на Linux, явное согласие)См.:
Каждая CVE классифицируется через пятиуровневую цепочку доказательств:
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?
Результат — приоритизированный список находок с четырьмя уровнями:
| Уровень | Значение |
|---|---|
DYNAMICALLY_REACHABLE | Покрытие во время выполнения подтвердило исполнение — исправлять немедленно |
STATICALLY_REACHABLE | Путь в коде доказан через AST/taint — высокий приоритет |
UNCERTAIN | Только слабый сигнал — исследовать |
NOT_REACHABLE | Нет доказательств — исключить из очереди оповещений |
Уведомление о безопасности — перед запуском скопируйте
.env.exampleв.env.localи замените каждое значениеCHANGE_MEна надёжный случайный секрет.
Не выставляйте VulnReach в публичную сеть без установки реальных учётных данных и настройкиCORS_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
Варианты аутентификации:
POST /loginSettings -> API Keys, затем используйте как 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 проваливает сборки при подтверждённых критических находках; запуск и шлюз через curl — см. docs/ci-cd-gating.mdAuthorization: Bearer <API_KEY>)GET /scan/{id}/export/pdfprovider: none; поддерживается Ollama для офлайн-использования