TGViewer
InfoSec VK Hub InfoSec VK Hub @vk_security · 3.13K subscribers
Post #145 6.05K
Новые CVE: что можно найти в Next.js

Разбираем вместе с Андреем Матвеенко из команды AppSec (ВКонтакте) и автором канала Blue (h/c)at Café нашумевшую и легкоэксплуатируемую уязвимость в Next.js.

Недавно в команде мы столкнулись с интересной ситуацией, связанной с неожиданным поведением механизма кеширования в Next.js. Это натолкнуло на мысль, что при определённых условиях можно добиться некорректной обработки пользовательских данных, что открывает путь для нестандартных атак — отравление кеша или внедрение нежелательного содержимого. Мы начали изучать материалы из открытых источников, а также проверять все наши внутренние сервисы на наличие проблемы. Рассказываю здесь, что мы нашли, как это можно проэксплуатировать и как защититься.


Next.js использует два механизма для работы с данными: SSG (Static Site Generation) и SSR (Server-Side Rendering). SSG генерирует страницы на этапе сборки, которые потом кешируются CDN с использованием заголовков вроде Cache-Control: s-maxage=31536000, stale-while-revalidate.

В отличие от SSG, SSR динамически создает контент на основе запроса пользователя и предполагает строгий контроль за кешированием ( Cache-Control: private, no-cache, no-store, max-age=0, must-revalidate ).

🔹 Proof of Concept (PoC)

Уязвимость позволяет обмануть сервер, заставив его воспринимать SSR-запросы как SSG. Это достигается путем добавления параметра __nextDataReq и заголовка x-now-route-matches. Например, следующий запрос к уязвимому серверу изменяет правила кеширования:

GET /poc?__nextDataReq=1 HTTP/1.1
Host: localhost:8080
x-now-route-matches: 1
Cache-Control: s-maxage=1, stale-while-revalidate


После этого сервер начинает кешировать динамические данные, которые изначально не предназначались для кеша. Это может привести к отравлению кеша, когда пользователи начинают получать неверные данные. Более того, если сервер отражает данные из запроса, это открывает возможности для Stored XSS. Условный злоумышленник может отправить запрос с вредоносным кодом в заголовке, например:

GET /poc?__nextDataReq=1 HTTP/1.1
Host: localhost:8080
User-Agent: <img src=x onerror=alert('CVE-2024-46982')>
x-now-route-matches: 1


После выполнения такого запроса вредоносный код будет сохранен в кеше и сработает при каждом посещении страницы.
Ссылка на PoC — тут.

Последствия эксплуатации:

🔹 DoS (Denial of Service)
🔹 Stored XSS
🔹 Утечка данных

Рекомендации по защите

1️⃣ Обновление Next.js до версии ≥ 14.2.10* (UPD)

2️⃣ На уровне приложения или CDN удаляйте все заголовки, которые не были указаны в спеке:

delete req.headers['x-now-route-matches'];


3️⃣ Убедитесь, что сервер использует строгие правила кеширования для SSR:

res.setHeader('Cache-Control', 'private, no-cache, no-store, max-age=0, must-revalidate');


VK Security

#appsec #эксперты #cve #разбор
  • ❤ 16
  • 👍 12
  • 🤓 2
More from @vk_security
  1. Sep 22, 2026⚡️ Разыгрываем три билета на ZeroNights 29 сентября на VK AI Security Nights’26 говорим пр…
  2. Sep 18, 2026Ну что там с подкастом «Спасибо за репорт»? 👀 Есть новости. Даже несколько. Новый выпуск…
  3. Sep 17, 2026Петербург, снова к вам ⚡️⚡️ Год назад впервые привезли наш митап в северную столицу— говор…
  4. Sep 9, 2026⚡MAX теперь удобнее исследовать через Burp Suite Подготовили плагин для Burp Suite, которы…
  5. Aug 31, 2026⚡️Есть планы на 30 сентября? До ZeroNights остался месяц — хороший повод вспомнить, как эт…
  6. Aug 28, 2026Новый выпуск подкаста «Спасибо за репорт» уже в VK Видео! В выпуске обсудили: ⚡ зачем багх…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →