Home Services About Blog FAQ Contact
← Back to blog

Ten security holes in Next.js — what your website actually needs.

On May 6, Vercel published ten security advisories for Next.js in a single day — four rated High severity. If your site runs on Next.js and nobody's job it is to keep it current, this is the post that explains why that's a problem.

Web frameworks ship security patches. That's not news. What's notable about the May 2026 Next.js release is the volume and variety: ten separate advisories published in 24 hours, spanning five distinct attack classes. Some of them — specifically the auth bypass issues — could expose pages you thought were protected. Others could take your site offline with no authentication required. None of them fix themselves.

What the ten advisories actually cover

The vulnerabilities cluster into five categories:

Authentication bypass (2 advisories, both High severity)

The most consequential findings. Two separate advisories — GHSA-267c-6grr-h53f and a follow-up fix, GHSA-26hh-7cqf-hhc6 — describe how attackers could craft segment-prefetch URLs that skip Next.js middleware entirely. If your App Router application uses middleware to enforce authorization (a common pattern), those checks weren't firing on certain request types. Protected content wasn't protected.

Denial of service (2 advisories, High and Moderate)

GHSA-mg66-mrh9-m8jx describes connection exhaustion via Cache Components under load. CVE-2026-23869 — the one I dug into fully — triggers excessive CPU usage by sending malformed requests to Server Component endpoints. No authentication, no credentials required. Anyone who knows your site runs Next.js can attempt it. CVSS score: 7.5.

Server-side request forgery (1 advisory, High)

GHSA-c4j6-fc7j-m34r affects applications using WebSocket upgrades. An attacker can coerce the server into making requests to internal resources or third-party systems it has no business talking to. Depending on what those internal systems are, the blast radius ranges from annoying to significant.

Cross-site scripting (2 advisories, Moderate)

Two separate XSS paths: one through CSP nonce handling in App Router (GHSA-ffhc-5mcf-pf4q), one through beforeInteractive scripts with untrusted input (GHSA-gx5p-jg67-6x7h). XSS is the kind of vulnerability that looks boring until someone uses it to hijack a logged-in session.

Cache poisoning (2 advisories, Moderate and Low)

Two advisories around cache layer collisions — situations where one user's response could bleed into another's. Lower severity, but the kind of bug that produces strange, hard-to-reproduce behavior before it gets actively exploited.

Patched versions — and the version trap

The two High-severity CVEs I verified have slightly different patch timelines. CVE-2026-23869 (DoS via Server Components) is patched in Next.js 15.5.15 and 16.2.3. CVE-2026-44575 (auth bypass) required a follow-up and is patched in 15.5.16 and 16.2.5.

There's an important constraint here: Vercel only patches current minor versions. If you're on Next.js 13.x, 14.x, or an older 15.x or 16.x minor that doesn't get patches, the fix is not coming to you — you have to upgrade to a supported minor first. For projects that haven't touched their dependencies in a year or two, that upgrade isn't always trivial.

Why self-hosted deployments bear more risk

If your site runs on Vercel's managed platform, Cloudflare Pages, or a similar edge network, the platforms can deploy WAF rules to mitigate some of these vulnerabilities at the network layer while you schedule the upgrade. That's not a complete fix, but it buys time.

Self-hosted Next.js — a VPS, a container stack, your own Linux box — doesn't get that buffer. The WAF rules don't apply. For app-layer vulnerabilities like auth bypass and DoS via Server Components, upgrading the framework is the only complete mitigation. And if nobody's watching for advisories, the upgrade doesn't happen on any particular schedule.

A website isn't a product you buy once. It's a system someone has to run.

This is the part of the conversation that rarely comes up in a web development proposal. The deliverable is a launched site. The ongoing work — watching advisories, testing upgrades, applying patches — doesn't produce anything visible. There's no milestone for it. The deliverable is "your site didn't get compromised this month," which is easy to skip until it isn't.

What to actually do

If you built the site yourself

Open your package.json and find the next dependency. If you're below 15.5.16 or 16.2.5, you're on an unpatched minor. Upgrade, run your test suite — or if you don't have one, smoke-test the critical paths manually before pushing to production. Pay attention to whether you use App Router with middleware-based authorization; if you do, the auth bypass fixes are the ones that matter most for your specific setup.

If someone else built the site

Ask two questions: What version of Next.js are we on? And who handles security patches — is that in scope for your relationship, or is it my responsibility? One of those questions usually produces a useful answer; the other often produces a silence that tells you just as much.

If you're about to hire someone to build it

Put maintenance in scope from the start. Not a vague "ongoing support" retainer, but a specific commitment: who watches for advisories, who tests and applies patches, what's the SLA when something like this drops. A site that doesn't get maintained is a site that accrues risk quietly until it doesn't.

Our web development projects include a maintenance scope by default. That's not a upsell — it's what "professional web development" means in practice. We run the same patch cycle for client projects that we do for our own infrastructure. If you're not sure whether your current setup has that covered, reach out. We'll give you a straight answer, even if the answer is "you're fine, here's why."

— Cole

Sources

Not sure who's keeping your website patched?

We can audit what you're running and tell you honestly whether your current setup has maintenance covered — or whether there's a gap worth closing.

Talk to us →