
Доказательство концепции эксплуатации CVE-2025-29927 — обход авторизации в промежуточном ПО Next.js. Включает уязвимую тестовую лабораторию и Python-скрипт для проверки обхода путём отправки специально сформированных заголовков x-middleware-subrequest.
Небольшой GitHub-проект для проверки CVE-2025-29927 (обход авторизации в Next.js Middleware) на локальном учебном полигоне (VMware: Ubuntu-цель + Kali-атакующий).
⚠️ Дисклеймер: Проект предназначен исключительно для образовательных целей, CTF и полигонов, которыми вы владеете или на которые у вас есть явное разрешение. Запрещено использовать против любых систем без авторизации. Ответственность за последствия неправомерного использования лежит на пользователе.
| Параметр | Значение |
|---|---|
| CVE | CVE-2025-29927 |
| Дата публикации | 2025-03-25 (официальный бюллетень безопасности Next.js) |
| Затронутый компонент | Vercel Next.js (полнофункциональный Node.js фреймворк) |
| Тип уязвимости | Обход авторизации / Improper Authorization (CWE-863) |
| Затронутые версии | < 12.3.5, < 13.5.9, < 14.2.25, < 15.2.3 |
| Исправленные версии | 12.3.5 / 13.5.9 / 14.2.25 / 15.2.3 и выше |
| Уровень опасности | Critical / Высокий (точный балл см. на странице NVD) |
После появления уязвимости в большом количестве производственных сред были обойдены админ-панели, платёжные колбэки и внутренние API. Модули обнаружения включены в Metasploit и ProjectDiscovery Nuclei — это одна из самых показательных «фреймворковых» уязвимостей обхода авторизации 2025 года.
Next.js позволяет размещать «логику аутентификации» в middleware (промежуточном ПО), например:
export function middleware(request) {
if (!isLogin(request)) return NextResponse.redirect("/login"); // Не авторизован → блокируем
return NextResponse.next();
}
Проблема в том, что Next.js внутренне полагается на заголовок запроса, который клиент может подделать, чтобы определить, «выполнялось ли уже middleware для этого запроса»:
x-middleware-subrequest: middleware
В затронутых версиях, если внешний запрос содержит этот внутренний заголовок, Next.js ошибочно считает, что middleware уже отработало, и вся аутентифицирующая middleware пропускается. Атакующему не нужна учётная запись — достаточно добавить этот заголовок к запросу на /admin или другой защищённый маршрут, чтобы получить ответ 200 напрямую. При этом сама страница обычно доверяет middleware и не выполняет повторную проверку — проверка авторизации полностью теряет силу (ошибка границ доверия).
💡 Наиболее универсальное значение, используемое в публичных эксплойтах, — это повторяющаяся конкатенация пути middleware, например
middleware:middleware:middleware:middleware:middleware; одиночное значениеmiddlewareне срабатывает в некоторых версиях/структурах каталогов (проверено на 14.2.24 в этом полигоне). Данный PoC перебирает несколько значений-кандидатов; успех при любом из них означает обход.
CVE-2025-29927-PoC/
├── README.md # Этот документ (описание уязвимости + руководство по полигону VMware)
├── LICENSE # MIT
├── .gitignore
├── exploit.py # ★ PoC на Python3 только со стандартной библиотекой (запуск на Kali/любой машине)
├── target/ # ★ Самодельный уязвимый полигон (скопировать на Ubuntu-цель)
│ ├── package.json # Фиксация [email protected] (затронутая версия)
│ ├── middleware.js # Имитация реального производственного «аутентифицирующего middleware»
│ ├── pages/
│ │ ├── index.js # Главная страница
│ │ ├── login.js # Страница входа (демонстрация перенаправления сюда)
│ │ └── admin.js # ★ Защищённая админ-панель, на сервере читает flag.txt
│ ├── flag.txt # Флаг полигона: FLAG{...}
│ ├── setup.sh # Одношаговая установка Node 20 + npm install + build на цели
│ └── start.sh # Запуск в production-режиме, прослушивание 0.0.0.0:3000
└── tests/
└── mock_target.py # Имитация цели без Node (только для разработки/самопроверки)
┌───────────────────────────────────────────────────────────┐
│ VMware Workstation Pro 17 (хост: Windows) │
│ Сеть: NAT (по умолчанию VMnet8), обе ВМ в одной подсети, │
│ пингуют друг друга │
│ │
│ ┌──────────────────┐ ┌─────────────────────┐ │
│ │ Цель Ubuntu 24.04 │ │ Атакующий Kali Linux│ │
│ │ │ http │ │ │
│ │ Node 20 + Next │◄───────│ python3 exploit.py │ │
│ │ 14.2.24 :3000 │ GET │ │ │
│ └──────────────────┘ └─────────────────────┘ │
│ IP: <TARGET_IP> IP: <ATTACKER_IP> │
└───────────────────────────────────────────────────────────┘
| Назначение | Образ/ПО | Рекомендуемая версия |
|---|---|---|
| ПО для виртуализации | VMware Workstation Pro 17 (бесплатно для личного использования) | 17.x |
| Образ цели | Ubuntu Server LTS ISO | 24.04.x |
| Атакующая машина | Kali Linux (официальный предустановленный образ VMware или установка с ISO) | 2025.x |
| (Опционально) | Хост: от 8 ГБ ОЗУ, от 50 ГБ диска | — |
Все следующие шаги выполняются на Ubuntu-цели.
# Способ A: запушить проект в свой GitHub и склонировать (рекомендуется; используйте этот способ, если планируете публиковать на GitHub)
git clone https://github.com/<ваш_username>/CVE-2025-29927-PoC.git
cd CVE-2025-29927-PoC
# Способ B: скопировать с хоста по scp
# scp -r CVE-2025-29927-PoC ubuntu@<TARGET_IP>:~/
cd CVE-2025-29927-PoC/target
sudo bash setup.sh # Установка Node 20(LTS) + npm install + next build
Что делает setup.sh: обновление apt → установка curl/CA/инструментов сборки → установка Node.js 20 LTS через NodeSource → npm install (загрузка зависимостей, включая [email protected]) → npm run build.
bash start.sh
# Успех, если видно "▲ Next.js 14.2.24" и "Local: http://0.0.0.0:3000"
В отдельном терминале сначала выполните локальный смоук-тест: