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




Поддержка языков: Python полностью готов к продакшену (taint, AST, маршруты, исполнение). Java и JavaScript имеют функциональный анализ графа вызовов и находятся в экспериментальной стадии. Go, C# и PHP — в дорожной карте. Подробнее см. ROADMAP.md.
VulnReach расширяет стандартный вывод SCA, добавляя контекст достижимости — с помощью статического анализа, отслеживания потоков данных (taint) и покрытия в runtime доказывает, какие из обнаруженных 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) → установлен ли пакет и уязвим ли он?
2. Анализ потоков (tainter) → поступают ли пользовательские данные в уязвимый сток?
3. Анализ AST → находится ли уязвимая функция в вашем графе вызовов?
4. Доступность маршрута → достижим ли путь вызова из HTTP-эндпоинта?
5. Покрытие в runtime → выполнялся ли уязвимый код фактически?
Результат — приоритетный список находок с четырьмя уровнями:
| Уровень | Значение |
|---|---|
DYNAMICALLY_REACHABLE | Покрытие runtime подтвердило выполнение — исправлять немедленно |
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. Создайте локальную конфигурацию
cp .env.example .env.local
# 2. Заполните все CHANGE_ME — сгенерируйте секреты: openssl rand -hex 32
$EDITOR .env.local
# 3. Запустите стек
docker compose up --build
# Опционально: включите динамические сканы runtime (доступ к Docker daemon через ограниченный socket proxy)
# docker compose -f docker-compose.yml -f docker-compose.runtime.yml up --build
Варианты аутентификации:
POST /loginSettings -> API Keys, затем используйте как Authorization: Bearer <API_KEY># Получить токен (замените учётными данными, которые вы задали в .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)
# Запустить сканирование из 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"}'
# Получить результаты
curl http://localhost:8000/scan/<scan_id> \
-H "Authorization: Bearer $TOKEN" | jq .summary
coverage.pypolicy.block_if останавливает сборки при подтверждённых критических находкахAuthorization: Bearer <API_KEY>)GET /scan/{id}/export/pdfprovider: none; поддерживается Ollama для офлайн-режимаЦель сканирования: multi-tier-dvpa — намеренно уязвимое приложение на Python/Django с 72 сырыми CVE в 11 пакетах.
| Слой | Результат |
|---|---|
| Сырые CVE (Trivy) | 72 |
| Классифицированные находки (VulnReach) | 90 |
| DYNAMICALLY_REACHABLE — исправить сейчас | 49 |
| STATICALLY_REACHABLE — исправить в этом спринте | 23 |
| UNCERTAIN — исследовать | 18 |
| NOT_REACHABLE — игнорировать | 0 |
| Шлюз CI конвейера | BLOCKED |
46% находок были перемещены из недифференцированной очереди «исправить всё» в приоритезированный список действий. В типичном продакшн-сервисе (где многие транзитивные зависимости никогда не вызываются) этот показатель достигает 70–90%.
Полная методология, детали цепочки доказательств и разбивка по пакетам: docs/benchmark.md
scan.ymlОпционально (все корректно пропускаются при отсутствии):
semgrep — pip install semgreptainter — pip install tainter (анализ потоков данных; см. руководство по разработке)Apache 2.0 — смотрите LICENSE.