Files
CVExplorer/README.md
T
2026-01-18 15:19:02 +03:00

220 lines
7.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# CVExplorer
CVExplorer — утилита для анализа **запущенных Docker-контейнеров**:
- извлекает зависимости приложения (из контейнера **или** по ссылке на исходники)
- сравнивает версии зависимостей с базой уязвимостей **OSV.dev**
- cоздаёт отчет
- отправляет отчёт по выбранным каналам (WIP)
> На текущем этапе анализ выполняется по **манифестам зависимостей**.
---
## Возможности
- Сканирует **запущенные** контейнеры.
- Два пути извлечения зависимостей:
1. из контейнера (если манифесты присутствуют)
2. из репозитория по `source_url` (если контейнер содержит только собранный бинарник)
- Сравнивает найденные версии зависимостей с OSV.dev
- Фильтрует вывод по минимальной серьёзности (например, скрыть `LOW`).
- Есть файл конфигурации для гибкой настройки вывода
---
## Поддерживаемые манифесты
**Python:**
- `requirements*.txt`
- `Pipfile`
- `pyproject.toml`
- `poetry.lock`
**Node.js:**
- `package.json`
- `package-lock.json`
- `yarn.lock`
- `pnpm-lock.yaml`
**Go:**
- `go.mod`
- `go.sum`
**Rust:**
- `Cargo.toml`
- `Cargo.lock`
**Java:**
- `pom.xml`
- `build.gradle`, `build.gradle.kts`
**.NET:**
- `*.csproj`, `*.fsproj`
- `packages.config`
---
## Требования
- Python 3.10+ (рекомендуется 3.11+)
- Docker Engine / Docker Desktop запущен
- `git` в системе (для анализа по `source_url`)
Python-зависимости:
- `docker`
- `tqdm` (опционально, для прогресс-бара)
---
## Установка
### 1) Клонировать проект
```bash
git clone https://g.lair.moe/Chest/CVExplorer
cd CVExplorer
```
### 2) Создать виртуальное окружение
```bash
python -m venv .venv
source .venv/bin/activate
```
### 3) Поставить зависимости
```bash
pip install -U pip
pip install docker
pip install tqdm # опционально для прогресс-бара
```
---
## Запуск
Основной способ:
```bash
python run.py
```
Альтернативно (если используешь пакетный запуск):
```bash
python -m cvexplorer.main
```
> Утилита анализирует **запущенные** контейнеры. Убедись, что нужные сервисы запущены.
---
## Как работает извлечение зависимостей?
Для каждого контейнера:
1. CVExplorer ищет файлы манифестов внутри контейнера (например, `package.json`, `go.mod`).
2. Если манифестов нет, CVExplorer пытается взять `source_url` из OCI labels:
- `org.opencontainers.image.source`
- `org.opencontainers.image.url`
- (и т.п.)
3. Если `source_url` найден — репозиторий клонируется, выбирается commit (если есть `org.opencontainers.image.revision`) и парсятся манифесты в репо.
4. Дальше зависимости дедуплицируются и отправляются в OSV.dev.
---
## Конфигурация
CVExplorer читает конфиг из файла **`cvexplorer_config.json`** в рабочей директории.
Если файла нет или он некорректный — используются значения по умолчанию.
### Пример `cvexplorer_config.json`
```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/статус/created
- `show_ports` — используемые порты
- `show_language` — ЯП
- `show_revision` — commit SHA
- `show_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
Установка:
```bash
pip install tqdm
```
---
## Troubleshooting
### Нет прав на Docker
Если ошибки про доступ к Docker socket — запусти от пользователя с доступом к Docker или настрой группу `docker`.
### В контейнере нет манифестов
Это нормально для «собранных» образов. Тогда нужен `source_url` в OCI labels.
Если `source_url` отсутствует — CVExplorer сможет показать только метаданные контейнера.
Ручное добавление ссылки на знакомые вам проекты через конфигурацию — **WIP**
---