On May 6, 2026, Vercel's Next.js maintainer Tim Neutkens
published GHSA-c4j6-fc7j-m34r, tracked as
CVE-2026-44578; Vercel followed on May 7 with
a coordinated
Next.js May 2026 security release
changelog covering 13 advisories total (12 disclosed May 6
plus the May 7 Turbopack incomplete-fix follow-up). The SSRF
itself is a pre-auth server-side request forgery
reachable via the WebSocket upgrade handler in
self-hosted Next.js applications using the
built-in Node.js server.
An unauthenticated attacker who can reach the Next.js origin can
cause it to proxy HTTP requests to arbitrary internal or external
destinations, including cloud instance metadata services (IMDS)
and any internal-only service reachable from the origin host.
The MITRE CVE record (published May 13, 2026) lists
CVSS 3.1 base 8.6 HIGH with vector
AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:L/A:N and weakness
class CWE-918. Affected versions: next >= 13.4.13 < 15.5.16
and >= 16.0.0 < 16.2.5. Vercel-hosted
deployments are explicitly not affected. Patch to
15.5.18 or 16.2.6, not the minimum 15.5.16 / 16.2.5
called out for this CVE specifically, so you also pick up the
May 7 follow-up advisory for the Turbopack-incomplete-fix issue
and the rest of the coordinated cluster.
Framing note: this bulletin is scoped to the WebSocket upgrade SSRF. The coordinated release covers 13 advisories total, including the May 7 follow-up, spanning middleware/proxy bypass, App Router segment-prefetch bypass, Pages Router i18n bypass, RSC cache poisoning, App Router CSP-nonce XSS, image-optimizer DoS, and a Cache Components connection-exhaustion DoS. Several of those are individually high-severity for the right deployment shape, but the SSRF is the one with the clearest "internal-network-pivot" blast radius for self-hosted operators, and is the bulletin trigger. The fix matrix below targets 15.5.18 / 16.2.6 because that is the version pair that covers the whole cluster; treat 15.5.16 / 16.2.5 as a hard minimum if you genuinely cannot move that one extra patch level.
1. Pre-auth: no credentials, no user interaction. An attacker only needs network reach to the Next.js origin server's HTTP listener.
2. The dangerous targets sit on the inside
of your perimeter: cloud metadata endpoints
(169.254.169.254 on AWS / GCP / Azure /
DigitalOcean / Oracle / Alibaba), internal admin panels,
Redis / Elasticsearch / databases bound to localhost or
private subnets, internal HTTP APIs without auth, and any
sidecar process listening on the same host. On most cloud
VMs, an SSRF that reaches IMDS is enough to steal IAM
credentials or workload-identity tokens unless the cloud's
metadata-service hardening is in place (the specific
control varies by provider, see the response steps).
3. Public PoCs already exist. A community PoC collection for the full May 6 Next.js cluster, including CVE-2026-44578, was published on GitHub within days of disclosure. Cloudflare's WAF changelog notes the disclosure was shared with minimal advance notice, leaving network-layer mitigation incomplete at the moment of release. There is no public confirmation of in-the-wild exploitation as of this bulletin's publication date, but the gap between disclosure and PoC availability is short and operator response should not wait on that confirmation.
Affected versions, fix matrix, and what is not affected
Priorities, by deployment
Triage on three axes: is the deployment self-hosted on the built-in Node.js server (versus Vercel, Netlify Functions, or a fully static export), is the Next.js origin reachable from untrusted networks (directly or via a permissive reverse proxy), and does the origin host have access to anything sensitive on the inside (cloud IMDS, internal admin services, database admin panels, sidecar processes).
| Priority | Deployment | Why |
|---|---|---|
| Highest | Self-hosted Next.js on a cloud VM (AWS, GCP, Azure, DigitalOcean, Oracle, Alibaba), reachable from the internet or any untrusted network, with the cloud's metadata service reachable from the origin and not hardened | This is the worst-case configuration. SSRF to 169.254.169.254 on most clouds returns IAM credentials, instance-role tokens, user-data scripts (frequently containing bootstrap secrets), and project metadata. Patch to 15.5.18 or 16.2.6 today. As an immediate interim, harden the metadata-service posture appropriately for the specific cloud (AWS IMDSv2 with hop-limit 1, GCP / Azure required-header verification with managed-identity scoping, DigitalOcean host-firewall block of 169.254.169.254, Oracle IMDSv2, Alibaba hardened mode). See the response steps below for the per-cloud commands; these are defense-in-depth and should be in place regardless of Next.js patch state. |
| Higher | Self-hosted Next.js behind a reverse proxy (nginx, HAProxy, Caddy, Traefik) that passes through WebSocket upgrades to the Next.js origin | The reverse proxy does not protect against this bug, because the vulnerable code path is the upgrade handler on the Next.js origin itself, downstream of the proxy. Patch the Next.js dependency. Until patched, configure the reverse proxy to drop or 403 unsolicited Upgrade: websocket requests if the application does not use WebSockets, or restrict Upgrade handling to known WebSocket paths. |
| Higher | Self-hosted Next.js in Kubernetes or a container platform where the pod has a service account, mounted secrets, or sidecar processes | SSRF from the Next.js pod can read the Kubernetes service-account token at /var/run/secrets/kubernetes.io/serviceaccount/token via the loopback or pod-IP path if any local HTTP shim is exposed, and can reach any in-cluster service the pod's network policy permits. Patch the Next.js image. Audit network policies and service-account token mounting on Next.js workloads. |
| Medium | Self-hosted Next.js on a bare-metal or on-prem host, internal-only, no cloud IMDS exposure | The IMDS pivot does not apply, but any internal HTTP service reachable from the host (Redis admin, internal dashboards, CI artifact servers, package registries with unauthenticated endpoints) is in scope. Patch on a normal cycle this week. Audit which internal services the Next.js host has network reach to and tighten egress where feasible. |
| Lower | Vercel-hosted Next.js deployments | Not affected per the vendor advisory. No action required for CVE-2026-44578 specifically. Continue to track the rest of the May 6 / May 7 cluster on the Vercel changelog; the middleware and proxy-bypass advisories affect Vercel-hosted deployments and are addressed at the platform level plus framework-version patch. |
| Lower | Netlify-hosted Next.js (Functions or Edge Functions only), no static-export Node origin | Not affected per Netlify's May 8 changelog. Netlify Functions and Edge Functions do not support WebSocket upgrades, so the vulnerable code path cannot be exercised. Other May 6 CVEs may still apply on Netlify; upgrade next to 15.5.18 or 16.2.6 to clear those. |
Prioritization above is this bulletin's framing, anchored to the GHSA's "self-hosted Node.js server" affected-configuration statement, Netlify's May 8 customer-facing changelog for the Netlify-not-affected determination, and the standard SSRF-to-IMDS-to-IAM pivot pattern that determines real-world blast radius on cloud VMs.
Am I affected?
Check your installed Next.js version
In each project that depends on next:
npm ls next # or pnpm why next # or yarn why next
A resolved version in the range >= 13.4.13 < 15.5.16
or >= 16.0.0 < 16.2.5 is affected if the
application is self-hosted on the built-in Node.js server
(next start or a custom server that wraps the
Next.js request handler). A resolved version < 13.4.13
pre-dates the vulnerable handler. Anything >= 15.5.16
on the 15.x line or >= 16.2.5 on the 16.x line
carries the CVE-specific fix; >= 15.5.18 or
>= 16.2.6 additionally carries the May 7
Turbopack follow-up.
Check how the app is hosted
If deployed via Vercel: the platform mitigates this CVE,
independent of dependency version. If deployed via Netlify
Functions or Edge Functions only: not affected for this CVE.
If deployed via Docker / Kubernetes / a VM running
next start or a custom Node server: affected,
patch the dependency.
Quick external-exposure inventory
For an inventory across an organization, the
Modat Magnify
external-attack-surface query technology="Next.js"
returns internet-reachable hosts whose response headers
identify Next.js. Treat this as a starting inventory, not a
vulnerability determination: the query does not distinguish
Vercel-hosted from self-hosted, does not return the framework
version, and will list patched instances alongside vulnerable
ones. For each host returned that you own, confirm the
hosting model and the resolved next version
against the patch matrix above before acting.
Response steps
If you self-host on the built-in Node.js server (Highest / Higher)
-
Upgrade the
nextdependency to 15.5.18 or 16.2.6. Not 15.5.16 / 16.2.5. The one-extra-patch jump costs nothing, clears the Turbopack-incomplete-fix follow-up, and avoids a second deploy when the rest of the May 6 / May 7 cluster lands in your next vulnerability scan.npm install next@15.5.18 # for 15.x lines npm install next@16.2.6 # for 16.x lines
Earlier minors of 15.x and 16.x will not be backported per Vercel and Netlify guidance; if you are on, e.g., 15.3.x or 16.1.x, the upgrade is to the patched minor, not a hotfix on your current minor. -
Rebuild and redeploy. Verify the resolved
version is the patched one by running
npm ls nextagainst the deployed artifact (in the container or on the host, not just in CI). Lockfile-resolution surprises are the most common reason a patched-in-package.json deploy is still actually vulnerable. -
Lock down cloud instance metadata. Independent
of the Next.js patch, harden the metadata-service posture on
every cloud VM that hosts a self-hosted Next.js origin. The
controls are cloud-specific, not interchangeable.
# AWS: enforce IMDSv2 (token-based) with PUT response hop-limit 1. # Hop-limit 1 prevents containers and reverse proxies from reaching # IMDS via an extra network hop. aws ec2 modify-instance-metadata-options \ --instance-id <id> \ --http-tokens required \ --http-put-response-hop-limit 1 \ --http-endpoint enabled # GCP: metadata requests already require Metadata-Flavor: Google. # An SSRF that doesn't set arbitrary headers cannot read GCE metadata. # Verify your application HTTP client cannot be coerced into setting # that header from a user-controlled value. Additionally, prefer # Workload Identity over instance service accounts where possible. # Azure: IMDS already requires Metadata: true header and only responds # on the link-local address 169.254.169.254. Same header-coercion # caveat as GCP applies. Prefer managed identities scoped to the # minimum required resources. # DigitalOcean: no header- or token-based protection on metadata. # Block 169.254.169.254 at the host firewall on droplets that do not # need it at runtime. iptables example, droplet-local: sudo iptables -I OUTPUT -d 169.254.169.254 -m owner ! --uid-owner root -j DROP # Oracle Cloud: enable IMDSv2 (HTTP-only token-based) per the # Instance Metadata Service v2 documentation and disable v1 fallback. # Alibaba Cloud: enable hardened mode (token required) on the ECS # Metadata Service via DescribeInstance / ModifyInstanceMetadataOptions.
These are defense-in-depth controls against this specific SSRF and against the broader class of pre-auth and post-auth SSRF that will keep appearing in web frameworks. Verify your chosen control with a synthetic SSRF probe (curl from the host against 169.254.169.254 with and without the required header / token) before considering the host hardened. -
If you cannot patch immediately, harden at the
reverse proxy. Per Vercel's own interim guidance:
if the application does not require WebSocket upgrades,
block them at the reverse proxy or load balancer. In nginx:
if ($http_upgrade != "") { return 403; }If WebSockets are required, restrictUpgradehandling to known WebSocket paths only, and reject upgrade requests on any other route. Strip internal headers (x-forwarded-forspoofing, internal-only auth headers) from untrusted traffic at the proxy. -
Restrict origin egress. The SSRF is only as
bad as what the Next.js origin host can reach. Cloud security
groups, host-level egress firewalls, and Kubernetes
NetworkPolicies can all be used to deny outbound to
169.254.0.0/16(IMDS), to known-internal subnets the Next.js origin has no business calling, and to arbitrary external destinations beyond the allowed list. This is good hygiene independent of this CVE; the CVE makes it acute. -
Treat any Next.js origin internet-exposed during the
disclosure-to-patch window as potentially probed.
No confirmed in-the-wild exploitation is public as of this
bulletin's publication, but PoCs are. Based on public PoC
behavior, review HTTP access logs on the origin and on the
upstream proxy for anomalous
Upgrade: websocketrequests, particularly those with absolute-form request lines pointing at internal addresses (e.g.GET http://169.254.169.254/...orGET http://10.x.x.x:...in the request line rather than a path), and for outbound requests from the origin host to the cloud metadata service, to internal admin services, or to unexpected external destinations during the window. These are heuristics derived from public PoC code, not vendor-confirmed signatures; absence of such evidence is not proof of safety, but presence is a strong signal worth investigating.
If you host on Vercel (Lower)
- No action required for CVE-2026-44578. The vendor advisory explicitly excludes Vercel-hosted deployments. The platform does not expose the vulnerable upgrade code path.
-
Still upgrade
nextfor the rest of the cluster. Several of the other May 6 advisories (middleware/proxy bypass, RSC cache poisoning, App Router CSP-nonce XSS) do affect Vercel-hosted apps and require an application-side framework upgrade. Target 15.5.18 or 16.2.6 here too.
The broader pattern
A few observations worth flagging in the context of this bulletin's series:
First, this is the second pre-auth SSRF in self-hosted Next.js
in less than a year. CVE-2025-57822, disclosed September 2025,
was an SSRF in Next.js middleware redirect handling when
next() was called without explicitly passing the
request object. The shape is different (that one required a
specific custom-middleware pattern), but the operational lesson
is identical: "self-hosted Next.js on the built-in
Node.js server" is a meaningfully different security posture
from Vercel-hosted, and the gap is widening as the
framework grows more features that the platform-side
compensates for and the self-hosted-side does not. Operators
who self-host should plan for "SSRF-class CVE in the request
pipeline" as a recurring threat-model entry, not a one-off,
and cloud metadata-service hardening (per the per-cloud
controls above) should be table stakes regardless of
framework patch state.
Second, May 2026 continues a noisy patch month for operators with diverse stacks: cPanel CVE-2026-41940 (April 28, exploited in the wild, ransomware payloads), Copy Fail CVE-2026-31431 (April 29, CISA KEV, WSL2 implications), DAEMON Tools supply-chain (May 5), PAN-OS CVE-2026-0300 (May 6, exploited in the wild), Ollama Bleeding Llama and Windows Auto-Update RCE (May 10), mistralai PyPI 2.4.6 compromise (May 12), and now the Next.js cluster. Triage ruthlessly; for shops with self-hosted Next.js exposed to the internet, this one belongs in the upper half of the list.
Third, "the platform protects you" is now a load-bearing assumption in modern JavaScript framework security. Vercel hosting handles this CVE because of how Vercel's request router gates upgrade handling, not because the framework code is different. Netlify Functions handle it by not supporting the code path at all. Operators choosing self-hosted Next.js for cost, sovereignty, or air-gap reasons inherit the security-engineering work that the platforms do silently for everyone else. That tradeoff is fine, but it should be a conscious one with corresponding investment in egress hardening, IMDS lockdown, and dependency-update SLAs.
At time of writing: no confirmed in-the-wild exploitation of CVE-2026-44578 specifically is public. PoC code exists in public repositories (the dwisiswant0 collection on GitHub covers the full May 6 / May 7 cluster). CISA had not added CVE-2026-44578 to the KEV catalog as of publication; the bulletin makes no prediction about whether or when that will change. The May 6 release also included CVE-2026-23870 (React Server Components DoS), CVE-2026-44579 (Cache Components connection-exhaustion DoS), CVE-2026-44574 / CVE-2026-44575 / CVE-2026-44573 (middleware and proxy bypasses), CVE-2026-44577 (image-optimizer DoS), CVE-2026-44580 / CVE-2026-44581 (XSS), CVE-2026-44576 / CVE-2026-44582 (RSC cache poisoning), and CVE-2026-44572 (cache-poisoned redirects); the May 7 follow-up (GHSA-26hh-7cqf-hhc6) addresses the Turbopack-incomplete-fix for the segment-prefetch middleware bypass. This bulletin does not address those individually, but the recommended upgrade target (15.5.18 / 16.2.6) clears all of them in one move. The Cloudflare WAF posture noted at disclosure (incomplete network-layer mitigation) may have improved since; check your CDN/WAF provider's own changelog for current Next.js cluster coverage before relying on a network-layer mitigation in lieu of patching.
If you self-host Next.js on the built-in Node.js server with
a next version between 13.4.13 and either
15.5.15 or 16.2.4: upgrade next to
15.5.18 or 16.2.6 (not the minimum 15.5.16 / 16.2.5), harden
your cloud's metadata-service posture (per-cloud commands in
the response steps), and if you cannot patch immediately,
drop or 403 unsolicited Upgrade: websocket
requests at your reverse proxy. Vercel-hosted and
Netlify-Functions-only deployments are not affected by this
CVE specifically, but should still upgrade next
to clear the rest of the May 6 / May 7 cluster.