Share
## https://sploitus.com/exploit?id=B032E4A9-D710-53A6-A3F5-D1BF8492CE6F
### **CVE-2025-29927 — Уязвимость обхода авторизации в Next.js**
#### **🔍 Описание**
**CVE-2025-29927** — критическая уязвимость в Next.js, позволяющая злоумышленникам обходить проверки авторизации, реализованные через **Middleware**. Уязвимость возникает из-за некорректной обработки заголовка `x-middleware-subrequest`, что приводит к полному или частичному игнорированию middleware-функций.

#### **📌 Условия эксплуатации**
- Сервер использует Next.js **v11.1.4 – v15.2.2**.
- В проекте задействован **Middleware** (файл `middleware.js`/`middleware.ts` или `_middleware.js`/`_middleware.ts` в старых версиях).
- Middleware применяется для:
- Контроля доступа (авторизация/аутентификация).
- Перенаправления запросов (например, локализация).
---
### **⚡ Сценарии атак**
#### **1. Обход авторизации**
**Как работает?**
Если Middleware проверяет права доступа к `/admin`, атакующий может отправить запрос с заголовком:
```http
'X-Middleware-Subrequest': 'src/middleware:src/middleware:src/middleware:src/middleware:src/middleware'
```
**Результат**:
- Next.js пропускает выполнение Middleware.
- Защищенный маршрут обрабатывается **без проверки прав**.
#### **2. Отказ в обслуживании (DoS) через кеш-отравление**
**Как работает?**
Если Middleware перенаправляет пользователей (например, с `/` на `/en`), атакующий может:
1. Обойти перенаправление, отправив запрос с `x-middleware-subrequest`.
2. Получить ответ **404/500** (если корневой маршрут `/` не обработан).
3. Если ответ кешируется CDN, все пользователи начнут получать ошибки.
---
### **🔧 Технические детали**
Уязвимость возникает в коде Next.js при обработке заголовка `x-middleware-subrequest`:
```javascript
const subreq = params.request.headers['x-middleware-subrequest']; // [1]
const subrequests = typeof subreq === 'string' ? subreq.split(':') : []; // [2]
const depth = subrequests.reduce((acc, curr) => (curr === params.name ? acc + 1 : acc), 0); // [3]
if (depth >= MAX_RECURSION_DEPTH) { // [4]
return { response: NextResponse.next() }; // Пропуск Middleware!
}
```
**Что происходит?**
1. Заголовок извлекается из запроса.
2. Разбивается по символу `:`.
3. Если значение повторяется **≥5 раз** (например, `middleware:middleware:...`), Next.js **пропускает Middleware**.
---
### **🛡️ Способы защиты**
#### **1. Обновление Next.js**
Установите одну из исправленных версий:
- **Next.js 15.2.3+**
- **Next.js 14.2.25+**
#### **2. Блокировка заголовка на уровне сервера**
- **Nginx**:
```nginx
proxy_set_header x-middleware-subrequest "";
```
- **Apache (`.htaccess`)**:
```apache
<IfModule mod_headers.c>
RequestHeader unset x-middleware-subrequest
</IfModule>
```
- **Express.js**:
```javascript
app.use((req, res, next) => {
delete req.headers['x-middleware-subrequest'];
next();
});
```
#### **3. Использование WAF**
Настройте правила для блокировки запросов с `x-middleware-subrequest`.
---
### **📌 Пример эксплуатации**
**Исходные условия**:
- Next.js v14.2.24.
- Middleware проверяет доступ к `/admin`.
- Для теста можно взять представленное приложение
- Запуск приложения:
```bash
yarn
yarn bev
```
**Шаги атаки**:
1. Запускаем наш прокси:
```bash
python exploit.py
```
Наш заголовок будет автоматически подставляться.
2. Переходим на localhost:8080/admin
Видим страницу админки.
Репозиторий создан в образовательных целях.
### **ℹ️ Дополнительная информация**
Тестовое приложение было взято у https://github.com/yugo-eliatrope