42d09af58198c8fa24543cf0ce001783fd0f13a2
CVExplorer
CVExplorer — утилита для анализа запущенных Docker-контейнеров:
- извлекает зависимости приложения (из контейнера или по ссылке на исходники)
- сравнивает версии зависимостей с базой уязвимостей OSV.dev
- cоздаёт отчет
- отправляет отчёт по выбранным каналам (WIP)
На текущем этапе анализ выполняется по манифестам зависимостей.
Возможности
- Сканирует запущенные контейнеры.
- Два пути извлечения зависимостей:
- из контейнера (если манифесты присутствуют)
- из репозитория по
source_url(если контейнер содержит только собранный бинарник)
- Сравнивает найденные версии зависимостей с OSV.dev
- Фильтрует вывод по минимальной серьёзности (например, скрыть
LOW). - Есть файл конфигурации для гибкой настройки вывода
Поддерживаемые манифесты
Python:
requirements*.txtPipfilepyproject.tomlpoetry.lock
Node.js:
package.jsonpackage-lock.jsonyarn.lockpnpm-lock.yaml
Go:
go.modgo.sum
Rust:
Cargo.tomlCargo.lock
Java:
pom.xmlbuild.gradle,build.gradle.kts
.NET:
*.csproj,*.fsprojpackages.config
Требования
- Python 3.10+ (рекомендуется 3.11+)
- Docker Engine / Docker Desktop запущен
gitв системе (для анализа поsource_url)
Python-зависимости:
dockertqdm(опционально, для прогресс-бара)
Установка
1) Клонировать проект
git clone https://g.lair.moe/Chest/CVExplorer
cd CVExplorer
2) Создать виртуальное окружение
python -m venv .venv
source .venv/bin/activate
3) Поставить зависимости
pip install -U pip
pip install docker
pip install tqdm # опционально для прогресс-бара
Запуск
Основной способ:
python run.py
Альтернативно (если используешь пакетный запуск):
python -m cvexplorer.main
Утилита анализирует запущенные контейнеры. Убедись, что нужные сервисы запущены.
Как работает извлечение зависимостей?
Для каждого контейнера:
- CVExplorer ищет файлы манифестов внутри контейнера (например,
package.json,go.mod). - Если манифестов нет, CVExplorer пытается взять
source_urlиз OCI labels:org.opencontainers.image.sourceorg.opencontainers.image.url- (и т.п.)
- Если
source_urlнайден — репозиторий клонируется, выбирается commit (если естьorg.opencontainers.image.revision) и парсятся манифесты в репо. - Дальше зависимости дедуплицируются и отправляются в OSV.dev.
Конфигурация
CVExplorer читает конфиг из файла cvexplorer_config.json в рабочей директории.
Если файла нет или он некорректный — используются значения по умолчанию.
Пример cvexplorer_config.json
{
"output": {
"group_by_service": true,
"sections": {
"show_id_status": false,
"show_ports": false,
"show_language": false,
"show_revision": false,
"show_deps_list": false,
"show_code_files": false,
"show_errors": false
}
},
"vulns": {
"min_severity": "MEDIUM",
"include_unknown": true,
"max_affected_deps_to_show": 8,
"max_vuln_ids_to_show": 10
},
"osv": {
"enabled": true,
"chunk_size": 250,
"hydrate_details": true,
"max_pages": 5,
"timeout_sec": 30
}
}
Параметры output
group_by_service— группировать контейнеры по сервису (Compose/имя/образ).sections.*— включение/выключение блоков вывода:show_id_status— ID/статус/createdshow_ports— используемые портыshow_language— ЯПshow_revision— commit SHAshow_deps_list— печатать списки зависимостей (но их может быть ооооочень много)show_code_files— найденныеmain/app/indexфайлы с кодомshow_errors— ошибки извлечения
Параметры vulns
min_severity— минимальная серьёзность для отображения:LOW,MEDIUM,HIGH,CRITICAL.include_unknown— показывать ли уязвимости с неизвестной серьёзностью.max_affected_deps_to_show— сколько «самых проблемных» пакетов показывать.max_vuln_ids_to_show— сколько ID уязвимостей выводить в примере.
Параметры osv
enabled— включить/выключить сравнение с OSV.dev.chunk_size— размер batch-запроса (актуально при сотнях зависимостей).hydrate_details— догружать ли детали уязвимостей (нужно для фильтрации по severity best-effort).max_pages— ограничение пагинации.timeout_sec— таймаут запросов.
Прогресс-бар
Если поставить tqdm, появится прогресс-бар для:
- сканирования контейнеров
- batch-запросов OSV
Установка:
pip install tqdm
Troubleshooting
Нет прав на Docker
Если ошибки про доступ к Docker socket — запусти от пользователя с доступом к Docker или настрой группу docker.
В контейнере нет манифестов
Это нормально для «собранных» образов. Тогда нужен source_url в OCI labels.
Если source_url отсутствует — CVExplorer сможет показать только метаданные контейнера.
Ручное добавление ссылки на знакомые вам проекты через конфигурацию — WIP
Description
Languages
Python
100%