Goal Reached Thanks to every supporter — we hit 100%!

Goal: 1000 CNY · Raised: 1000 CNY

100.0%

CVE-2025-29927 PoC — Authorization Bypass in Next.js Middleware

Source
Associated Vulnerability
Title:Authorization Bypass in Next.js Middleware (CVE-2025-29927)
Description:Next.js is a React framework for building full-stack web applications. Starting in version 1.11.4 and prior to versions 12.3.5, 13.5.9, 14.2.25, and 15.2.3, it is possible to bypass authorization checks within a Next.js application, if the authorization check occurs in middleware. If patching to a safe version is infeasible, it is recommend that you prevent external user requests which contain the x-middleware-subrequest header from reaching your Next.js application. This vulnerability is fixed in 12.3.5, 13.5.9, 14.2.25, and 15.2.3.
Description
CVE-2025-29927
Readme
### **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
File Snapshot

[4.0K] /data/pocs/9d9c39a1e0b862aaa439f251b464f7ee4951f369 ├── [3.1K] exploit.py ├── [5.0K] README.md └── [4.0K] vuln_app ├── [ 118] next.config.mjs ├── [ 653] package.json ├── [4.0K] public │   └── [ 25K] favicon.ico ├── [4.0K] src │   ├── [4.0K] features │   │   └── [4.0K] login │   │   └── [3.3K] LoginForm.tsx │   ├── [1.5K] middleware.ts │   ├── [4.0K] pages │   │   ├── [6.8K] admin.tsx │   │   ├── [4.0K] api │   │   │   ├── [4.0K] auth │   │   │   │   └── [ 577] logout.ts │   │   │   └── [1.3K] login.ts │   │   ├── [1.2K] _app.tsx │   │   ├── [ 459] _document.tsx │   │   ├── [4.0K] fonts │   │   │   ├── [ 66K] GeistMonoVF.woff │   │   │   └── [ 65K] GeistVF.woff │   │   ├── [8.9K] index.tsx │   │   └── [ 673] login.tsx │   ├── [4.0K] styles │   │   ├── [ 608] globals.css │   │   └── [2.7K] Home.module.css │   ├── [4.0K] ui │   │   └── [2.1K] Layout.tsx │   └── [4.0K] utils │   └── [ 562] auth.ts ├── [ 492] tsconfig.json └── [ 38K] yarn.lock 12 directories, 22 files
Shenlong Bot has cached this for you
Remarks
    1. It is advised to access via the original source first.
    2. Local POC snapshots are reserved for subscribers — if the original source is unavailable, the local mirror is part of the paid plan.
    3. Mirroring, verifying, and maintaining this POC archive takes ongoing effort, so local snapshots are a paid feature. Your subscription keeps the archive online — thank you for the support. View subscription plans →