Next.js Middleware 15.2.2 - Authorization Bypass
# Exploit Title: Next.js Middleware Bypass Vulnerability (CVE-2025-29927)
# Date: 2025-03-26
# Exploit Author: kOaDT
# Vendor Homepage: https://nextjs.org/
# Software Link: https://github.com/vercel/next.js
# Version: 13.0.0 - 13.5.8 / 14.0.0 - 14.2.24 / 15.0.0 - 15.2.2 / 11.1.4 - 12.3.4
# Tested on: Ubuntu 22.04.5 LTS
# CVE: CVE-2025-29927
# PoC: https://raw.githubusercontent.com/kOaDT/poc-cve-2025-29927/refs/heads/main/exploit.js
# POC GitHub Repository: https://github.com/kOaDT/poc-cve-2025-29927/tree/main Next.js Middleware Authorization Bypass (CVE-2025-29927) — Analysis, Impact, and Mitigations
Summary
In March 2025 a middleware authorization bypass affecting multiple Next.js releases was disclosed (tracked as CVE-2025-29927). The issue allowed certain requests to bypass middleware-based authorization checks in affected versions, potentially granting unauthenticated access to protected routes/resources when applications relied solely on Next.js middleware for access control.
Scope and Affected Releases
| Range | Affected? |
|---|---|
| 11.1.4 — 12.3.4 | Yes |
| 13.0.0 — 13.5.8 | Yes |
| 14.0.0 — 14.2.24 | Yes |
| 15.0.0 — 15.2.2 | Yes |
Vendor advisories and fixes were released — always consult the official Next.js release notes for your exact fixed version and upgrade path.
What the Vulnerability Means (High-Level)
- Next.js middleware is a common place to centralize access-control logic (redirecting unauthenticated users, rewriting requests, handling A/B tests, etc.).
- CVE-2025-29927 permitted certain requests to circumvent middleware logic under specific conditions in affected versions.
- If an application relied exclusively on middleware for authorization without server-side verification, attackers could gain unintended access to protected resources or sensitive APIs.
Root Cause (Conceptual)
The underlying problem was a logic/flow handling defect in how middleware execution and request rewriting/redirecting were resolved in specific runtime paths. In affected builds, certain request patterns could reach origin handlers while middleware-side authorization checks were not enforced, or middleware decisions were ignored under particular internal processing cases. This is a framework-level flaw rather than an application code bug.
Impact
- Unauthorized access to pages, API routes, or assets that an app protected only via middleware.
- Potential data exposure if sensitive endpoints relied solely on middleware checks.
- Risk increases for single-page apps or APIs that assume middleware is the authoritative gatekeeper.
Detection and Indicators of Compromise
- Look for unexpected successful requests to protected endpoints from unauthenticated sources in access logs.
- Monitoring: count requests that skip expected redirects (e.g., login redirects) or observe sudden changes in error/response codes for protected routes.
- Inspect middleware logs (if instrumented) for paths where authentication checks did not run or returned unexpected outcomes.
- Use internal telemetry to detect an increase in requests with missing/invalid session tokens that nevertheless succeed.
Immediate Mitigations (If You Cannot Patch Immediately)
- Enforce server-side authorization checks in origin handlers (API routes, getServerSideProps, server components). Middleware should be a convenience layer, not the sole enforcement layer.
- Harden sensitive APIs behind additional authentication checks (JWT verification, session lookup on the backend, short-lived tokens).
- Apply network-level protections: restrict access to internal services via network controls, API gateways, or WAF rules that block anomalous requests.
- Rotate secrets and tokens if you believe unauthorized access may have occurred.
- Monitor logs and increase alerting for suspicious access patterns to protected endpoints.
Patching and Long-Term Remediation
- Upgrade Next.js to a vendor-supplied fixed version. Check the official Next.js security advisory and release notes for the precise patched release for your channel.
- After upgrading, verify that middleware behavior is correct via integration tests and request flow tests (see testing guidance below).
- Adopt defense-in-depth: require server-side verification of authentication/authorization for any sensitive operation.
Secure Middleware Pattern — Example
Below is a secure and framework-appropriate middleware pattern that demonstrates robust token verification and fallbacks to server-side checks. This example avoids relying solely on middleware for final authorization decisions and performs an explicit token verification using a well-known library.
import { NextResponse } from 'next/server'
import type { NextRequest } from 'next/server'
import { jwtVerify } from 'jose'
const PUBLIC_PATHS = ['/login', '/public', '/_next/static']
export async function middleware(req: NextRequest) {
const { pathname } = req.nextUrl
// Allow public/static assets through quickly
if (PUBLIC_PATHS.some(p => pathname.startsWith(p))) {
return NextResponse.next()
}
// Extract token from cookie or Authorization header as fallback
const sessionCookie = req.cookies.get('session')?.value
const authHeader = req.headers.get('authorization')
const token = sessionCookie ?? (authHeader?.startsWith('Bearer ') ? authHeader.slice(7) : undefined)
if (!token) {
// Not authenticated — redirect to login
const loginUrl = new URL('/login', req.url)
return NextResponse.redirect(loginUrl)
}
try {
// Verify JWT using a symmetric secret (HS256) or public key (RS256)
const secret = new TextEncoder().encode(process.env.JWT_SECRET || '')
await jwtVerify(token, secret)
// Token valid — allow request to proceed to origin
return NextResponse.next()
} catch (err) {
// Invalid token — redirect to login
const loginUrl = new URL('/login', req.url)
return NextResponse.redirect(loginUrl)
}
}Explanation:
- The middleware allows clearly public resources to bypass authentication checks quickly (performance consideration).
- It attempts to obtain an authentication token from a cookie first, then falls back to an Authorization header. Keep token locations consistent with your application security model.
- Token verification is explicitly performed with the jose library (a robust JWT library). If verification fails, the user is redirected to a login page.
- This middleware reduces the chance of accidental bypass by validating tokens early; however, it should be complemented by server-side checks for sensitive operations.
Server-Side Verification Example (API Route)
Always re-check credentials in your API endpoints or server functions. Below is an illustrative API route that mirrors the middleware validation to ensure end-to-end protection.
import type { NextApiRequest, NextApiResponse } from 'next'
import { jwtVerify } from 'jose'
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
const token = req.cookies.session || (req.headers.authorization?.startsWith('Bearer ') ? req.headers.authorization.slice(7) : undefined)
if (!token) {
return res.status(401).json({ error: 'Unauthorized' })
}
try {
const secret = new TextEncoder().encode(process.env.JWT_SECRET || '')
await jwtVerify(token, secret)
// Continue with the protected operation
res.status(200).json({ data: 'protected data' })
} catch (err) {
res.status(401).json({ error: 'Invalid token' })
}
}Explanation:
- This API handler performs an independent token verification before returning sensitive data.
- Even if middleware fails, this server-side check prevents unauthorized access to the API.
Testing Guidance
- Automated tests: add integration tests that simulate unauthenticated requests to protected routes and verify redirects or 401 responses.
- Edge-case tests: test unusual request patterns, alternate header arrangements, and requests that include both cookies and headers with conflicting tokens.
- Regression tests: include scenarios that previously would have bypassed middleware to verify that the patched runtime (or your mitigations) enforce expected paths.
Operational Steps Checklist
- Inventory: identify all applications using affected Next.js releases.
- Prioritize: rank apps by sensitivity of data and external exposure.
- Upgrade: follow vendor guidance and upgrade to patched Next.js releases as soon as possible.
- Compensating controls: add server-side auth, WAF rules, and network restrictions while scheduling upgrades.
- Audit & rotate: review logs for suspicious access and rotate secrets if compromise is suspected.
Expert Recommendations
- Do not rely solely on edge or middleware layers for authorization of critical resources; treat middleware as a routing/UX gate and perform final authorization at origin.
- Keep sensitive tokens and secrets out of client-side storage when possible; prefer httpOnly cookies with secure attributes and short lifetimes.
- Instrument middleware with structured logging and tracing so you can rapidly detect deviations in request flows.
- Subscribe to Next.js security advisories and include dependency scanning in your CI pipeline to catch such vulnerable releases proactively.
References & Where to Get More Information
- Consult the official Next.js release notes and security advisories for the authoritative patch and upgrade guidance.
- Run dependency scanners (Snyk, Dependabot, OSS security tools) to flag vulnerable Next.js versions in your projects.