Share
## https://sploitus.com/exploit?id=093DA90D-CEF7-5F37-BA71-A6FE697E28E2
### **CVE-2025-29927 — Уязвимость обхода авторизации в Next.js**  


#### **🔍 Описание**  
**CVE-2025-29927** — критическая уязвимость в Next.js, позволяющая злоумышленникам обходить проверки авторизации, реализованные через **Middleware**. Уязвимость возникает из-за некорректной обработки заголовка `x-middleware-subrequest`, что приводит к полному или частичному игнорированию middleware-функций.  

![image](https://github.com/user-attachments/assets/344873ce-6b84-4c22-931f-f4fa7a502955)


#### **📌 Условия эксплуатации**  
- Сервер использует 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