Мы выпустили Nuxt 4.5.1 и Nuxt 3.21.10 — патчи безопасности для веток 4.x и 3.x. Мы рекомендуем обновиться прямо сейчас:
Обновление вашего lock-файла также подтянет @nuxt/devtools@3.3.1, который исправляет отдельную критическую проблему, затрагивающую только среду разработки, поэтому убедитесь, что он тоже обновился.
Если вы по какой-то причине не можете обновиться до исправленных версий (например, вы привязаны к более старой ветке выпуска), Socket предоставил
которые можно применить в разных ветках выпуска в качестве временной меры. Обновление остается рекомендуемым способом исправления.
Если вы уже обновились из-за предыдущего уведомления о правилах маршрутизации (
), вам все равно нужен этот выпуск. Одна из проблем ниже является регрессией, внесенной именно тем исправлением, поэтому наличие версии 4.4.7+ или 3.21.7+ не гарантирует безопасность.
🔍 Что исправлено
В уведомлениях, ссылки на которые приведены ниже, содержится полная информация. Вкратце, с примечанием о том, затронуты ли вы:
Удаленное выполнение кода на стороне сервера через пропсы серверных островов (Высокий уровень)
GHSA-9473-5f9j-94wq
Вы затронуты только в том случае, если включили vue.runtimeCompiler (который по умолчанию выключен) и используете серверные компоненты или острова, чьи пропсы могут достигать динамического разрешения компонентов Vue: <component :is>, resolveDynamicComponent, h() или полиморфный проп as / asChild, например, тот, который @nuxt/ui предоставляет через reka-ui. В такой конфигурации злоумышленник может внедрить ключ шаблона в пропсы острова и заставить компилятор времени выполнения Vue выполнить произвольный код в серверном процессе (Nitro). Поскольку vue.runtimeCompiler по умолчанию выключен, большинство приложений не затронуты, но там, где соблюдены предварительные условия, воздействие заключается в полном удаленном выполнении кода на стороне сервера.
GHSA-48hr-524c-v5w3
Это тесно связано с предыдущим, но не требует vue.runtimeCompiler, поэтому затрагивает больше конфигураций. Если серверный остров передает необъявленный проп в полиморфный корень as (тот же паттерн @nuxt/ui / reka-ui, включая неявную передачу через атрибуты Vue), злоумышленник может передать простую строку, такую как { "as": "iframe" }, или имя глобально зарегистрированного компонента, чтобы создать произвольный HTML-элемент или компонент. Это не позволяет выполнять код. Объявление пропсов, которые принимает ваш остров, или установка inheritAttrs: false также предотвращают это.
Обход авторизации правил маршрутизации (Высокий уровень)
GHSA-hxvh-4h3w-prp9
Вы затронуты, если полагаетесь на routeRules с appMiddleware в качестве шлюза авторизации, и любой ключ правила содержит заглавную букву, будь то производное от файла страницы, например pages/Admin.vue, или явно написанное как routeRules: { '/Admin': ... }. Маршрутизация без учета регистра (по умолчанию) отображала страницу, в то время как правило и его промежуточное ПО молча пропускались. Это та самая регрессия, упомянутая выше.
Правила маршрутизации теперь сопоставляются без учета регистра, как это делает vue-router по умолчанию. Если вы намеренно полагались на сопоставление правил маршрутизации с учетом регистра, установите router.options.sensitive: true.
Отказ в обслуживании серверного компонента (Высокий уровень)
GHSA-hxcr-hm88-mpq6 и GHSA-9pgf-384g-p7mv
Вы затронуты, если ваше приложение использует серверные компоненты или острова (эндпоинт /__nuxt_island). Неаутентифицированный запрос может привести к сбою сервера из-за расширения v-for по пропу или к пустой трате ресурсов процессора на парсинг и хеширование чрезмерно большого тела запроса до того, как он будет отклонен.
Раскрытие полезной нагрузки между пользователями на кэшированных страницах (Высокий уровень)
GHSA-wm8w-6qjm-cv43, только для 4.x (>= 4.4.0; ветка 3.x не затронута)
Вы затронуты, если используете правила маршрутизации cache, swr или isr на аутентифицированных страницах, которые отображают специфичные для пользователя данные. Кэшированный _payload.json мог быть передан другому пользователю или неаутентифицированному посетителю, даже если HTML был правильно изменен.
После обновления очистите любой CDN или edge-кэш, который может уже содержать скомпрометированный _payload.json. Некорректный ответ может быть уже кэширован выше по цепочке, и одно лишь обновление не удалит его.
Раскрытие пути сервера разработки (Низкий уровень)
GHSA-7c4v-fwgw-9rf7
Вы затронуты только в том случае, если запускаете сервер разработки, привязанный к сетевому интерфейсу (nuxi dev --host), в ненадежной сети. Эндпоинт рабочей области Chrome DevTools раскрывал абсолютный путь к проекту и UUID рабочей области клиенту в локальной сети.
Удаленное выполнение кода в Nuxt DevTools (Критический уровень, только для разработки)
GHSA-279x-mwfv-vcqv, исправлено в @nuxt/devtools@3.3.1
Вы затронуты, если запускаете nuxt dev с включенными DevTools. Неаутентифицированный RPC-метод, открытый через сокет Vite HMR, мог выполнить произвольную команду на вашем компьютере, доступную из другого процесса на вашем хосте, узла локальной сети при использовании --host или вредоносного сайта, который вы посещаете во время работы сервера разработки. Это никогда не затрагивает продакшн, но, пожалуйста, убедитесь, что ваш lock-файл получил новую версию.
💚 Спасибо
Огромное спасибо исследователям, которые ответственно сообщили об этих проблемах: Pig-Tail, sec-reex, DavidCarliez, manop55555, dinhvaren, quantumshiro, Saku0512 и TazmiDev.
Эти отчеты поступили через процесс частного уведомления GitHub, один из них дошел до нас через программу Vercel OSS Bug Bounty на HackerOne. Что касается удаленного выполнения кода на стороне сервера, мы также работали с командами Vercel, Netlify и Cloudflare, чтобы предоставить предварительное уведомление, чтобы они могли принять меры защиты до этого раскрытия.
Если вы считаете, что обнаружили уязвимость в Nuxt, пожалуйста, сообщите о ней в частном порядке через вкладку Security в соответствующем репозитории или напишите на security@nuxtjs.org, если это невозможно. Мы очень ценим ответственное раскрытие информации.
