关联漏洞
描述
CVE-2025-29927
介绍
### **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
文件快照
[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
备注
1. 建议优先通过来源进行访问。
2. 如果因为来源失效或无法访问,请发送邮箱到 f.jinxu#gmail.com 索取本地快照(把 # 换成 @)。
3. 神龙已为您对POC代码进行快照,为了长期维护,请考虑为本地POC付费,感谢您的支持。